我有以下代码。我可以从工作簿中的工作表中存在的所有数据和工作表的名称中提取所有数据
foreach (var sheetName in GetExcelSheetNames(connectionString))
{
using (OleDbConnection con = new OleDbConnection(connectionString))
{
var dataTable = new DataTable();
string query = string.Format("SELECT {0} as sheetName, * FROM [{0}]", sheetName);
con.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
adapter.Fill(dataTable);
ds.Tables.Add(dataTable);
}
}
然后我编写以下代码将数据存储在sql server
中的表中if (ds.Tables.Count > 0)
{
foreach (DataTable dt in ds.Tables)
{
using (SqlConnection con = new SqlConnection(consString))
{
con.Open();
for (int i = 2; i < dt.Rows.Count; i++)
{
for (int j = 1; j < dt.Columns.Count; j += 3)
{
//Here the problem
SqlCommand command = new SqlCommand( what should I write? ) ;
command.ExecuteNonQuery();
}
}
con.Close();
}
}
我的问题是如何将表名存储在表[Obj CA]中?
答案 0 :(得分:0)
我认为你的
"...VALUES('sheetname" + dt.Rows[0][j].ToString() + "' )
应该是
"...VALUES('sheetname', '" + dt.Rows[0][j].ToString() + "' )
因为您尝试插入两个值,但未使用逗号分隔它们。
但作为更好的方法,请使用parameterized queries。这种字符串连接对SQL Injection攻击开放。
var command = new SqlCommand(@"INSERT INTO [Obj CA] (sheetname, [Rayon])
VALUES('sheetname', @rayon"), con);
for (int i = 2; i < dt.Rows.Count; i++)
{
for (int j = 1; j < dt.Columns.Count; j += 3)
{
command.Parameters.Clear();
command.Parameters.AddWithValue("@rayon", dt.Rows[0][j].ToString());
command.ExecuteNonQuery();
}
}
顺便说一下,由于我不知道您的列类型,我使用AddWithValue
作为示例,但您没有。 This method may generate unexpected results sometimes。使用Add
重载来指定参数类型及其大小。
此外,我强烈怀疑您应该更改列定义顺序,例如(sheetname, [Rayon])
声明中的INSERT
。