2011-02-02 1 views
2

редактировать Я должен отметить, что я пытаюсь сделать это с помощью Delphi 2006.Как сделать параметр ADO для обновления столбца datetime SQL Server?

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

У меня есть база данных 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 в образце кода?

+0

вы пробовали с помощью 'FindParam («dateAdded») AsDate: = Теперь, '? (Может быть AsDateTime, работающий из памяти здесь) –

+0

Этот подход вызывает 'EVariantInvalidOpError' с сообщением 'Invalid variant operation'. – wades

+0

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

ответ

3

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

FindParam('dateAdded').Value := Now; 
1

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

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

Это также вызывает «EVariantInvalidOpError» с сообщением «Неверная операция варианта». – wades

+0

Вы уверены, что существует метод «.Clear» TParameter? Я использую D2010 и не вижу его. –

+0

TParam в db.pas имеет как AsDateTime, так и Clear, TParameter в ADODB.pas нет. Имя ADOCommand1 предполагает, что это объект TADOCommand, который использует OP. –

1

Установите тип данных для параметра, это может сделать разницу в том, как обрабатывается параметры. Я также рекомендовал бы использовать ParamByName вместо FindParam. С ParamByName вы получаете исключение Param xx не найденное, если параметры не существуют в коллекции Parameters. FindParam возвращает nil, если он не найден. Мне никогда не приходилось использовать какие-либо варианты преобразования при назначении параметров для 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; 

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

  • Нет связанных вопросов^_^