2012-01-20 14 views
3

SQL Server 2008 R2データベースのdateTime列に日付をポストしようとしていますが、原因がわからない多くの問題が発生しました。SQL Server 2008 R2のDelphiの更新DateTime列

まず、このコードを使用しましたが、エラーが発生しました。文字列を日付に変換できません。

ADOOF.SQL.Text:='UPDATE OFTab SET CA='''+ CA.Text + ''', demandeClient=''' + DateTimeToStr(demandeClient.DateTime) + ''' WHERE ID='''+ ADOOF.FieldByName('ID') + ''''; 
ADOOF.ExecSQL; 

第二に、私は、パラメータを使用している:

ADOOF.SQL.Text:='UPDATE OFTab SET CA='''+ CA.Text + ''', demandeClient=:demande_client WHERE ID='''+ ADOOF.FieldByName('ID') + ''''; 
ADOOF.Parameters.ParamByName('demande_client').Value:= demandeClient.Date; 
ADOOF.ExecSQL; 

をしかし、私はエラーを得た:パラメータ(demande_client)が見つかりません。

私はこの問題をGoogleで検索し、私はparametresはこのようADOQueryを呼び出す前に作成されsouldというエンバカデロの提案が見つかりました:

ADOOF.SQL.Text:='UPDATE OFTab SET CA='''+ CA.Text + ''', demandeClient=:demande_client WHERE ID='''+ ADOOF.FieldByName('ID') + ''''; 
ADOOF.Parameters.ParseSQL(ADOOF.SQL.Text, True);  
ADOOF.Parameters.ParamByName('demande_client').Value:= demandeClient.Date; 
ADOOF.ExecSQL; 

細かく私は接続を削除は、セキュリティ情報が、常に同じ問題を持続します。 お願いします。

INFO:SQL Server用のMICROSOFT OLE DBプロバイダを使用しています。

+0

コンポーネントは必要ありませんが、未処理のSQL実行を希望する場合は、[私たちのオープンソースクラス](http://blog.synopse.info/post/2011/06)をご覧ください。/27/SynOleDB%3A-OpenSource-Unit-OleDB経由の任意のデータベースへのダイレクトアクセスのためのユニット)、ADO、DB.pasユニットなどへのドライバや依存性なしでSQL Serverの直接アクセス用に最適化されています)。それは 'Connection.ExecuteNoResult( 'UPDATE OFTAB SET CA = ?, demandeClient =?WHERE ID =?'、[CA.Text、demandeClient.DateTime、ADOOF.FieldByName( 'ID')])のような' TDateTime'パラメータを直接処理します。 。 –

答えて

5

はDateTimeToStrがFormatSettingsにせずにローカライズされたマシンの設定を使用して、データベースがちょうどまたはフォーマットを好まない場合がありますので、これは

FormatDateTime('YYYYMMDD hhmmss',demandeClient.DateTime) 

代わり

DateTimeToStr(demandeClient.DateTime) 

の使用します。 FormatDateTimeを使用するとあいまいさもなくなります:2003年1月2日ですが、2003年2月1日ですが、他の人には2003年2月1日、2001年2月1日はfebruari 3となります。 YYYYMMDDは普遍的です。 20030201は常にfebruari 2003の1番目です。

+0

私はローカルシステムやサーバーの日付形式を知らないので、日付の使用はしません。 –

+1

そのため、データベースに日付を入れるときには常にYYYYMMDD形式を使用する必要があります。これはISO標準です。ローカル設定が機能するかどうかを知る必要はありません。 –

+0

日付のみを使用する場合、FormatDateTime( 'YYYYMMDD'、TDate)も機能します。 –

2

DB(ドライバ)への接続方法によって異なります。
あなたは日付を使用していることを明示的に試すことができます。

ADOOF.Parameters.ParamByName('demande_client').DataType:= ftDateTime; 
ADOOF.Parameters.ParamByName('demande_client').AsDateTime:= demandeClient.Date; 
+1

+1特定の 'As ... 'メソッドを使用するときにDataTypeを設定する必要があるかどうかわかりません。 –

+0

必要はありません。 –

1
  1. 私は強くあなたは、SQL Server 2008 R2で作業しているとき、SQLネイティブクライアント11を使用することをお勧めします。新しいSQL Server 2008のデータ型(DATETIMEDATETIME2、およびDATETIMEOFFSETなど)は、SQL Server 2000 OLEDBプロバイダではサポートされていません。
  2. 2番目のコードサンプルが動作するはずです。 TADOQueryがあることを確認してください。 ParamCheck =真。あなたの最初の例では
+0

これは、サーバーにリモート接続するネットワークアプリケーションであるため、SQL Native Clientを使用できません。そのために私はSQL Server OLEDBプロバイダを使用しています。 –

+1

なぜできないのですか?SQLNCをインストールし、接続文字列で指定する必要があります。それは正しいでしょう... –

関連する問題