[Ошибка 1] SqlServer выдает сообщение об ошибке: необходимо объявить скалярные переменные OleDbException.
Сегодня я использую .net для работы с SqlServer с использованием Oledb, но он всегда необъяснимо сообщает: «Необходимо объявить скалярную переменную...». Я внедрил в код следующие два метода, но безрезультатно:
Способ 1: OleDbParameter[] p = новый OleDbParameter[] {
новый OleDbParameter("@aa",1),
новый OleDbParameter("@bb","shelley"),
новый OleDbParameter("@cc",DateTime.Now)
};
Objcmd.Parameters.AddRange(p);
Способ 2: OleDbParameter pp;
pp = новый OleDbParameter("@aa",OleDbType.Integer);
пп.Значение = 1;
Objcmd.Parameters.Add(pp);
pp = новый OleDbParameter("@bb", OleDbType.LongVarChar);
pp.Value = "Шелли";
Objcmd.Parameters.Add(pp);
pp = новый OleDbParameter("@cc", OleDbType.Date);
pp.Значение = ДатаВремя.Сейчас;
Objcmd.Parameters.Add(pp); Независимо от того, как вы это напишете, появится сообщение «Необходимо объявить скалярную переменную @aa». Последней причиной является следующее предложение: OleDbCommand Objcmd = new OleDbCommand("insert in test (a, b,c) значения(@aa,@bb,@cc)", Objconn);Правильное написание: OleDbCommand Objcmd = new OleDbCommand("вставить в тестовые (a,b,c)values(?,?,?)", Objconn); Этот путь прошел нормально. [Ошибка 2] Sybase выдает ошибку: Этот интерфейс не поддерживается (исключение происходит из HRESULT:0x80004002 (E_NOINTERFACE)).net использует Oledb для работы с Sybase, поскольку один и тот же параметр может использоваться несколько раз в операторе SQL. Код такой. следующее:
OleDbCommand Objcmd = new OleDbCommand("обновить набор тестов a=@aa, где a=@aa ", Objconn);
OleDbParameter[] p = новый OleDbParameter[] {
новый OleDbParameter("аа",1),
новый OleDbParameter("аа",1)
};
Objcmd.Parameters.AddRange(p);
Объект.Открыть();
Objcmd.ExecuteNonQuery();
Objconn.Close(); Приведенный выше код выдаст ошибку «Этот интерфейс не поддерживается (исключение происходит из HRESULT: 0x80004002 (E_NOINTERFACE)»). Причина проблемы в том, что в параметрах есть два одинаковых имени. В данном случае нужно написать только один параметр. Изменения следующие:
OleDbCommand Objcmd = new OleDbCommand("обновить набор тестов a=@aa, где a=@aa ", Objconn);
OleDbParameter[] p = новый OleDbParameter[] {
новый OleDbParameter("аа",1)
};или
OleDbCommand Objcmd = new OleDbCommand("обновить набор тестов a=@aa , где a=@aa2 ", Objconn);
OleDbParameter[] p = новый OleDbParameter[] {
новый OleDbParameter("аа",1),
новый OleDbParameter("aa2",1)
};【Подвести итог】
Если вы пишете программу, которой необходима поддержка SqlServer и Sybase, вам необходимо обратить особое внимание на этот момент:
1.SqlServer должен использовать "?" в качестве заполнителя параметра, что требует, чтобы даже при использовании одного и того же параметра параметр необходимо было добавлять несколько раз;
2. Если Sybase использует один и тот же параметр несколько раз, параметр нельзя добавить несколько раз, иначе будет выдано сообщение об ошибке;
http://www.cnblogs.com/shelley/archive/2010/05/25/1743438.html