33

C# Windows サービスから実行する次のインライン SQL があります。

UPDATE table_name SET 
    status_cd = '2', 
    sdate = CAST('03/28/2011 18:03:40' AS DATETIME), 
    bat_id = '33acff9b-e2b4-410e-baaf-417656e3c255', 
    cnt = 1, 
    attempt_date = CAST('03/28/2011 18:03:40' AS DATETIME) 
WHERE id = '1855'

アプリケーション内から SQL Server データベースに対してこれを実行すると、次のエラーが発生します。

System.Data.SqlClient.SqlException: varchar データ型を datetime データ型に変換すると、範囲外の値になりました。ステートメントは終了されました。

しかし、SQL の一部を取得して SQL Management Studio から実行すると、問題なく実行されます。

この問題を引き起こしている可能性のあるアイデアはありますか?

4

8 に答える 8

65

あいまいな日付形式は、ログインの言語に従って解釈されます。これは動作します

set dateformat mdy

select CAST('03/28/2011 18:03:40' AS DATETIME)

これはしません

set dateformat dmy

select CAST('03/28/2011 18:03:40' AS DATETIME)

正しいデータ型でパラメーター化されたクエリを使用すると、これらの問題を回避できます。明確な「分離されていない」形式を使用することもできますyyyyMMdd hh:mm:ss

于 2011-03-28T23:14:03.253 に答える
14

しかし、SQLの一部を取得してSQL Management Studioから実行すると、問題なく実行されます。

自由にできる場合は、サービス アカウントを自分のログインに変更してください。これにより、言語/地域の設定が継承されます。

問題の真の核心は次のとおりです。

以下を使用して変換します-> date.Value.ToString("MM/dd/yyyy HH:mm:ss")

今後これらの問題が発生しないように、パラメーター化されたクエリの使用を開始してください。また、より堅牢で、予測可能で、ベスト プラクティスでもあります。

于 2011-03-28T23:35:49.027 に答える
7

C# と SQL の間で日付を操作する最善の方法は、もちろん、パラメーター化されたクエリを使用し、常に C# の DateTime オブジェクトとそれが提供する ToString() 書式設定オプションを操作することだと思います。SQL Server で日付を操作する前に

実行することをお勧めしますset datetime <format>(ここでは MSDN で dateformat の説明が設定されていますset datetime ymd) 。開いている間はフォーマットが維持されるため、接続ごとに1回だけ実行する必要があるため、データベースへの接続を開いた直後に実行することをお勧めします。
その後、いつでも「yyyy-MM-dd HH:mm:ss:ffff」形式で作業できます。

DateTime オブジェクトをパラメーター化されたクエリに渡すには、 を使用できますDateTime.ToString('yyyy-MM-dd HH:mm:ss:ffff')

C#で奇妙なフォーマットの日付を解析するには、使用できますDateTime.ParseExact()入力形式を正確に指定するオプションがあります: DateTime.ParseExact(<some date string>, 'dd/MM-yyyy',CultureInfo.InvariantCulture). ここに MSDN の DateTime.ParseExact() の説明があります)

于 2013-07-04T14:29:26.847 に答える
1

日付形式の問題です。アイルランドでは、3 月 28 日の標準の日付形式は "28-03-2011" ですが、"03/28/2011" はアメリカの標準です (他の多くの場合)。

于 2011-03-28T23:16:14.613 に答える
1

この解決策はOPのケースとは少し異なることは知っていますが、Googleでこの質問のタイトルを検索してここにリダイレクトされた可能性があるため、私と同じ問題に直面している可能性があります。 日付時刻が無効なため、このエラーが発生する場合があります。つまり、日付 (文字列形式) がその月の日数
を超える日を指しています! 例:ステートメントを MySql から SQL Server に変換しているときに、このエラーが発生しました。CONVERT(Datetime, '2015-06-31')

于 2016-08-31T23:29:45.983 に答える