Delphi: «Объект параметра неправильно определен. Была предоставлена ​​непоследовательная или неполная информация». - PullRequest
7 голосов
/ 03 апреля 2009

Я пытаюсь вставить запись в таблицу в настройке 3-уровневой базы данных, и сервер среднего уровня генерирует указанное выше сообщение об ошибке как исключение OLE, когда он пытается добавить первый параметр в запрос.

Я погуглил эту ошибку, и я постоянно нахожу один и тот же результат: он вызван наличием двоеточия в строке где-то в вашем запросе, что указывает на синтаксический анализатор SQL ADO. Это не тот случай, здесь. Там нет ложных двоеточий. Я проверил и перепроверил определение объекта в соответствии со схемой таблицы, в которую я пытаюсь вставить. Все проверяется, и это ставит моих коллег в тупик. Кто-нибудь знает, что еще может быть причиной этого? Я нахожусь в конце моего ума здесь.

Я использую Delphi 2007 и SQL Server 2005.

Ответы [ 13 ]

4 голосов
/ 24 апреля 2009

Я могу получить эту ошибку, используя Delphi 2007 и MSSQL Server 2008, и я нашел обходной путь. (это довольно дурацкое ИМХО, но может быть полезно для вас, если ваша причина вызвана тем же).

код для выдачи ошибки:

with TADOQuery.Create(nil)
do try

   Connection := ADOConnection;

   SQL.Text := ' (SELECT * FROM Stock WHERE  InvCode = :InvCode ) '
              +' (SELECT * FROM Stock WHERE  InvCode = :InvCode ) ';

   Prepared := true;

   Parameters.ParamByName('InvCode').Value := 1;

   Open;  // <<<<< I get the "parameter object is...etc. error here.

 finally
   Free;
 end;

Я нашел два способа исправить это:

1) снять скобки с SQL, т.е.:

   SQL.Text := ' SELECT * FROM Stock WHERE  InvCode = :InvCode  '
              +' SELECT * FROM Stock WHERE  InvCode = :InvCode  ';

2) использовать два параметра вместо одного:

with TADOQuery.Create(nil)
do try

   Connection := ADOConnection;

   SQL.Text := ' (SELECT * FROM Stock WHERE  InvCode = :InvCode1 ) '
              +' (SELECT * FROM Stock WHERE  InvCode = :InvCode2 ) ';

   Prepared := true;

   Parameters.ParamByName('InvCode1').Value := 1;
   Parameters.ParamByName('InvCode2').Value := 1;

   Open;  // <<<<< no error now.

 finally
   Free;
end;
3 голосов
/ 13 апреля 2011

Я нашел эту тему во время поиска ранее упомянутого сообщения об исключении. В моем случае причиной была попытка встроить комментарий SQL / * foo * / в мой query.sql.text.

(я подумал, что было бы удобно увидеть, как комментарий проплывает мимо в моем окне профилировщика.)

Во всяком случае - Delphi7 ненавидел это.

2 голосов
/ 26 ноября 2009

Здесь поздний ответ. В моем случае это было что-то совершенно другое.

Я пытался добавить хранимую процедуру в базу данных.

Query.SQL.Text :=
'create procedure [dbo].[test]' + #13#10 +
'@param int ' + #13#10 +
'as' + #13#10 + 
'-- For the parameter you can pick two values:' + #13#10 + 
'-- 1: Value one' + #13#10 + 
'-- 2: Value two';

Когда я удалил двоеточие (:) это сработало. Как он видел двоеточие в качестве параметра.

1 голос
/ 30 июля 2015

Я только что столкнулся с этой ошибкой сам. Я использую Delphi 7 для записи в базу данных MS Access 2003 с помощью компонента TAdoQuery. (старый код) Мой запрос работал нормально непосредственно в MS Access, но в Delphi происходит сбой через объект TAdoQuery. Моя ошибка произошла из двоеточия (извинения за оригинальный постер) из значения даты / времени.

Насколько я понимаю, формат даты / времени в Jet SQL равен # мм / дд / гггг чч: nn: сс # (заполнение слева не требуется).

Если свойство TAdoQuery.ParamCheck имеет значение True, этот формат завершается ошибкой. (Спасибо, афиши!) Два обходных пути: а) установить ParamCheck в False или б) использовать другой формат даты / времени, а именно "мм / дд / гггг чч: nn: ss" (с двойными кавычками).

Я протестировал оба эти варианта, и они оба работали.

Даже несмотря на то, что формат даты / времени в двойных кавычках не является форматом даты / времени Jet, Access довольно гибок в использовании этих форматов даты и времени. Я также подозреваю, что это как-то связано с форматом даты / времени BDE / LocalSQL / Paradox (собственный движок SQL и движок базы данных Delphi 7) (используются двойные кавычки, как указано выше). Синтаксический анализатор, вероятно, предназначен для игнорирования строк в кавычках (двойные кавычки являются разделителем строковых значений в BDE LocalSQL), но может несколько наткнуться на другие не родные форматы даты / времени.

SQL Server использует одинарные кавычки для разделения строк, поэтому они могут работать вместо двойных кавычек при записи в таблицы SQL Server (не проверено). Или, может быть, объект Delphi TAdoQuery все равно оступится. Отключение ParamCheck в этом случае может быть единственным вариантом. Если вы планируете переключать значение свойства ParamCheck в коде, вы сэкономите некоторое время на обработку, гарантируя, что свойство SQL будет пустым до его включения, если вы не планируете анализировать текущий SQL.

1 голос
/ 30 марта 2011

Я столкнулся с той же ошибкой, которая описана в вашем вопросе. Я отследил ошибку в ADODB.pas -> procedure TParameters.AppendParameters; ParameterCollection.Append(Items[I].ParameterObject).
При использовании точек останова в моем случае ошибка была вызвана параметром, который должен заполнить поле DateTime в базе данных, и я никогда не заполнял этот параметр. установка параметра (). value: = '' разрешила проблему (я пробовал также с varnull, но есть проблема - вместо отправки Null в базу данных, запрос отправляет 1 - целочисленное значение varnull).

PS: я знаю, что ответ «поздно поздно поздно», но, возможно, кто-то достигнет той же ошибки.

0 голосов
/ 22 июня 2017

Я получил ту же ошибку. Оказалось, что это потому, что параметр хранимой процедуры был объявлен как varchar (max). Сделал это varchar (4000) и ошибка исчезла.

0 голосов
/ 22 сентября 2015

Вы можете получить эту ошибку при попытке использовать значение времени в SQL и забыть обернуть его с помощью QuotedStr ().

0 голосов
/ 03 ноября 2011

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

0 голосов
/ 13 апреля 2011

Я только что столкнулся с этой ошибкой сегодня на TADOQuery, который имеет ParamCheck := False и не имеет двоеточий в SQL.

Каким-то образом передача параметра OLECMDEXECOPT_DODEFAULT в TWebBrowser.ExecWB () вызывала у меня это:

Это показывает проблему:

pvaIn := EmptyParam;
pvaOut := EmptyParam;
TWebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT, pvaIn, pvaOut);

Это не показывает проблему:

pvaIn := EmptyParam;
pvaOut := EmptyParam;
TWebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DONTPROMPTUSER, pvaIn, pvaOut);
0 голосов
/ 31 марта 2011

У меня тоже была такая же проблема, но с динамической командой (например, оператором Update).
Некоторые параметры могут быть NULL.
Единственный способ заставить его работать, это установить параметр. DataType: = ftString и parameter.Size: = 1 и не устанавливая значение .

cmdUpdate := TADOCommand.Create(Self);
try
  cmdUpdate.Connection := '**Conections String**';
  cmdUpdate.CommandText := 'UPDATE xx SET yy = :Param1 WHERE zz = :Param2';
  cmdUpdate.Parameters.ParamByName('Param2').Value := WhereClause;
  if VarIsNull(SetValue) then
  begin
    cmdUpdate.Parameters.ParamByName('Param1').DataType := ftString;
    cmdUpdate.Parameters.ParamByName('Param1').Size := 1;
  end else cmdUpdate.Parameters.ParamByName('Param1').Value := SetValue;
  cmdUpdate.Execute;
finally
  cmdUpdate.Free;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...