Ошибка добавления нового элемента в таблицу sql

Я пытаюсь добавить новый элемент в свою таблицу оборудования, расположенную в моей базе данных SQL. Я использую трехуровневую архитектуру. Этот конкретный метод добавления использует два поля со списком, в которых установлены элементы отображения, а в элементах значений установлены идентификаторы соответствующих полей.

Я получаю сообщение об ошибке: «Входная строка была в неправильном формате», когда я нажимаю кнопку добавления нового оборудования (после того, как все элементы были введены в текстовые поля и выбраны значения из полей со списком. и я не уверен, где это исходит, я думаю, что это исходит из выпадающих списков.

моя таблица оборудования содержит 6 строк.

1.EquipmentNo int autonumber 2.EquipmentDesc nvarchar 3.SerialNo nvarchar 4.Barcode nvarchar 5.CategoryID nvarchar (fk моей таблицы категорий) 5.VenueID int (fk моей таблицы Venue)

моя таблица Venue имеет VenueID (автономный номер) и RoomNumber (строка) моя таблица категорий имеет CategoryID (Hard для оборудования и Soft для программного обеспечения) и 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";

я хочу вернуть идентификаторы двух полей со списком, а не отображаемый текст.

Спасибо за помощь


person Andre Smith    schedule 30.08.2013    source источник
comment
Ну, две вещи: запустить тот же запрос в базе данных вручную, используя те же значения, и убедиться, что он работает, и, во-вторых: Convert.ToInt32(cmbVenues.ValueMember)) ... я бы изменил это на int.TryParse ... чтобы убедиться, что это действительно int вы иметь дело с.   -  person Arran    schedule 30.08.2013


Ответы (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();
}
person Ehsan    schedule 30.08.2013
comment
Спасибо. Не могли бы вы объяснить, что делает строка: CommandType = CommandType.StoredProcedure? - person Andre Smith; 31.08.2013
comment
Он сообщает, что команда, которая будет выполнена, имеет тип хранимой процедуры, а не встроенный запрос. - person Ehsan; 31.08.2013

Хорошо, я нашел свою ошибку.

cmbCategory.SelectedValue не cmbCategory.ValueMember.

person Andre Smith    schedule 30.08.2013