2013-08-30 75 views
0

我正在嘗試向位於我的SQL數據庫中的設備表添加一個新項。我正在使用3層架構。這種特定的添加方法使用兩個組合框,其顯示成員已設置,其值元素設置爲各自字段的ID。向sql表添加新項時出錯

我收到錯誤:「輸入字符串的格式不正確」當我按下添加新設備按鈕時(所有項目已輸入到文本框中,並且已從組合框中選擇了值。我不知道它是從哪裏正在添加,我的想法是,它是從組合框的到來。

我的裝備表包含6行。

1.EquipmentNo INT自動編號 2.EquipmentDesc nvarchar的 3.SerialNo爲nvarchar我的分類表的fk 5.VenueID INT(我的地點表的FK)

我的地點表中有一個VenueID(自動編號)和RoomNumber(串) 我的分類表中有一個類別ID(硬的硬件和軟軟件)和Desription(硬件和軟件)

我的業務層包含以下代碼:

public int AddEquipment(Equipment eq) 
    { 
     if (dbConn.State == ConnectionState.Closed) 
     { 
      dbConn.Open(); 
     } 
     string sqlInsert = "sp_AddNewEquipment '" + eq.EquipmentDescription + "' , '" + eq.SerialNo + "' , '" + eq.Barcode + "' , '" + eq.CategoryID + "' , '" + eq.VenueID + "'"; 
     dbCmd = new SqlCommand(sqlInsert, dbConn); 
     int x = dbCmd.ExecuteNonQuery(); 
     return x; 
    } 

我的存儲過程如下:

ALTER PROCEDURE [dbo].[sp_AddnewEquipment] 
    -- Add the parameters for the stored procedure here 
    @EquipmentNo bigint, 
    @EquipmentDescription nvarchar(50), 
    @SerialNo nvarchar(50), 
    @Barcode bigint, 
    @CategoryID nvarchar(50), 
@VenueID int 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    INSERT INTO Equipment(EquipmentNo, EquipmentDescription, Barcode, SerialNo, CategoryID, VenueID) 
    VALUES(@EquipmentNo, @EquipmentDescription, @Barcode, @SerialNo, @CategoryID,  @VenueID) 
END 

這裏是我目前在btnAdd_Click方法我的表單代碼:

Equipment eq = new Equipment(txtDescription.Text, txtSerialNo.Text, txtBarcode.Text,  cmbCategory.ValueMember.ToString(), Convert.ToInt32(cmbVenues.ValueMember)); 
eq.AddNewEquipment(); 

我的組合框填充在頁面加載方法:

 //loading of category combobox 
     cmbCategory.DataSource = c.GetAllCategories(); 
     cmbCategory.DisplayMember = "Description"; 
     cmbCategory.ValueMember = "Category ID"; 

     //Loading of venue combobox 
     cmbVenues.DataSource = v.GetAllVenues(); 
     cmbVenues.DisplayMember = "Room Number"; 
     cmbVenues.ValueMember = "VenueID"; 

我要回兩個組合框的ID的不是顯示的文字。

謝謝你的幫助

+1

好兩兩件事:手動在數據庫中運行相同的查詢,使用相同的價值觀,並確保它運行其次:'Convert.ToInt32(cmbVenues.ValueMember))'......我會把它改成一個'int.TryParse' ...以確保它實際上是一個你正在處理的int。 – Arran

回答

0

好吧,我發現我的錯誤。

cmbCategory.SelectedValue not cmbCategory.ValueMember。

2

你的代碼是開放的SQL注入攻擊

你應該做這樣的

using (var command = new SqlCommand("sp_AddNewEquipment", dbconn) { 
          CommandType = CommandType.StoredProcedure }) { 
    dbconn.Open(); 
    command.Parameters.Add(new SqlParameter("@EquipmentNo", eq.SerialNo));  
    command.Parameters.Add(new SqlParameter("@EquipmentDescription", eq.EquipmentDescription)); 
    command.Parameters.Add(new SqlParameter("@SerialNo",eq.SerialNo)); 
    command.Parameters.Add(new SqlParameter("@Barcode",eq.Barcode)); 
    command.Parameters.Add(new SqlParameter("@CategoryID",eq.CategoryID)); 
    command.Parameters.Add(new SqlParameter("@VenueID",eq.VenueID)); 
    command.ExecuteNonQuery(); 
    dbconn.Close(); 
} 
+0

謝謝。你是否介意解釋這一行:CommandType = CommandType.StoredProcedure呢? –

+1

它告訴將要執行的命令是類型存儲過程而不是內聯查詢。 – Ehsan