2017-04-06 49 views
0

我正在学习连接到Microsoft Access并写入数据库。我在Access中创建了一个数据库,并希望向其中插入数据。为什么说SQL语句有错误插入到

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb"); 

OleDbCommand cmd = new OleDbCommand(); 
string FN = textBox1.Text; 
string LN = textBox2.Text; 

cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (FN,LN)"; 
cmd.Connection = conn; 

conn.Open(); 
cmd.ExecuteNonQuery(); 

在我运行之前似乎没有错误。我运行该程序,更新我textBox1.texttextBox2.text,点击保存,然后我得到一个错误:

SYNTAX ERROR in SQL statement Insert into

我做了什么错?

+0

你需要养成使用像这样的参数的习惯:http://stackoverflow.com/questions/5893837/using-parameters-inserting-data-into-access-database这将解决这个问题,并保持你的安全来自SQL注入。 –

+2

由于FN/LN没有自动插入字符串,查询失败。 –

回答

3

在您的插入中,您尝试将值增加为FNLN。这些值在命令范围中不存在,所以它不知道它在做什么。你想要的是不是设置这些值作为参数,然后用自己的价值,将命令添加他们:

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb"); 
OleDbCommand cmd = new OleDbCommand(); 
string FN = textBox1.Text; 
string LN = textBox2.Text; 
cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (@FN,@LN)"; 
cmd.Connection = conn; 
cmd.Parameters.Add(new OleDbParameter("@FN", FN)); 
cmd.Parameters.Add(new OleDbParameter("@LN", LN)); 
conn.Open(); 
cmd.ExecuteNonQuery(); 
+1

oledb需要'?'而不是'@ IDENTIFIER'占位符我认为 –

+0

不,如果您使用的是Access,它可以与@完美协作。重要的是以占位符的相同顺序保持对集合的添加。 – Steve

+0

@AlexK。它取决于驱动程序 –

0

你的代码是打破,因为FN和LN是C#变量,你试图通过他们的查询,因为它是。这在SQL中不会导致正确的语法。

您需要将FN和LN作为参数传递给查询。

将您的代码更改为以下。

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb"); 
OleDbCommand cmd = new OleDbCommand(); 
string FN = textBox1.Text; 
string LN = textBox2.Text; 
cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (@FN,@LN)"; 
cmd.Parameters.Add(new OleDbParameter("@FN", FN)); 
cmd.Parameters.Add(new OleDbParameter("@LN", LN)); 
cmd.Connection = conn; 
conn.Open(); 
cmd.ExecuteNonQuery(); 

这应该可以解决您的问题。