2012-03-06 114 views
4

我試圖簡單地從我的SQL Server數據庫表中使用按鈕事件刪除一整行。到目前爲止,我的嘗試都沒有成功。這就是我想要做的事:從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)); 
     } 
    } 
} 

我不斷收到錯誤:

A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll An error occurred: Operand type clash: text is incompatible with int

所有在表中的列是TEXT類型。爲什麼我無法將類型爲string的函數參數與列進行比較以找到匹配項? (然後刪除該行?)

+2

你應該使用這個參數。 – 2012-03-06 03:07:20

+0

我不確定如何使用參數,任何示例?資源? – ikathegreat 2012-03-06 04:24:23

+1

另外,作爲一個附註:首先,你不應該再使用'TEXT' - 從SQL Server 2005開始它已經被棄用了。改用'VARCHAR(MAX)'。另外:擁有**所有列**是'VARCHAR(MAX)'聞起來像一個可怕的設計 - 你真的**需要2 GB的文本**每列** ** ?? **設計和性能提示:使用適當的數據類型 – 2012-03-06 05:50:10

回答

11

正如你所指出,所有的列名是文本類型的關閉連接,所以,有必要通過在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)); 
     } 
    } 
} 
6

要麼IDNumber應該是int,而不是string,或者如果它真的是一個string,加引號。

更好的是,使用參數。

+0

使用正則引號(「)我回來了:'發生錯誤:無效的列名稱'50012'.'其中50012是IDNumber (字符串) – ikathegreat 2012-03-06 04:23:56

+0

@ikathegreat - 試試kashif的例子,使用參數避免了像這樣的數據類型的麻煩,而且,正如其他海報所說的,你幾乎肯定不希望所有這些字段都是TEXT。 – 2012-03-06 11:42:28

1

看起來像IDNumber是一個字符串。它需要單引號纏繞它。

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

this returns :發生錯誤:數據類型text和varchar在等於運算符中不兼容 – ikathegreat 2012-03-06 04:21:57

1

你可以改變從TEXTVARCHAR(MAX). TEXT列中的「列名」型不能與"="使用。
see this topic

3

嘗試用放慢參數

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

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

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

無需使用聲明

0
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); 
    } 
}