我使用以下代码将Excel文件更新为SQL Server。代码正在运行,但无法将第一行插入表中。
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();
答案 0 :(得分:4)
即使我遇到同样的问题,这也是因为我正在使用如下的Read()方法。
while (dr.Read())
{
bulkcopy.WriteToServer(dr);
}
解决上述问题是删除dr.Read()方法和while循环 使用 bulkcopy.WriteToServer(DR) 没有任何条件和Read()方法。
答案 1 :(得分:2)
可能的原因可能是您在连接字符串中指出第一行包含列名(HDR=YES
),因此该行不会被视为包含数据。
修改强>
另一个可能的原因是在将阅读器传递给OleDbDataReader.Read()
对象之前调用SqlBulkCopy
方法。 MSDN states:
复制操作从阅读器中的下一个可用行开始。大多数情况下,读者只是通过ExecuteReader或类似的调用返回,因此下一个可用行是第一行。
因此,在您的情况下,您不应该致电OleDbdr.Read()
因为这会使读者前进到第一行;您应该BulkCopy
致电Read()
,它将从第一行开始阅读。
你的代码应该是:
OleDbdr = OleDbCmm.ExecuteReader();
SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString());
BulkCopy.DestinationTableName = "TempTable";
BulkCopy.WriteToServer(OleDbdr);
答案 2 :(得分: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);
}
}