1

Excel ファイルをサーバーにアップロードし、その行と列をデータベースに挿入しています。行ごとに実行していますが、日時に問題があります。146 行のデータを挿入した後、次のようなエラーが表示されます。

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

問題はその日付です。Excel ファイルでは、日付は dd/mm/yyyy の形式になっていますが、データベースはそれらを mm/dd/yyyy と見なしているため、日付が 12 日を過ぎると範囲外エラーが発生します。Excelファイルを変更したくないので、データベース(MS SQLサーバー)で変更できるオプションがありますか、または挿入する前に変換できるc#コードを使用する必要があります...ありがとう...

4

5 に答える 5

2

Excel からの形式がわかっている場合は、特定の IFormatterProvider を使用して C# で文字列を DateTime に解析するのが最適です。

ここでの問題は、Excel からの文字列に関するカルチャ情報がないため、DateTime への変換ではデータベースのカルチャ (この場合は月と日を逆にする形式) しか考慮できないことです。これは、範囲外の日付 (あなたの場合のように) またはあいまいな日付が正しく解析されないことを意味します。

C# コードでは、を実装するカルチャを指定できますIFormatterProvider。en-GB には、指定した Excel 日付の日付形式があります。MSDN ドキュメントの例は、これを行う方法を示しています。DateTime私のブリーフィング例では、en-GB 日付形式の文字列を文化に依存しない形式に変換する方法を示しています。

var culture = CultureInfo.CreateSpecificCulture("en-GB");
var date = DateTime.Parse("13/12/2011", culture);

SQL は文化に関して同じ問題を抱えています。カルチャに依存するデータの文字列表現は、常に現在のカルチャを失います。そのデータを変換するときに、サーバーと異なる場合はカルチャを指定する必要があります。

これを SQL で実行し、変換しようとしている文字列の形式をハードコーディングできます (103 は en-GB の日付形式 dd/mm/yyyy を表します)。

declare @datestring varchar(10) = '13/12/2011' --13th December
-- 103 is the format code for UK dates with full yyyy century.
select convert(date, @datestring, 103) --gives 2011-12-13

declare @datestring2 varchar(10) = '05/04/2011' --5th April, ambiguous date.
select convert(date, @datestring2, 103) --gives 2011-04-05

フォーマットコードを変換/キャストします。

これは、カルチャが不明な場合に月/日を逆にする 05/04/2011 などのあいまいな日付も正しく変換することにも注意してください。

たとえば、パーサーに形式を指定せずに英国の 2011 年 4 月 5 日を米国の日付に変換しようとすると、月と日が逆になり、2011 年 5 月 4 日が出力されます。

于 2012-05-24T09:45:42.627 に答える
0

T-SQL で挿入する前にこれを行うことができます:

set dateformat dmy

http://msdn.microsoft.com/fr-fr/library/ms189491.aspxを参照してください。

于 2012-05-24T09:47:22.517 に答える
0

まず、Excel の日時を解析して C# の日時オブジェクトにし、日時オブジェクトを次のようにフォーマットします。

DateTime dt = DateTime.Parse(drExcel["dateofExcel"]);
drDB["DateTime"] = dt.ToString("s");

うまくいけば、それはあなたの問題を解決します

于 2012-05-24T09:47:48.023 に答える
0

データベースで行うこともできます。おそらく、Excelシートを使用してデータをデータベースに挿入するストアドプロシージャを作成してみてください。

以下のユーザーは、SP の TSQL コードについて言及しており、それは機能します。

CREATE PROCEDURE ABC
AS
-- Do some operation
    SET DATEFORMAT ydm;

    insert into @dates
    select '2008-09-01','2008-09-01'

END
于 2012-05-24T09:47:55.260 に答える
0

C#でやればいいと思います。次のようなことを試してください:

String excelDate = ...
String[] dateParts = excelDate.Split('/');
String sqlDate = dateParts[1] + "/" + dateParts[0] + "/" + dateParts[2];
...
于 2012-05-24T09:50:06.360 に答える