我正在为我的香水店使用MS Access在C#上开发一个数据库应用程序,我在MS Access中创建了一个名为"MIX"的表,其中有列(品牌名称、库存数量、零售价格、原价)。我想通过我创建的C#窗口窗体添加他们的字段。
我正在尝试以下查询来插入我的数据,但一直以来我都收到一个错误"INSERT INTO语句中的语法错误"
private void button1_Click(object sender, EventArgs e)
{
con.Open();
string str = string.Format("Insert into MIX([Brand name],Stock quantity,Retail price,Original price)Values('" + textBox1.Text + "'," + textBox2.Text + "," + textBox3.Text + "," + textBox4.Text + ")");
OleDbCommand cmd = new OleDbCommand(str,con);
cmd.ExecuteNonQuery();
MessageBox.Show("Successfull");
cmd.Dispose();
}
四件事:
- 当您只是连接值时,不需要
string.Format
-
带空格的列名必须用方括号括起来:
string str = "Insert into MIX " + "([Brand name],[Stock quantity],[Retail price],[Original price]) " + "Values('" + textBox1.Text + "'," + textBox2.Text + "," + textBox3.Text + "," + textBox4.Text + ")";
-
您应该学习如何使用参数而不是串联SQL:
string str = "Insert into MIX " + "([Brand name],[Stock quantity],[Retail price],[Original price]) " + "Values (?,?,?,?)"); OleDbCommand cmd = new OleDbCommand(str,con); cmd.Parameters.AddWithValue("brand",textBox1.Text); ... repeat for other values
- 看起来您正在重用一个共享的
OleDbConnection
对象。这不是最好的做法,因为连接是在.NET中汇集的,并且在第一次使用后重新创建起来很便宜,而且您不必担心在应用程序的整个生命周期中保持连接打开
这是一个非常糟糕的主意,因为值被直接放入查询中,但您遇到的问题是多字列名:
Insert into MIX([Brand name],Stock quantity,Retail price,Original price)
这些需要有支架围绕:
Insert into MIX([Brand name],[Stock quantity],[Retail price],[Original price])[
您需要将包含空格的列名括在方括号[]中。此外,您需要使用参数,而不是像那样将值连接到SQL查询。谷歌"SQL注入攻击"的原因就知道了。
Insert into MIX([Brand name],[Stock quantity],[Retail price],[Original price])Values(?,?,?,?)
你替换那些?'s的值是这样的:
cmd.Parameters.AddWithValue("?", Textbox1.text);
cmd.Parameters.AddWithValue("?", Textbox2.text);
cmd.Parameters.AddWithValue("?", Textbox3.text);
cmd.Parameters.AddWithValue("?", Textbox4.text);
请注意,订单很重要。