0

パラメータを介してストアド プロシージャに日付を指定する場合、日付に使用する形式について少し混乱します。元の VBA 構文では、ADO Connection オブジェクトを使用してストアド プロシージャを実行していました。

Set SentDetailRS = Me.ADOConnectionToIntegrity.Execute("dbo.s_SelectAggregatedSentDetailList '" & fCSQLDate(EffectiveDate) & "'", , adCmdText)

これは、日付構文を使用して問題なく動作しますyyyy-mm-ddが、別のユーザーがコードを実行すると、13 'Type Mismatch' というエラーが表示されます。

dd/mm/yyyyいくつかの実験の後、形式で日付を指定すると、ユーザーのこのエラーが修正されることがわかりましたが、今ではエラーが発生します!

パラメーターを持つコマンド オブジェクトを使用してストアド プロシージャを実行すると、日付の形式に関係なく機能します (ADO が舞台裏で形式を処理していると思います)。yyyy-mm-ddこの形式を使用すると、SQL Server で普遍的に機能すると思いましたか?

この問題がユーザー固有のように見える理由についても当惑していますか? SQL Server での私の既定の言語が「英語」であるのに対し、他のユーザーの既定の言語は「英国英語」であることに気付きました。これが問題の原因になる可能性はありますか?

Access 2003 および SQL Server 2000 で ADO 2.8 を使用しています。SQL Server ログインは Windows 統合セキュリティ経由です。

4

6 に答える 6

1

ADO が問題を処理しているとは思わないでください。Universal SQL の日付形式は 'YYYYMMDD' ですが、SQL と ACCESS はどちらも、日付を表示して文字列に変換する方法で、マシンの地域設定の影響を受けます。

日付の区切り文字は、Access では # ですが、SQL では ' であることを忘れないでください。

サーバーに指示を送信する前に、Access #MM-DD-YYYY# (または類似のもの) を体系的に 'YYYYMMDD' に変換することをお勧めします。次のような小さな関数を作成できます。

Public function SQLdateFormat(x_date) as string

SQLDateFormat = _
   trim(str(datePart("yyyy",x_date))) & _
   right(str(datePart("m",date)),2) & _
   right(str(datePart("d",date)),2)

   ''be carefull, you might get something like '2008 9 3'
SQLDateFormat = replace(functionSQLDateFormat," ","0")
   '' you will have the expected '20080903'

End function

INSERT/UPDATE 文字列をサーバーに送信する前にプログラムで作成しない場合は、すべてのマシンの地域設定を SQL をホストしているマシンの地域設定に変更することをお勧めします。また、SQL サーバーに特定の日付形式があるかどうかを確認する必要がある場合もあります (よくわかりません)。個人的には、この種のローカリゼーションの問題 (フランス語でカンマが小数点記号として使用されている場合にも発生します) または SQL 固有の文字の問題 (引用符または二重引用符が文字列に含まれている場合) を、SQL 命令をサーバーに送信する前に後退させることで解決しました。サーバ。

于 2008-09-17T13:56:58.113 に答える
0

申し訳ありませんが、mysqlはわかりませんが、オラクルでは、(地域の)日付形式の問題を回避するために、形式が期待されていた形式を常に明示的に記述します(例:'DD-MM-YYYY')。

于 2008-09-17T14:02:58.677 に答える
0

fCSQLDate 関数は文化固有のものだと思います。つまり、ユーザーのロケール設定に基づいて日付を解析します。だからこそ、あなたは問題を見るのです。

とにかく、連結された文字列でクエリを使用することは常に悪い考えです (インジェクション攻撃)。パラメータを使用すると、より良い結果が得られます。

于 2008-09-17T13:27:24.033 に答える
0

Access では、日付フィールドの区切り記号として # が使用されます。フォーマットは #mm/dd/yyyy# である必要があり、おそらく #mm-dd-yyyy# でも問題なく動作します。

于 2008-09-17T13:28:19.210 に答える
0

フォーマットを使用しない理由

dd mmm yyyy

解釈できる方法は1つだけです。

于 2008-09-17T23:13:40.240 に答える
0

Date() 関数を使用して、マシンの日付と時刻の設定に基づいて世界共通の日付を返すことができます。マシンの地域設定によって、クライアント側でどのようにフォーマットされるかが決まります。フィールドを厳密な DateTime フィールドのままにしておくと、明確な地域設定で日付をフォーマットできます。

サーバーに入ると、Date() 関数を使用しても機能するはずです (ユニバーサル日付値を返します)。

また、文字列フィールドに対する SQL インジェクション攻撃を回避するために、コマンド オブジェクトとパラメーターを渡すときにクエリでそれらを使用します。

于 2009-06-12T16:57:59.180 に答える