如何使用 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,自动编号列设置为零

如何从 jQuery 调用 C# 静态方法

如何使用 SAS 令牌从 C# 连接到 Azure BlobStorage?

如何从 Visual Studio C# 使用 Office?