2012-05-23 3 views
4

Я пытаюсь использовать параметризованные запросы с ADO. Выполнение Command объекта броски ошибка:«Должен объявить переменную @myvariable» ошибка с параметризованным запросом ADO

Must declare the variable '@filename'

я объявляю параметр @filename с помощью CreateParameter/Append:

sql := 'INSERT INTO Sqm(Filename, data) VALUES(@filename, @data)'; 

command := CoCommand.Create; 
command.Set_ActiveConnection(Connection.ConnectionObject); 
command.Set_CommandText(sql); 
command.Set_CommandType(adCmdText); 
command.Parameters.Append(Command.CreateParameter('@filename', adLongVarWChar, adParamInput, -1, Filename)); 
command.Parameters.Append(Command.CreateParameter('@data', adLongVarWChar, adParamInput, -1, xml); 

command.Execute({out}recordsAffected, EmptyParam, adCmdText or adExecuteNoRecords); 

Что я делаю не так?

+0

Попробуйте с помощью ':' вместо '@' перед Params в запросе. И удалите @, откуда вы добавляете параметры. –

+1

@MikaelEriksson: * Строка 1: Неправильный синтаксис рядом с:: * Вы были бы удивлены, я определенно был, что никто никогда не показывал пример запросов с параметрами ADO. (много можно найти с ADO.NET) –

+0

Похоже, вы используете интерфейсы ado непосредственно вместо tadocommand. Попробуйте с помощью '?' В запросе, где вы поместите имя переменной 'values ​​(?,?)'. Я пару часов от компьютера, поэтому я не могу проверить, что он будет работать. –

ответ

12

Насколько я знаю, ADO не поддерживает именованные параметры в SQL предложениях (SELECT, INSERT, UPDATE), так что вы должны использовать ? символ для обозначения параметра

sql := 'INSERT INTO Sqm(Filename, data) VALUES(?, ?)'; 

, а затем присвоить значения параметров в том же порядке, который используется в sql-предложении.

ADO 2.6 Внедрение свойства NamedParameters, но похоже, что он работает только с хранимыми процедурами.

+2

Ну, это точно объясняет, почему именованные параметры не работают в ADO. * oi vay Microsoft * –

2

попробовать это

uses ADODB, DB; 
... 
... 
... and then in some event handler (e.g. button click), 
var 
    aCommand :TADOCommand; 
begin 
    aCommand := TADOCommand.create(self); 
    aCommand.ConnectionString := 'build the connection string or use TADOConnection and assign to Connection property instead of ConnectionString property'; 
    aCommand.commandText := 'INSERT INTO Sqm(Filename, data) VALUES(:filename, :data);'; 
    aCommand.parameters.paramByName('filename').value := 'test'; 
    aCommand.parameters.paramByName('data').value := 'some data'; 
    aCommand.execute; 
    aCommand.free; 
end; 

Я использую параметр по именам этот путь TADOCommand и TADOQuery без проблем.

0

Используйте Parameters.AddWithValue, как показано ниже

connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Database Password=RainbowTrout;"; 
    InsertQry = "Insert into Sections(Name, PartNumber, VersionNumber, Channel, Address, Status, IPAddr) " 
     + "values(@SectionName, @PartNumber, @VersionNumber, @Channel, @Address, @Status, @IPAddr)"; 


    NewCfgConnection.ConnectionString = string.Format(connectionString, ConfigFN); 
    NewCfgCommand.Connection = NewCfgConnection; 
    NewCfgCommand.CommandText = InsertQry; 
    NewCfgConnection.Open(); 

    // Clear parameter values from last record 
    NewCfgCommand.Parameters.Clear(); 

    // Insert record into sections table - set parameters 
    NewCfgCommand.Parameters.AddWithValue("@SectionName", sSectionName); 
    NewCfgCommand.Parameters.AddWithValue("@PartNumber", sPartNumber); 
    NewCfgCommand.Parameters.AddWithValue("@VersionNumber", sVersionNumber); 
    NewCfgCommand.Parameters.AddWithValue("@Channel", iChannel); 
    NewCfgCommand.Parameters.AddWithValue("@Address", iAddress); 
    NewCfgCommand.Parameters.AddWithValue("@Status", iStatus); 
    NewCfgCommand.Parameters.AddWithValue("@IPAddr", iIP); 

    NewCfgCommand.ExecuteNonQuery(); 
Смежные вопросы