从 SQL Server 表中删除一行

Posted

技术标签:

【中文标题】从 SQL Server 表中删除一行【英文标题】:Delete a row from a SQL Server table 【发布时间】:2012-03-23 13:21:28 【问题描述】:

我正在尝试使用按钮事件从我的 SQL Server 数据库表中简单地删除一整行。到目前为止,我的任何尝试都没有成功。这就是我想要做的:

public static void deleteRow(string table, string columnName, string IDNumber)

    try
    
    using (SqlConnection con = new SqlConnection(Global.connectionString))
    
         con.Open();
         using (SqlCommand command = new SqlCommand("DELETE FROM " + table + " WHERE " + columnName + " = " + IDNumber, con))
         
               command.ExecuteNonQuery();
         
         con.Close();
    
    
    catch (SystemException ex)
       
       MessageBox.Show(string.Format("An error occurred: 0", ex.Message));
       
    

我一直收到错误:

System.Data.dll 中发生了“System.Data.SqlClient.SqlException”类型的第一次机会异常 发生错误:操作数类型冲突:文本与 int 不兼容

表中的所有列都是TEXT 类型。为什么我不能将 string 类型的函数参数与列进行比较以找到匹配项? (然后删除该行?)

【问题讨论】:

您应该为此使用参数。 我不知道如何使用参数,有什么例子吗?资源? 另外,作为旁注:首先,您不应该再使用TEXT - 从 SQL Server 2005 开始,它已被弃用。请改用VARCHAR(MAX)。另外:将所有列设为VARCHAR(MAX) 闻起来像个糟糕的设计——您真的需要每列 2 GB 的文本吗? REALLY!?!?!? 设计和性能提示:使用适当的数据类型 【参考方案1】:

正如您所说,所有列名都是 TEXT 类型,因此,需要通过在 IDNumber 周围使用单引号将 IDNumber 用作文本.....

    public static void deleteRow(string table, string columnName, string IDNumber)
    
    try
    
    using (SqlConnection con = new SqlConnection(Global.connectionString))
    
         con.Open();
         using (SqlCommand command = new SqlCommand("DELETE FROM " + table + " WHERE " + columnName + " = '" + IDNumber+"'", con))
         
               command.ExecuteNonQuery();
         
         con.Close();
    
    
    catch (SystemException ex)
       
       MessageBox.Show(string.Format("An error occurred: 0", ex.Message));
       
    
 

【讨论】:

对于此类操作,您应该始终使用参数化查询。【参考方案2】:

IDNumber 应该是 int 而不是 string,或者如果它真的是 string,请添加引号。

更好的是,使用参数。

【讨论】:

使用正则引号 (") 我得到这个:An error occurred: Invalid column name '50012'. 其中 50012 是 IDNumber(字符串)。 @ikathegreat - 试试 kashif 的例子。使用参数可以避免使用此类数据类型的麻烦。此外,正如其他发帖人所说,您几乎肯定不希望所有这些字段都是 TEXT。【参考方案3】:

用参数试试

.....................
.....................

    using (SqlCommand command = new SqlCommand("DELETE FROM " + table + " WHERE " + columnName + " = " + @IDNumber, con))
             
                   command.Paramter.Add("@IDNumber",IDNumber)
                   command.ExecuteNonQuery();
             

.....................
.....................

using语句无需关闭连接

【讨论】:

【参考方案4】:

看起来 IDNumber 是一个字符串。它需要用单引号括起来。

"DELETE FROM " + table + " WHERE " + columnName + " = '" + IDNumber + "'"

【讨论】:

返回:An error occurred: The data types text and varchar are incompatible in the equal to operator.【参考方案5】:

您可以将“columnName”类型从TEXT 更改为VARCHAR(MAX). TEXT 列不能与"=" 一起使用。see this topic

【讨论】:

【参考方案6】:
private void button4_Click(object sender, EventArgs e)

    String st = "DELETE FROM supplier WHERE supplier_id =" + textBox1.Text;

    SqlCommand sqlcom = new SqlCommand(st, myConnection);
    try
    
        sqlcom.ExecuteNonQuery();
        MessageBox.Show("delete successful");
    
    catch (SqlException ex)
    
        MessageBox.Show(ex.Message);
    




private void button6_Click(object sender, EventArgs e)

    String st = "SELECT * FROM suppliers";

    SqlCommand sqlcom = new SqlCommand(st, myConnection);
    try
    
        sqlcom.ExecuteNonQuery();
        SqlDataReader reader = sqlcom.ExecuteReader();
        DataTable datatable = new DataTable();
        datatable.Load(reader);
        dataGridView1.DataSource = datatable;
    
    catch (SqlException ex)
    
        MessageBox.Show(ex.Message);
    

【讨论】:

【参考方案7】:

如果您使用的是 mysql Wamp。此代码有效。

string con="SERVER=localhost; user id=root; password=; database=dbname";
public void delete()

try

MySqlConnection connect = new MySqlConnection(con);
MySqlDataAdapter da = new MySqlDataAdapter();
connect.Open();
da.DeleteCommand = new MySqlCommand("DELETE FROM table WHERE ID='" + ID.Text + "'", connect);
da.DeleteCommand.ExecuteNonQuery();

MessageBox.Show("Successfully Deleted");

catch(Exception e)

MessageBox.Show(e.Message);


【讨论】:

【参考方案8】:
private void DeleteProductButton_Click(object sender, EventArgs e)



    string ProductID = deleteProductButton.Text;
    if (string.IsNullOrEmpty(ProductID))
    
        MessageBox.Show("Please enter valid ProductID");
        deleteProductButton.Focus();
    
    try
    
        string SelectDelete = "Delete from Products where ProductID=" + deleteProductButton.Text;
        SqlCommand command = new SqlCommand(SelectDelete, Conn);
        command.CommandType = CommandType.Text;
        command.CommandTimeout = 15;

        DialogResult comfirmDelete = MessageBox.Show("Are you sure you want to delete this record?");
        if (comfirmDelete == DialogResult.No)
        
            return;
        
    
    catch (Exception Ex)
    
        MessageBox.Show(Ex.Message);

    

【讨论】:

你的答案比这个 7 岁问题的公认答案有什么改进?

以上是关于从 SQL Server 表中删除一行的主要内容,如果未能解决你的问题,请参考以下文章

使用游标时从游标中删除一行

Query Sql Server 能够删除表的最后一行

SQL Server:如何删除行号

如何从 SQL Server 中的表中删除重复行 [重复]

从 SQL Server 中的两个表中删除

使用R(DBI包)从SQL Server表中删除行