0

MSSQL ストアド プロシージャに接続されているデータ モジュールに Tadocommand があります。テーブルの更新には、storedproc が使用されます。私のコードでは、Tclientdatasets の 1 つの beforeupdaterecord メソッドで、tadocommand を呼び出します。

まず、Tclientdataset の deltads.fieldbyname().newvalue を使用して、tadocommand パラメータに値を指定し、次に実行プロシージャを呼び出します。最初の更新では問題なく動作しますが、次の更新を行おうとすると、「varchar を datetime に変更する際のエラー」が発生します。

beforeupdaterecordメソッドでtadocommandを動的に作成した場合

sp1_editcontract:=Tadocommand.Create(nil);
sp1_editcontract.CommandType:=cmdStoredProc;
sp1_editcontract.Connection:=DMDBconn.DBConn;
sp1_editcontract.CommandText:='EditContract';
sp1_editcontract.Parameters.Refresh; 
//assign parameter values
sp1_editcontract.execute;
sp1_editcontract.free;

エラーなしで動作します。データモジュールで static Tadocommand を使用する場合、パラメータ値に問題があると思います。

動的に作成されたtadocommandではなく、静的に作成されたtadocommandを使用すると、複数の更新でエラーが発生するのはなぜですか?

4

2 に答える 2

0

私はあなたが を参照していて、 を参照しTDatasetProvider.BeforeUpdateRecordていないと仮定しますTClientDataSet.BeforeUpdateRecord

あなたが提供した情報から言うのはちょっと難しいです(ストアドプロシージャの引数のデータ型や順序を示していません)。エラー メッセージは SQL Server エンジンから来ています。パラメータに割り当てられている値が常に正しい順序で設定されていることを確認します。また、エラーの原因となっているパラメータを特定してください。クライアント コードで確実に再現できる場合は、SSMS でストアド プロシージャを呼び出し、クライアント アプリケーションでエラーの原因となっているのと同じ値を渡してみてください。

パラメータを特定したら、そのデータ型が ADO​​Command、DatasetProvider、および ClientDataset の間で一貫していることを確認できます。途中でタイプが変わる場合、それがエラーの原因である可能性があります。

最後の提案として、ハンドラーTDatasetProvider.Applied := Trueを終了する前に必ず設定してください。BeforeUpdateRecordこれにより、既に更新を適用した後で、データセット プロバイダーが動的 SQL を使用して更新を適用しようとするのを防ぎます。クライアント データセットのデータが TADOQuery によって取り込まれた場合、テーブルを直接更新しようとしている可能性があります。

于 2012-07-06T18:58:04.420 に答える