基本上我正在做的是点击按钮后,程序将根据用户选择的内容从特定行中提取数据,并使用INSERT
将其放在不同的表中。以下是代码。
private void button3_Click(object sender, EventArgs e)
{
const String connectionString = "Data Source = Vanessa-PC\\SQLEXPRESS; Initial Catalog = IUMDC; Connect Timeout = 15; Integrated Security = true";
SqlConnection con = new SqlConnection(connectionString);
//int SituationID1;
label24.Show();
foreach (SitID x in Sittbl)
{
if (x.ID == Convert.ToInt16(comboBox1.SelectedItem))
{
try
{
con.Open();
SqlCommand command = new SqlCommand("SELECT * FROM Situation WHERE SituationID=" + x.SitIDs, con);
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
sitid1 = Convert.ToInt32(dr[0]);
name1 = dr[4].ToString();
incident1 = Convert.ToDateTime(dr[1]);
charges1 = dr[5].ToString();
nature1 = dr[2].ToString();
}
con.Close();
}
catch (SqlException ex)
{
MessageBox.Show("Database failed to connect" + ex.Message);
}
//SituationID = x.SitIDs;
}
}
try
{
con.Open();
SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con);
SqlDataReader dr1 = command1.ExecuteReader();
con.Close();
}
catch (SqlException ex)
{
MessageBox.Show("Database failed to connect" + ex.Message);
}
//Situation Sit = new Situation();
//Sit.ShowDialog();
}
我的代码失败并说
“行项附近的语法不正确”
这两个表的类型是相同的,我试图彻底测试这个!
答案 0 :(得分:16)
看起来你的上一个sql语句不正确。也许原因是在你的sql stament中使用撇号,但你不应该关心它。我在答案中解释了你为什么不在乎。
SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con);
要找出究竟是什么问题,您可以改为指定列名。但我建议您使用参数化查询,甚至不需要指定列名。
SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES(@sitid1, @incident1, @nature1, @name1, @charges1)", con);
command1.Parameters.AddWithValue("@sitid1", sitid1);
command1.Parameters.AddWithValue("@incident1", incident1.ToString("YYYY-mm-DD"));
command1.Parameters.AddWithValue("@nature1", nature1);
command1.Parameters.AddWithValue("@name1", name1);
command1.Parameters.AddWithValue("@charges1", charges1);
command1.ExecuteNonQuery();
您应始终使用 parameterized queries 。此类代码适用于 SQL Injection 攻击。
同样作为Marc mentioned,没有必要对此sql语句使用ExecuteReader()
,因为它只是INSERT
数据,不会返回任何数据。因此,在这种情况下,您只需使用ExecuteNonQuery()
。
答案 1 :(得分:4)
尝试在查询中指定列:
"INSERT INTO CurrentSit (sitid, incident, nature, name1, charges) VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con)";
作为补充说明,还要学习使用参数化查询。例如:
command1.Parameters.AddWithValue("@name1", name1);
command1.Parameters.AddWithValue("@charges1", charges1);
http://johnhforrest.com/2010/10/parameterized-sql-queries-in-c/
答案 2 :(得分:3)
您当前的问题是您的INSERT
语句中包含一些无效语法;很可能你用来构建它的一个值有一个撇号,它会提前终止你的字符串。
你更大的问题是你永远不应该以这种方式构建插入语句。除了极易出现您所看到的错误之外,它也是SQL注入攻击的经典开端。 (想象一下,例如,如果情况的性质foo'); drop table situation; --
)。
您应该使用参数化查询:
var sql = "INSERT INTO CurrentSit VALUES (@sitid, @incident, @nature, @name, @charges)"
var cmd = new SqlCommand(sql, con);
cmd.Parameters.Add("@Sitid", SqlDbType.Int).Value = sitid1;
// etc.