试图从数据表插入行到Excel工作表中时,我有一个问题

DataSet excelDataSet = new DataSet(); string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='"+fullpath+"';Extended Properties=\"Excel 8.0;HDR=YES\";"; /*using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); OleDbDataAdapter objDA = new OleDbDataAdapter("select * from [Sheet1$]", conn); objDA.Fill(excelDataSet); conn.Close(); }*/ string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName)); columns = columns.Replace(",F1", ""); string values = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName))); values = values.Replace(",@F1", ""); string sqlCommandInsert = string.Format("INSERT INTO [Sheet1$] ({0}) VALUES ({1})", columns, values); using (OleDbConnection conn1 = new OleDbConnection(connectionString)) using (var cmd1 = new OleDbCommand(sqlCommandInsert, conn1)) { conn1.Open(); foreach (DataRow row in StdTable.Rows) { cmd1.Parameters.Clear(); foreach (DataColumn col in StdTable.Columns) { cmd1.Parameters.AddWithValue("@" + col.ColumnName, row[col]); //cmd1.CommandText = sqlCommandInsert; } cmd1.ExecuteNonQuery(); } //cmd1.ExecuteNonQuery(); } //And Insert query values INSERT INTO [Sheet1$] (Sno,Customer,Vendor code,Circle,PO NO) VALUES (@Sno,@Customer,@Vendor code,@Circle,@PO NO) 

代替

  string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName)); 

做这个

  string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Foramt("[{0}]", c.ColumnName))); 

在数据表中的一列可能被命名为Jet数据库提供程序中的特殊关键字,例如想象一列“Date”或“Where”或类似的东西。

第二次看,我看到你的列名中有来自数据表的空格。 这个方括号的方法仍然可以帮助。

请注意参数名称

  @PO NO 

不应该包含空格,所以我会从参数名称中删除空格。

column namesspaces ,所以在column names使用[]replace space with _ parameter names replace space with _

修改你的代码行如下:

 string columns = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Foramt("[{0}]", c.ColumnName))); columns = columns.Replace(",F1", ""); string values = string.Join(",", StdTable.Columns.Cast<DataColumn>().Select(c => string.Format("@{0}", c.ColumnName.Replace(" ", "_")))); values = values.Replace(",@F1", ""); cmd1.Parameters.AddWithValue("@" + col.ColumnName.Replace(" ", "_"), row[col]);