C# 将新项添加到sql表时出错
我正在尝试向位于SQL数据库中的设备表添加新项。我使用的是三层架构。这个特定的add方法使用两个组合框,将它们的display成员和valuemembers设置为各自字段的ID 当我按下“添加新设备”按钮时(在所有项目都输入到文本框并选择了组合框中的值之后),我得到了错误:“输入字符串的格式不正确”。我不确定它来自何处,我的想法是它来自组合框 我的设备表包含6行 1.设备无内部自动编号 2.设备描述nvarchar 3.SerialNo nvarchar 4.条形码nvarchar 5.CategoryID nvarchar(我的类别表的fk) 5.VenueID int(我的场地桌子的fk) 我的会议桌有一个VenueID(自动编号)和一个RoomNumber(字符串) 我的分类表有一个分类ID(硬件为硬,软件为软)和描述(硬件和软件) 我的业务层包含以下代码:C# 将新项添加到sql表时出错,c#,sql,sql-server,3-tier,C#,Sql,Sql Server,3 Tier,我正在尝试向位于SQL数据库中的设备表添加新项。我使用的是三层架构。这个特定的add方法使用两个组合框,将它们的display成员和valuemembers设置为各自字段的ID 当我按下“添加新设备”按钮时(在所有项目都输入到文本框并选择了组合框中的值之后),我得到了错误:“输入字符串的格式不正确”。我不确定它来自何处,我的想法是它来自组合框 我的设备表包含6行 1.设备无内部自动编号 2.设备描述nvarchar 3.SerialNo nvarchar 4.条形码nvarchar 5.Cate
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,而不是显示的文本
谢谢你的帮助好的,我发现了我的错误
CMBCegory.SelectedValue不是CMBCegory.ValueMember。您的代码对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();
}
有两件事:在数据库中手动运行相同的查询,使用相同的值并确保它运行;其次:
Convert.ToInt32(cmbVinces.ValueMember))
…我将此更改为int.TryParse
…以确保它实际上是您正在处理的int
。谢谢。您介意解释一下:CommandType=CommandType.StoredProcedure行的作用吗?它告诉我们将要执行的命令是存储过程类型,而不是内联查询。