2

我正在尝试对 ADO 使用参数化查询

插入 Foo(名称,值)值(@name,@value)

在 SQL Server 中,Name列是一种varchar类型。该Value列是一个nvarchar(max).

当我不知道或想要指定大小时,我在创建参数时传递什么大小?

procedure SaveTheThing(Connection: TADOConnection);
var
   sql: WideString;
   cmd: _Command;
begin
   sql := 'INSERT INTO Foo (Name, Value) VALUES(@name, @value)';

   cmd := CoCommand.Create;
   cmd.Set_ActiveConnection(Connection.ConnectionObject);
   cmd.Set_CommandType(adCmdText);
   cmd.Set_CommandText(sql);

   //and now add the parameters
   cmd.Parameters.Append(
         cmd.CreateParameter('@name', adVarChar, adParamInput, -1, filename)
   );
   cmd.Parameters.Append(
         cmd.CreateParameter('@value', adVarWChar, adParamInput, -1, GetXmlToWideString)
   );

   cmd.Execute({out}recordsAffected, EmptyParam, adCmdSomeThatDoesntCauseAnExcetpion or adExecuteNoRecords);
end;

简单的替代方案将是:

sql := 'INSERT INTO Foo (Name, Value)'#13#10+
       'VALUES (+QuotedStr(filename)+', '+QuotedStrW(GetXmlToWideString)+')';

并且已经完成了。但我想我会花几天时间尝试使参数化查询成为可行的解决方案,并且避免编写QuotedStrW.

4

2 回答 2

5

您可以-1毫无问题地使用 ADO 参数大小中的值。

Value试试这个示例代码,它在列中插入一个 2MB 的字符串

var
   sql: WideString;
   cmd: _Command;
   recordsAffected : OleVariant;
begin
   sql := 'INSERT INTO Foo (Name, Value) VALUES(?, ?)';
   cmd := CoCommand.Create;
   cmd.Set_ActiveConnection(Connection.ConnectionObject);
   cmd.Set_CommandType(adCmdText);
   cmd.Set_CommandText(sql);

   //and now add the parameters
   cmd.Parameters.Append(cmd.CreateParameter('@name', adVarChar, adParamInput, -1, 'AfileName'));
   cmd.Parameters.Append(cmd.CreateParameter('@value', adVarWChar, adParamInput, -1, StringOfChar('#', 2*1024*1024)));
   cmd.Execute({out}recordsAffected, EmptyParam, adExecuteNoRecords);
end;
于 2012-05-23T18:34:00.733 回答
0

您可以在您的其他帖子中使用我的答案:

ADO 参数化查询出现“必须声明变量 @myvariable”错误

按名称使用参数和参数。尽量避免使用_Command,而是使用,TADOCommand因为它更友好(并且代码也更简单)。您可以使用以下方法将参数分配给值:

Parameters.ParamByName('xxxx').value := someValue. 

当然someValue数据类型必须与你的 SQL Server 列数据类型定义相对应。

于 2012-05-24T10:28:28.123 回答