2013-08-30 4 views
0

Я пытаюсь добавить новый элемент в свою таблицу оборудования, расположенную в моей базе данных SQL. Я использую 3 уровня архитектуры. В этом конкретном методе добавления используются два comboboxes с установленными элементами отображения, а их учетные записи устанавливаются в ID соответствующих полей.Ошибка добавления нового элемента в таблицу sql

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

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

1.EquipmentNo INT AutoNumber 2.EquipmentDesc NVARCHAR 3.SerialNo NVARCHAR 4.Barcode nvarchar 5.CategoryID nvarchar (fk моей таблицы категорий) 5.VenueID Int (Ф.К. моей Venue таблицы)

мое Места таблица имеет VenueID (Autonumber) и 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(); 

мои ComboBoxes заполняются метод загрузки страницы:

 //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"; 

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

Благодарим Вас за помощь

+1

Ну две вещи: запустить тот же запрос в базу данных вручную, используя одни и те же значения, и убедитесь, что он работает, и во-вторых, : 'Convert.ToInt32 (cmbVenues.ValueMember)) ... Я бы изменил это на' int.TryParse' ..., чтобы убедиться, что это фактически 'int', с которым вы имеете дело. – Arran

ответ

0

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

cmbCategory.SelectedValue not cmbCategory.ValueMember.

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

Спасибо. Не могли бы вы объяснить, что делает строка: CommandType = CommandType.StoredProcedure? –

+1

Сообщается, что команда, которая будет выполнена, имеет тип хранимой процедуры, а не встроенный запрос. – Ehsan