Как сделать параметр ADO для обновления столбца datetime SQL Server? - PullRequest
2 голосов
/ 02 февраля 2011

edit Я должен был упомянуть, что я пытаюсь сделать это с Delphi 2006.

ОК, я думаю, что я задал вопрос без предыдущих ответов.

У меня есть база данных SQL Server со столбцами типа datetime. Когда я пытаюсь вставить строку с параметризованной командой, я получаю

Exception class EOleException with message
'[Microsoft][ODBC SQL Server Driver]Optional feature not implemented'. 

Моя процедура вставки выглядит следующим образом:

procedure TForm1.btnZoomClick(Sender: TObject);
const
  InsCmd = 'insert into dbo.foo (added, edited, editor, narrative) ' +
           'values (:dateAdded, :dateEdited, :theEditor, :theNarrative);';
begin
  dmDbToy2.DataModule2.ADOCommand1.CommandText := InsCmd;
  with DataModule2.ADOCommand1.Parameters do
  begin
// the following line was an attempt to trick VarAsType into making a
// adDbTimeStamp: VarAsType is having none of it.
//    FindParam('dateAdded').Value := VarAsType(VarFromDateTime(Now), 135);
    FindParam('dateAdded').Value := VarFromDateTime(Now);
    FindParam('dateEdited').Value := Null;
    FindParam('theEditor').Value := 'wades';
    FindParam('theNarrative').Value := Null;
  end;
  DataModule2.ADOCommand1.Execute;
end;

Я нашел некоторые сообщения через google , которые, кажется, указывают, что SQL Server хочет тип adDbTimeStamp для обновления этих столбцов, но VarAsType не хочет делать его для меня.

Есть ли способ создать значение для параметров dateAdded и dateEdited в примере кода?

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

В ветке комментариев к исходному вопросу пользователь RRUZ сделал предложение, которое, как оказалось, решило проблему: проблема была с провайдером. А именно, я использовал OLEDB Provider for ODBC, а не OLEDB Provider for SQL Server. Смена провайдера в соответствии с предложением привела к исчезновению сообщения об ошибке 'Optional feature not implemented' и включению вставки для работы с простым назначением от TDateTime до TParameter.Value, таким образом:

FindParam('dateAdded').Value := Now;
1 голос
/ 03 февраля 2011

Установите тип данных для параметра, это может повлиять на обработку параметров.Я также рекомендовал бы использовать ParamByName вместо FindParam.С ParamByName вы получаете исключение Param xx not found, если параметры не существуют в коллекции Parameters.FindParam возвращает ноль, если он не найден.Мне никогда не приходилось использовать какие-либо варианты преобразования при назначении параметров для команды TADOCommand, поэтому подумайте, что вам также следует это удалить.

    with ParamByName('dateAdded') do
    begin
        DataType := ftDateTime;
        Value := Now;
    end;

    with ParamByName('dateEdited') do
    begin
        DataType := ftDateTime;
        Value := Null;
    end;

    with ParamByName('theEditor') do
    begin
        DataType := ftString; // or ftWideString if you use nchar/nvarchar
        Value := 'wades';
    end;

    with ParamByName('theNarrative') do
    begin
        //DataType := ftString // Don't  know datatype here
        Value := Null;
    end;
1 голос
/ 02 февраля 2011

Просто установите параметр в качестве даты и времени.Я делаю это все время в ADO и других соединительных слоях

DataModule2.ADOCommand1.Parameters.ParamByName('dateAdded').Value := Now();
//other code
DataModule2.ADOCommand1.Parameters.ParamByName('dateEdited').Value := Null;
//other code
DataModule2.AdoCommand1.Execute;
...