2015-12-29 34 views
1

我想在C#Windows窗體從DataGridView刪除行,我的代碼只是工作的一次再刪除排在C#Windows窗體

    if (dataGridView1.Columns[e.ColumnIndex].Name == "Delete") 
        { 
         try 
         { 



         using (con = new SqlConnection(C)) 
         { 
          using (objCom = new SqlCommand("DELETE FROM Crud where Id = @Id;SELECT id as 'Customer Id' , Ch_Code as 'Customer Code' , Ch_Name as 'Customer Name',Ch_Type as 'Type' FROM Crud", con)) 
          { 
           objCom.Parameters.AddWithValue("@id", dataGridView1.Rows[e.RowIndex].Cells[0].Value); 
           using (objAdp = new SqlDataAdapter(objCom)) 
           { 


            objAdp.Fill(DS,"xyz"); 
            dataGridView1.DataSource = DS.Tables["xyz"].DefaultView; 
           } 
          } 
         } 
         } 
         catch (Exception EX) 
         { 

          MessageBox.Show(EX.Message); 
         } 
        } 

這讓我異常

轉換失敗時轉換爲nvarchar瓦魯爾足球俱樂部「刪除」到數據 int類型

+0

你的'dataGridView1.Rows [e.RowIndex] .Cells [0] .Value'似乎有'Delete'作爲'object'。你如何看待你可以刪除這個只有「ID」列的整數值的值? –

回答

0
使用

AddWithValue的做法是一個很好的用於avoi注入Sql。但是,在使用.Value成員時,您需要確保您的Value不會包含字符串,而需要爲動態事務傳遞整數。

要做的一件事就是將你的值轉換爲Int32,然後這將是一個有效的int,也許不會返回錯誤。

您的第二個選擇是使用SqlDbType.Int轉換。這樣你就一定會插入一個數據庫可以接受的整數。像這樣:

(SqlDbType.Int)dataGridView1.Rows[e.RowIndex].Cells[0].Value; 
+0

我不認爲這會編譯,因爲'SqlDbType.Int'不是'type'。 –

+0

它可能不是,但它是一個例子,因爲.Value是Nullable(T).Value屬性。它將始終包含一個字符串或一個布爾值,而不是數值。這就是代碼失敗的原因。 –

+0

編號'價值'返回'對象'不'可空'或別的東西。您正在使用C#類型來處理您的投射,而不是數據庫類型。 'nvarchar'在這裏是無關緊要的。 –