2013-03-12 4 views
0

Когда я использую этот код, он возвращает каждую строку в таблице, и я понятия не имею, почему.Выберите оператор, игнорирующий параметры?

string SelectOleDb = "SELECT Top 1 * From `Employee Info` Where [Employee Name][email protected]" Order By ID DESC"; 

OleDbConnection OleDbCon = new OleDbConnection(EmployeeInfo.Properties.Settings.Default.cstrEmployeeInfoDatabase); 
OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter(); 
OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon); 
OleDbCom.Parameters.AddWithValue("@EmployeeName", employee_NameComboBox.Text); 
OleDbAdpt.SelectCommand = OleDbCom; 

DataSet FooDS = new DataSet(); 
OleDbCon.Open(); 
OleDbAdpt.Fill(FooDS); 
OleDbCon.Close(); 
OleDbCon.Dispose(); 
DataTable EmployeeInfo = FooDS.Tables[0]; 

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

UPDATE: Я также попытался удалить Именованный параметр «@EmployeeName» и ввести жесткое имя, окруженное одинарными кавычками. И все же оператор возвращает все, что в Сотрудника Информация

+0

Ваш идентификатор процитировать кажется немного шизофреник ... 'Сотрудник Info' использует кавычку и' Сотрудник name' использует скобки.По моему опыту, один или другой будет работать с данной СУБД, но я не знаю ни одной поддержки сразу. Какой тип СУБД вы используете? – cHao

+0

Вы запустили его в отладчике, чтобы убедиться, что значения есть? –

+0

Я не считаю, что OleDb поддерживает именованные параметры. Попробуйте использовать вопросительные знаки в вашей строке выбора вместо названных параметров. Не забудьте добавить параметры в том же порядке, что и в инструкции sql. –

ответ

1

Другие заявили, что OleDb требуется? и что он не принял Именованные параметры. Это неверно. Я исправил свой код, и он работает. Проблема заключалась в том, что в Заявлении были разные способы определения пробелов.

С соединением OleDB имя таблицы, если оно имело место, должно быть в EITHER (Ticks), или оба будут работать одинаково.

Путаницы начинаются, когда у вас есть имена столбцов с пробелами. Когда инструкция построена, все имена столбцов должны иметь _ (под счетом) вместо пространств имена столбцов. Хотя оба (Ticks) и являются необязательными для имен столбцов. Все, что НЕОБХОДИМО, является заменой «» (пробела) на _ (под балл)

Что добавляет в замешательство тот факт, что имя таблицы НЕОБХОДИМО иметь либо «(Ticks), либо если вы замените a "" (пробел) с _ (под балл) он не найдет таблицу.

Мой фиксированный код:

 string SelectOleDb = "SELECT Top 1 * From [Employee Info] Where Employee_Name= @EmployeeName Order By ID DESC"; 

     OleDbConnection OleDbCon = new OleDbConnection(EmployeeInfo.Properties.Settings.Default.cstrEmployeeInfoDatabase); 
     OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter(); 
     OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon); 
     OleDbCom.Parameters.AddWithValue("@EmployeeName", employee_NameComboBox.Text); 
     OleDbAdpt.SelectCommand = OleDbCom; 

      DataSet EmployeeInfoDS = new DataSet(); 
      OleDbCon.Open(); 
      OleDbAdpt.Fill(EmployeeInfoDS); 
      OleDbCon.Close(); 
      OleDbCon.Dispose(); 
      DataTable EmployeeInfoDT = EmployeeInfoDS.Tables[0]; 
3

Похоже, вы с помощью двух различных DataSet S:

DataSet FooDS = new DataSet(); // <-- FooDS? 
OleDbCon.Open(); 
OleDbAdpt.Fill(ExpediteDS); // <-- filing a different dataset? 
OleDbCon.Close(); 
OleDbCon.Dispose(); 
DataTable EmployeeInfo = FooDS.Tables[0]; // <-- not the dataset you just filled! 

Если это/ошибка пасты копии пожалуйста, напишите код точно, как у вас есть - если вы попытаетесь «приманить» ваш код, вы заставите людей преследовать кроликов, а не подвергать реальную проблему.

+0

Это, вероятно, просто опечатка, из которой OP пытался анонимизировать код. Мы скоро узнаем, наверное. :) – cHao

+0

Тогда ОП тратит время, показывая проблемы, которые на самом деле не там ... –

+0

cHao правильно Приложим – user2140261

0

As documented by MSDN:

Поставщик OLE DB .NET провайдер не поддерживает именованные параметры для передачи параметров оператора SQL или хранимой процедуры, называемой помощью OleDbCommand когда CommandType установлен в текст. В этом случае необходимо использовать знаковый знак вопроса (?) .

Я опробовал вариант вашего запроса и подключение OLEDB к SQL Server с помощью команды? и он работал, как ожидалось. Использование именованного параметра завершается с ошибкой.

В соответствии с просьбой, вот пример:

 string SelectOleDb = "SELECT Top 1 * From users Where [application_user_name]=? Order By application_user_id DESC"; 

     OleDbConnection OleDbCon = new OleDbConnection("Provider=SQLOLEDB;Data Source=SERVER\\INSTANCE;Initial Catalog=samples;Trusted_Connection=yes"); 

     OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter(); 
     OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon); 
     OleDbCom.Parameters.AddWithValue("@EmployeeName", "smith"); 
     OleDbAdpt.SelectCommand = OleDbCom; 

     DataSet ExpediteDS = new DataSet(); 

     DataSet FooDS = new DataSet(); 
     OleDbCon.Open(); 
     OleDbAdpt.Fill(ExpediteDS); 
     OleDbCon.Close(); 
     OleDbCon.Dispose(); 

важно отметить, что с OLEDB, вопросы порядка параметров. Вы должны добавить их в ParameterCollection в том порядке, в котором вы хотите, чтобы они ссылались в запросе.

+0

Не могли бы вы поделиться своим вариантом? Я попытался заменить имя с? и теперь он говорит: «Нет значения для одного или нескольких требуемых параметров». – user2140261

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