5

次のコードを使用して、ExcelファイルをSQLServerに更新しています。コードは機能していますが、最初の行をテーブルに挿入できません。

OleDbConnection OleDb = new OleDbConnection(ConnectionString);
OleDbCommand OleDbCmm = new OleDbCommand(Query,OleDb);
OleDbDataReader OleDbdr;
OleDb.Open();

if (OleDb.State == ConnectionState.Open)
{
    OleDbdr = OleDbCmm.ExecuteReader();
    SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString());
    BulkCopy.DestinationTableName = "TempTable";

    if (OleDbdr.Read())
    {
       BulkCopy.WriteToServer(OleDbdr);
    }
 }

 OleDb.Close();
4

3 に答える 3

3

これの考えられる理由の 1 つは、最初の行に列名 ( HDR=YES) が含まれていることを接続文字列で示しているため、その行がデータを含むものとして扱われないことが考えられます。

編集

この別の考えられる理由は、リーダーをオブジェクトOleDbDataReader.Read()に渡す前にメソッドを呼び出すことです。MSDN の状態:SqlBulkCopy

コピー操作は、リーダーで次に使用可能な行から開始されます。ほとんどの場合、リーダーは ExecuteReader または同様の呼び出しによって返されたばかりなので、次に利用可能な行は最初の行です。

したがって、あなたの場合OleDbdr.Read()、リーダーを最初の行に進めるため、呼び出すべきではありません。BulkCopy呼び出しを許可する必要がRead()あり、最初の行から読み取りを開始します。コードは次のようになります。

OleDbdr = OleDbCmm.ExecuteReader();
SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString());
BulkCopy.DestinationTableName = "TempTable";
BulkCopy.WriteToServer(OleDbdr);
于 2012-12-24T10:22:49.517 に答える
1

私が行ったように、Excelのヘッダーをsqlに設定する必要があります

string conn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Your D S+ ";" +
"Extended Properties=Excel 8.0;";
OleDbConnection sSourceConnection = new OleDbConnection(conn);
using (sSourceConnection)
{
   DataTable dtExcelData = new DataTable();
   string[] SheetNames = GetExcelSheetNames(strFileName);
   string[] preColumnHeader = new string[]{ "CarrierId", "StateId", "TerrCd", "ProgramId", "ClassId",
   "PremTypeID","Limit50_100", "Limit100_100", "Limit100_200", "Limit300_300", "Limit300_600", 
   "Limit500_500","Limit500_1mil", "Limit1mil_1mil", "Limit1mil_2mil", "OtherParameter" };
   sSourceConnection.Open();
   string strQuery = string.Empty;
   strQuery = "SELECT * FROM [" + SheetNames[0] + "]";

   OleDbDataAdapter oleDA = new OleDbDataAdapter(strQuery, sSourceConnection);
   oleDA.Fill(dtExcelData);
   sSourceConnection.Close();
   string[] colName = new string[dtExcelData.Columns.Count];
   int i = 0;
   foreach (DataColumn dc in dtExcelData.Columns)
   {
       colName[i] = dc.ColumnName;
       i++;
   }
   using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr))
   {
       bulkCopy.DestinationTableName = "tbl_test";
       bulkCopy.WriteToServer(dtExcelData);
   }
}
于 2013-08-01T10:18:24.130 に答える