如何使用 c# 从 Microsoft Access 表中删除一行
Posted
技术标签:
【中文标题】如何使用 c# 从 Microsoft Access 表中删除一行【英文标题】:How do I delete a row from a Microsoft Access table using c# 【发布时间】:2013-04-19 18:35:07 【问题描述】:我试过这段代码:
string sql = " DELETE FROM HotelCustomers WHERE [Room Number] =" + textBox1.Text;
OleDbConnection My_Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\\Users\\Documents\\HotelCustomersOld.mdb");
My_Connection.Open();
OleDbCommand My_Command = new OleDbCommand(sql, My_Connection);
My_Command.ExecuteNonQuery();
错误:条件表达式中的数据类型不匹配,位于以下行: My_Command.ExecuteNonQuery();
【问题讨论】:
[房间号]的数据类型是什么? 与您的问题无关,但这看起来像是SQL Injection 漏洞的经典示例。 你在乞求 SQL 注入攻击。使用参数化查询。 【参考方案1】:使用参数化查询来避免各种错误
string sql = " DELETE FROM HotelCustomers WHERE [Room Number] =?";
using(OleDbConnection My_Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\\Users\\Documents\\HotelCustomersOld.mdb"))
My_Connection.Open();
OleDbCommand My_Command = new OleDbCommand(sql, My_Connection);
My_Command.Parameters.Add("@p1", textBox1.Text);
My_Command.ExecuteNonQuery();
在您的情况下,房间编号字段是文本类型,因此,您需要将值括在单引号中,但这确实是错误的。您将代码暴露给用户在文本框中编写的恶意文本。一个很简单的funny example here
【讨论】:
【参考方案2】:您的 [房间号] 列是哪种类型的?如果它是一个字符串,那么你必须用引号或引号写入值(我不确定在 Access 中使用了哪一个)。
string sql = " DELETE FROM HotelCustomers WHERE [Room Number] = '" + textBox1.Text + "'";
为避免 SQL 注入,您应该使用参数而不是字符串操作。
【讨论】:
【参考方案3】:public static void DeleteLine(string kv)
OleDbConnection myConnection = GetConnection();
string myQuery = "DELETE FROM Cloth WHERE [ClothName] = '" + kv + "'";
OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);
try
myConnection.Open();
myCommand.ExecuteNonQuery();
catch (Exception ex)
Console.WriteLine("Exception in DBHandler", ex);
finally
myConnection.Close();
【讨论】:
【参考方案4】:试试
OleDbConnection con = new OleDbConnection("provider = microsoft.ace.oledb.12.0;data source = E:\\Sohkidatabase\\Sohki.accdb");
con.Open();
str = "select * from compny_info where id=" + comboBox1.Text.Trim() + "";
com = new OleDbCommand(str, con);
OleDbDataReader reader = com.ExecuteReader();
if (reader.Read())
textBox1.Text = reader["regis_no"].ToString();
textBox2.Text = reader["comp_oner"].ToString();
textBox3.Text = reader["comp_name"].ToString();
textBox4.Text = reader["comp_add"].ToString();
textBox5.Text = reader["tin_no"].ToString();
textBox6.Text = reader["email"].ToString();
con.Close();
reader.Close();
catch(Exception ex)
MessageBox.Show(ex.Message);
【讨论】:
【参考方案5】: public static void DeleteLine(string kv)
OleDbConnection myConnection = GetConnection();
string myQuery = "DELETE FROM Cloth WHERE [ClothName] = '" + kv + "'" ;
【讨论】:
您的意思是对您的other answer 进行编辑吗?以上是关于如何使用 c# 从 Microsoft Access 表中删除一行的主要内容,如果未能解决你的问题,请参考以下文章
使用 .Net Core C# 从 Microsoft 验证 JWT
C# 无法从 'float' 转换为 'Microsoft.Xna.Framework.Point'
使用 Microsoft.Jet.OLEDB.4.0 从 C# 将行插入 Access db,自动编号列设置为零