2

ADOに対してパラメーター化されたクエリを使用しようとしています:

INSERT INTO Foo(Name、Value)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;

単純な代替案は次のようになります。

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

すでに行われています。しかし、パラメーター化されたクエリを実行可能なソリューションにしようとして数日を費やし、を書く必要がないようにQuotedStrWしようと思いました。

4

2 に答える 2

5

この-1値は、ADO パラメータのサイズに問題なく使用できます。

列に 2MB の文字列を挿入するこのサンプル コードを試してくださいValue

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 サーバーの列のデータ型定義に対応している必要があります。

于 2012-05-24T10:28:28.123 に答える