0

SQL データベースにある Equipment テーブルに新しい項目を追加しようとしています。3 層アーキテクチャを使用しています。この特定の add メソッドでは、表示メンバーが設定され、値メンバーがそれぞれのフィールドの ID に設定された 2 つのコンボボックスを使用します。

新しい機器の追加ボタンを押すと、「入力文字列が正しい形式ではありませんでした」というエラーが表示されます (すべてのアイテムがテキストボックスに入力され、コンボボックスからの値が選択された後)。どこにあるのかわかりませんそれはコンボボックスから来ているというのが私の考えです。

私の機器テーブルには6行が含まれています。

1.EquipmentNo int autonumber 2.EquipmentDesc nvarchar 3.SerialNo nvarchar 4.Barcode nvarchar 5.CategoryID nvarchar (Category テーブルの fk) 5.VenueID int (Venue テーブルの fk)

Venue テーブルには VenueID (autonumber) と RoomNumber(string) があります。私の Category テーブルには CategoryID (Hard for Hardware と Soft for Software) と Desription (Hardware and Software) があります。

私のビジネスレイヤーには、次のコードが含まれています。

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

表示されたテキストではなく、2 つのコンボボックスの ID を返したいです。

助けてくれてありがとう

4

2 に答える 2

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();
}
于 2013-08-30T15:22:55.993 に答える
0

OK、エラーが見つかりました。

cmbCategory.SelectedValue が cmbCategory.ValueMember ではありません。

于 2013-08-30T15:22:50.593 に答える