我在下面有这个代码,它应该将数据从datagridview dtg_ksluzby保存到sql table KLISLUZ
,但它说:
嵌入式语句不能被声明或标记为statemnt。
for(int i=0; i< dtg_ksluzby.Rows.Count;i++)
SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz'" + dtg_ksluzby.Rows[i].Cells["text"].Value +"', '" + dtg_ksluzby.Rows[i].Cells["pocet"].Value +"'",spojeni);
prikaz2.ExecuteNonQuery();
答案 0 :(得分:4)
首先,您应始终使用parameterized queries,此类字符串连接可用于SQL Injection攻击。
试试这个;
for(int i=0; i< dtg_ksluzby.Rows.Count;i++)
{
using(SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz VALUES(@p1, @p2)",spojeni))
{
prikaz2.Parameters.AddWithValue("@p1", dtg_ksluzby.Rows[i].Cells["text"].Value);
prikaz2.Parameters.AddWithValue("@p2", dtg_ksluzby.Rows[i].Cells["pocet"].Value);
prikaz2.ExecuteNonQuery();
}
}
作为Tim pointed的替代方案,您可以在执行命令后为您需要使用SqlParameterCollection.Clear()
方法的所有值重复使用相同的SqlCommand
。
像;
using(SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz VALUES(@p1, @p2)",spojeni))
{
for(int i=0; i< dtg_ksluzby.Rows.Count;i++)
{
prikaz2.Parameters.AddWithValue("@p1", dtg_ksluzby.Rows[i].Cells["text"].Value);
prikaz2.Parameters.AddWithValue("@p2", dtg_ksluzby.Rows[i].Cells["pocet"].Value);
prikaz2.ExecuteNonQuery();
prikaz2.Parameters.Clear();
}
}
答案 1 :(得分:2)
您的查询错误(也使用Parametrized Queries
)
修正查询:
"INSERT INTO klisluz values('" + dtg_ksluzby.Rows[i].Cells["text"].Value +"', '" + dtg_ksluzby.Rows[i].Cells["pocet"].Value +"')"
固定代码:
using (SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz values('@val1', '@val2')",spojeni))
{
for (int i = 0; i < dtg_ksluzby.Rows.Count; i++)
{
prikaz2.Parameters.Clear();
prikaz2.Parameters.AddWithValue("@val1", dtg_ksluzby.Rows[i].Cells["text"].Value);
prikaz2.Parameters.AddWithValue("@val2", dtg_ksluzby.Rows[i].Cells["pocet"].Value);
prikaz2.ExecuteNonQuery();
}
}