就ADO而言,nvarchar(max)有多大?

时间:2012-05-23 16:02:36

标签: delphi ado parameterized-query

我正在尝试使用a parameterized query against ADO

  

INSERT INTO Foo(名称,值)VALUES(@ name,@ value)

在SQL Server中,Name列是varchar类型。 Value列是nvarchar(max)

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

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)+')';

已经完成了。但是我想我已经烧了几天试图让参数化查询成为可行的解决方案,avoid having to write a QuotedStrW

2 个答案:

答案 0 :(得分:5)

您可以使用ADO参数大小的-1值而不会出现问题。

尝试使用此示例代码,该代码在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;

答案 1 :(得分:0)

您可以在另一篇文章中使用我的答案:

  

"Must declare the variable @myvariable" error with ADO parameterized query

按名称使用参数和参数。尽量避免使用_Command,但使用TADOCommand因为它更友好(并且编码也更简单)。您可以使用以下命令为参数赋值:

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

当然someValue数据类型必须与您的SQL服务器列数据类型定义相对应。