0

SqlBulkcopy で C# コンソール アプリケーションを使用していくつかの Excel ファイルを SQL サーバーにインポートしていますが、日時の値をインポートしているときに次の例外を受け取ります。

例外: この例外は、1 つ以上の列が日時データ型を持つ一括コピーを実行するときに発生します。以下の日付形式と関係があると思いますが、エラーの詳細です。

「データ ソースからの String 型の指定された値は、指定されたターゲット列の datetime 型に変換できません。」

コードスニペット

  sExcelConnectionString  = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties=" + "\"Excel 12.0;HDR=No;IMEX=1;\"";
OleDbConnection OleDbConn = new OleDbConnection(sExcelConnectionString);
                    OleDbTransaction tran; 
                    OleDbCommand OleDbCmd = new OleDbCommand(myExcelDataQuery, OleDbConn);
                    OleDbConn.Open();
                    OleDbDataReader dr = OleDbCmd.ExecuteReader();


                if (dr.HasRows && dr.FieldCount > 1)
                {
                     //DataTable dt = readReader(dr);
                    try
                    {

                        string sSqlConnectionString = connectionString.ToString();
                        string sClearSQL = "DELETE FROM " + sSQLTable;
                        SqlConnection SqlConn = new SqlConnection(sSqlConnectionString);
                        SqlCommand SqlCmd = new SqlCommand(sClearSQL, SqlConn);

                        SqlConn.Open();
                        //SqlCmd.ExecuteNonQuery();
                        SqlConn.Close();
                        SqlBulkCopy bulkCopy = new SqlBulkCopy(sSqlConnectionString);
                        bulkCopy.DestinationTableName = sSQLTable;
                        bulkCopy.BulkCopyTimeout = 0;
                        while (dr.Read())
                        {

                            bulkCopy.WriteToServer(dr);
                            imported = true;

                        }
                        OleDbConn.Close();
                        if (valToField.ToString() != "")
                        {
                            sClearSQL = "DELETE FROM " + sSQLTable + " where " + valToField + "='" + valToRemove.ToString() + "'";
                            SqlCmd = new SqlCommand(sClearSQL, SqlConn);
                            SqlConn.Open();
                            SqlCmd.ExecuteNonQuery();
                        }
                        SqlConn.Close();

                    }
                    catch (Exception ex)
                    {

                        LogMessageToFile("Error While Inserting Data from : " + excelFilePath.ToString() + "  to table :  " + dbtable.ToString() + ex.Message.ToString());

                    }
                }

解決策を提案してください

ありがとう

4

3 に答える 3

2

簡単な答えは、a1 が日付を含むセルへの参照である =TEXT(a1,"dd mmmm yyyy hh:mm:ss") 関数を使用して、Excel の日付を文字列に変換することです。

月の 4 つの m に注意してください。日付照合の競合が発生した場合に備えて、完全な月名を使用し、SQL サーバーに日付変換を処理させることをお勧めします。

以下のコメントによると、これは文化と言語全体で機能します =TEXT(a1,"yyyy-MM-ddTHH:mm:ss")

于 2012-06-12T07:09:29.917 に答える
1

車輪を再発明しないでください。Use SSISは、この仕事に適したツールです。Excel ソースから読み取るフローを作成し、適切な変換を行ってから、高速読み込みを使用してSQL Serverに保存します。あなたがやろうとしているのは、遅く、保守性が低く、保守性が低く、変更の場合の適応性がなく、最終的には正しくありません (エラーが示すように)。適切なインポートでは、各レコードを適切に検証して変換する必要があります (たとえばDatetime.TryParse、出力を使用して適切な DateTime タイプに変更します)。

于 2012-06-12T07:30:40.207 に答える
0

「データ ソースからの String 型の指定された値は、指定されたターゲット列の datetime 型に変換できません。」

エラー メッセージは明確です。DateTime ターゲット列に挿入しようとしている文字列としてソースから返される列があります。

于 2012-06-12T07:16:33.917 に答える