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

Ian*_*oyd 2 delphi ado parameterized-query

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

INSERT INTO Foo(名称,值)VALUES(@ 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;
Run Code Online (Sandbox Code Playgroud)

简单的替代方案是:

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

并且已经完成了.但我想我会烧几天试图使参数化查询成为一个可行的解决方案,并避免写一个QuotedStrW.

RRU*_*RUZ 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;
Run Code Online (Sandbox Code Playgroud)