如何使用 C# INSERT INTO access 数据库
How to INSERT INTO access database with c#
我正在尝试使用 c# 从 winform 向我的访问数据库添加数据。
我不断收到有关我的 INSERT INTO 语句的语法错误,并且看不出哪里出错了。
请有人检查我的代码并告诉我哪里出错了。
private void btnLog_Click(object sender, EventArgs e)
{
txtStatus.Text = "Open";
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\mwool\Desktop\Uni\3rd Year\SEM 1\AP\Assignment\Staff.accdb";
string sql = "INSERT INTO Fault (faultType, Status, TechId, StaffId, Zone, Description) VALUES ('" + txtFaultType.Text + "', '" + txtStatus.Text + "', " + txtTechId.Text + "' , '" + txtStaffId.Text + "' , '" + txtZone.Text + "' , '" + txtDescription.Text + "')";
OleDbCommand add = new OleDbCommand();
add.CommandText = sql;
add.Connection = conn;
add.Connection.Open();
add.ExecuteNonQuery();
conn.Close();
}
您在 txtTechId.Text
之前漏掉了一个单引号。但是,您应该始终使用 parameterized queries to avoid SQL Injection.
string sql = "INSERT INTO Fault (faultType, Status, TechId, StaffId, Zone, Description) VALUES (@a,@b,@c,@d,@e,@f)";
add.Parameters.AddWithValue("@a", txtFaultType.Text);
add.Parameters.AddWithValue("@b", txtStatus.Text);
add.Parameters.AddWithValue("@c", txtTechId.Text);
add.Parameters.AddWithValue("@d", txtStaffId.Text);
add.Parameters.AddWithValue("@e", txtZone.Text);
add.Parameters.AddWithValue("@f", txtDescription.Text);
始终使用参数化查询。这可以防止简单的错误,例如忘记带字符串的 '
,但更重要的是可以防止 sql 注入攻击。
同时始终将您的数据库连接、命令和任何其他一次性对象包装在 using
块中。
使用 using 语句和参数化输入重构您的代码。
using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\mwool\Desktop\Uni\3rd Year\SEM 1\AP\Assignment\Staff.accdb"))
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = string sql = "INSERT INTO Fault (faultType, Status, TechId, StaffId, Zone, [Description]) VALUES (?, ?, ?, ?, ?, ?)";
cmd.Parameters.Add(new OleDbParameter("@faultType", OleDbType.VarChar)).Value = txtFaultType.Text;
cmd.Parameters.Add(new OleDbParameter("@Status", OleDbType.VarChar)).Value = txtStatus.Text;
// this parameter is an example of passing an int instead of a string. Alwaysuse the correct types!
cmd.Parameters.Add(new OleDbParameter("@TechId", OleDbType.Int)).Value = int.Parse(txtTechId.Text);
cmd.Parameters.Add(new OleDbParameter("@StaffId", OleDbType.VarChar)).Value = txtStaffId.Text;
cmd.Parameters.Add(new OleDbParameter("@Zone", OleDbType.VarChar)).Value = txtZone.Text;
cmd.Parameters.Add(new OleDbParameter("@Description", OleDbType.VarChar)).Value = txtDescription.Text;
con.Open();
cmd.ExecuteNonQuery();
}
OleDbCommand 不支持命名参数,参见 OleDbCommand.Parameters
Remarks
The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used.
另请注意:
- OleConnection 和 OleDbCommand 包含在
using
块中,因此即使发生异常它们也会 disposed/cleaned 启动。
- 现在使用参数而不是对字符串值进行硬编码
- 参数使用了正确的数据类型
可能是不允许使用 Description
,因为它是 reserved word(请参阅 link)。在那种情况下,用 []
包围它(见上面的更新)。
我正在尝试使用 c# 从 winform 向我的访问数据库添加数据。
我不断收到有关我的 INSERT INTO 语句的语法错误,并且看不出哪里出错了。
请有人检查我的代码并告诉我哪里出错了。
private void btnLog_Click(object sender, EventArgs e)
{
txtStatus.Text = "Open";
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\mwool\Desktop\Uni\3rd Year\SEM 1\AP\Assignment\Staff.accdb";
string sql = "INSERT INTO Fault (faultType, Status, TechId, StaffId, Zone, Description) VALUES ('" + txtFaultType.Text + "', '" + txtStatus.Text + "', " + txtTechId.Text + "' , '" + txtStaffId.Text + "' , '" + txtZone.Text + "' , '" + txtDescription.Text + "')";
OleDbCommand add = new OleDbCommand();
add.CommandText = sql;
add.Connection = conn;
add.Connection.Open();
add.ExecuteNonQuery();
conn.Close();
}
您在 txtTechId.Text
之前漏掉了一个单引号。但是,您应该始终使用 parameterized queries to avoid SQL Injection.
string sql = "INSERT INTO Fault (faultType, Status, TechId, StaffId, Zone, Description) VALUES (@a,@b,@c,@d,@e,@f)";
add.Parameters.AddWithValue("@a", txtFaultType.Text);
add.Parameters.AddWithValue("@b", txtStatus.Text);
add.Parameters.AddWithValue("@c", txtTechId.Text);
add.Parameters.AddWithValue("@d", txtStaffId.Text);
add.Parameters.AddWithValue("@e", txtZone.Text);
add.Parameters.AddWithValue("@f", txtDescription.Text);
始终使用参数化查询。这可以防止简单的错误,例如忘记带字符串的
'
,但更重要的是可以防止 sql 注入攻击。同时始终将您的数据库连接、命令和任何其他一次性对象包装在
using
块中。
使用 using 语句和参数化输入重构您的代码。
using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\mwool\Desktop\Uni\3rd Year\SEM 1\AP\Assignment\Staff.accdb"))
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = string sql = "INSERT INTO Fault (faultType, Status, TechId, StaffId, Zone, [Description]) VALUES (?, ?, ?, ?, ?, ?)";
cmd.Parameters.Add(new OleDbParameter("@faultType", OleDbType.VarChar)).Value = txtFaultType.Text;
cmd.Parameters.Add(new OleDbParameter("@Status", OleDbType.VarChar)).Value = txtStatus.Text;
// this parameter is an example of passing an int instead of a string. Alwaysuse the correct types!
cmd.Parameters.Add(new OleDbParameter("@TechId", OleDbType.Int)).Value = int.Parse(txtTechId.Text);
cmd.Parameters.Add(new OleDbParameter("@StaffId", OleDbType.VarChar)).Value = txtStaffId.Text;
cmd.Parameters.Add(new OleDbParameter("@Zone", OleDbType.VarChar)).Value = txtZone.Text;
cmd.Parameters.Add(new OleDbParameter("@Description", OleDbType.VarChar)).Value = txtDescription.Text;
con.Open();
cmd.ExecuteNonQuery();
}
OleDbCommand 不支持命名参数,参见 OleDbCommand.Parameters
Remarks
The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used.
另请注意:
- OleConnection 和 OleDbCommand 包含在
using
块中,因此即使发生异常它们也会 disposed/cleaned 启动。 - 现在使用参数而不是对字符串值进行硬编码
- 参数使用了正确的数据类型
可能是不允许使用 Description
,因为它是 reserved word(请参阅 link)。在那种情况下,用 []
包围它(见上面的更新)。