将新项添加到sql表时出错

时间:2013-08-30 15:15:25

标签: c# sql sql-server 3-tier

我正在尝试将新项添加到位于我的SQL数据库中的Equipment表中。我正在使用3层架构。这种特殊的添加方法使用两个组合框,其显示成员设置,其值成员设置为各自字段的ID。

我收到错误:“输入字符串的格式不正确”当我按下添加新设备按钮时(在所有项目输入文本框并且已选择组合框中的值之后)。我是我不知道它来自哪里,我的想法是它来自组合框。

我的装备表包含6行。

1.EquipmentNo int autonumber 2.EquipmentDesc nvarchar 3.SerialNo nvarchar 4.Barcode nvarchar 5.CategoryID nvarchar(我的分类表的fk) 5.VenueID int(我的Venue表的fk)

我的Venue表有VenueID(自动编号)和RoomNumber(字符串) 我的Category表有一个CategoryID(硬件硬件和软件软件)和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而不是显示的文本。

谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

您的代码对SQLinjection

开放

你应该这样做

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

答案 1 :(得分:0)

好的,我发现了我的错误。

cmbCategory.SelectedValue not cmbCategory.ValueMember。