2013-11-13 2 views
6

Я пытаюсь извлечь записи в свои данные gridview dgvEmployees из моей таблицы tblEmployees. Я не уверен, что случилось, возможно, из-за синтаксиса? Но код работал перед использованием MS Visual C# 2010 Express (только для WinForms). В настоящее время я создаю веб-страницу с winforms, используя MS Visual Studio (ASP.NET - C#). Вот мой код:C# Неверное имя объекта ASP.NET

SqlConnection sConn; 
    SqlDataAdapter daEmp; 
    DataSet dsEmp; 

    const string sStr = "Server = MYSERVER\\SQLEXPRESS; Database = EMPLOYEES; Integrated Security = SSPI"; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     sConn = new SqlConnection(sStr); 
     daEmp = new SqlDataAdapter("Select * from tblEmployees", sConn); 
     dsEmp = new DataSet(); 

     daEmp.Fill(dsEmp, "tblEmployees"); 

     dsEmp.Tables["tblEmployees"].PrimaryKey = new DataColumn[] { dsEmp.Tables["tblEmployees"].Columns["EmployeeID"] }; 

     dgvEmployees.DataSource = dsEmp.Tables["tblEmployees"]; 

    } 

Вот сообщение об ошибке на этой линии (daEmp.Fill(dsEmp, "tblEmployees");

Invalid object name 'tblEmployees' 

Пожалуйста, помогите. Благодаря!

+0

работы пользователя (например, идентификатор, заданный для пула приложений на веб-сайте), есть доступ к базе данных? –

+0

Невозможно ответить, не видя схему базы данных. Однако это возможности для изучения: 1) Хранится ли tblEmployees в схеме, отличной от «dbo»? 2) Если вы скопируете SQL в SQL Management express (или любой выполняемый запрос), есть ли у вас какие-либо проблемы? 3) Вы уверены, что подключаетесь к правильной базе данных? 4) Разве таблица базы данных не имеет множественности? –

+0

Правильная база данных, да.И когда я пытаюсь «INSERT INTO», он говорит ту же ошибку. Но я могу добавлять записи вручную, когда открываю таблицу ... – user2971155

ответ

2

Ошибка ссылается на SQL-запрос не DataSet. Другими словами, проблема не в C#. Вам нужно проверить строку подключения и убедиться, что таблица существует в БД.

daEmp = new SqlDataAdapter("Select * from tblEmployees", sConn);

Этот запрос плохо: Select * from tblEmployees

Вы можете проверить это, изменив запрос: Select * from IDONTEXIST

Вы увидите подобную ошибку:

invalid object name IDONTEXIST

2

Теперь вы запускаете приложение на веб-сайте, так что пользователь, который будет подключаться к SQL-серверу, будет запускать пул приложений в IIS, когда вы используете Integrated Security = SSPI в своей строке подключения.

Вам нужно либо:

  1. Дайте доступ к базе данных для пользователя пула приложений (не очень хорошая идея для установленного по умолчанию).
  2. Изменение пользователя пула подключений к пользователю, имеющему доступ к базе данных.
  3. Укажите пользователя, имеющего доступ к строке подключения.
+1

Спасибо, моя проблема в том, что я не предоставил «Начальный каталог» в строке подключения для запросов с кросс-базами. – stom

1

Вы должны сначала проверить строку соединения:

  • обеспечить его подключение к экземпляру SQL Server, вы думаете, что это.
  • Убедитесь, что он устанавливает контекст базы данных для подключения в базе данных, которую вы считаете.
  • Убедитесь, что он соединяется с полномочиями, которые, по вашему мнению, являются.
  • Убедитесь, что эти учетные данные соответствуют пользователю SQL Server.
  • То, что пользователь SQL Server имеет схему по умолчанию, которую, по вашему мнению, имеет и имеет соответствующие права, предоставленные в базе данных.

Почти наверняка, ваша проблема связана с одной или несколькими проблемами, перечисленными выше.

Если контекст вашей базы данных для подключения находится в другой базе данных, чем вы думаете, скорее всего, вы не найдете объектов, которые вы ищете.

Если ваши ссылки на объекты не соответствуют критериям схемы, может возникнуть проблема с разрешением ссылок на объекты. Ссылки на объекты в ваших SQL-запросах должны всегда, по крайней мере, быть квалифицированными по схеме. Вместо того чтобы сказать

select * from tblEmployees 

вы должны сказать

select * from dbo.tblEmployees 

где dbo это схема, которой принадлежит объект.Любые ссылки на объекты, которые не соответствуют критериям схемы, проверяются во время выполнения в следующем порядке.

  1. Сначала схема объекта по умолчанию для текущего пользователя проверяется на предмет требуемого имени.
  2. Если это не удается, схема dbo («владелец базы данных») исследуется для объекта с желаемым именем.

Для хранимых процедур, что поиск является более сложным:

  1. Probe текущего пользователя схема по умолчанию в текущей базе данных.
  2. Проверьте схему 'dbo' в текущей базе данных.

Если имя хранимой процедуры начинается с «sp_»,

  1. Probe текущего пользователя схема по умолчанию в базе данных «мастер».
  2. Проверьте схему 'dbo' в базе данных 'master'.

Если объект, о котором идет речь, относится к другой схеме, он не будет найден, если не будет квалифицирован по схеме владельца.

Из-за проблемы с множественным поиском отсутствие квалификации схемы может предотвратить кэширование плана выполнения, что означает, что план запроса должен быть перекомпилирован при каждом выполнении запроса. Излишне говорить, что это ... субоптимальное воздействие на производительность.

Кроме того, вы можете получить ... интересные ... результаты, если ваш пользователь базы данных является «dev» и соответствующий разработчик, спустя 6 месяцев назад, создал таблицу или другой объект с именем «dev.foo» во время разработки. Теперь вы живете в производстве и подключаетесь как пользовательский «dev». Выполнение select * from foo будет привязано к dev.foo вместо фактической производственной таблицы, созданной DBA, «dbo.foo». Ваши пользователи будут задаваться вопросом, почему их данные отсутствуют, или вы будете разорвать свои волосы, задаваясь вопросом, почему приложение скулит по поводу отсутствия столбцов, когда они, кажется, все там, когда вы смотрите на него через SQL Management Studio.

Смежные вопросы