无法使用参数化查询插入0值

时间:2017-07-11 07:04:40

标签: c# sql

我有一个库存系统,此代码适用于用户创建新项目的时间。它应该在库存表中插入一个0值,因为它是一个新项目。我的代码是:

string queryAdd4 = "INSERT INTO [inventory]([item_id],[item_qty],[item_date],[item_type]) VALUES(@myID,@myQty,@myDate,@myType)";
using (SqlCommand cmd = new SqlCommand(queryAdd4, Con))
{
cmd.Parameters.Add(new SqlParameter("@myID", item_id));
cmd.Parameters.Add(new SqlParameter("@myQty", 0));
cmd.Parameters.Add(new SqlParameter("@myDate", dateNow));
cmd.Parameters.Add(new SqlParameter("@myType", 1));
Con.Open();
cmd.ExecuteNonQuery();
Con.Close();
}

使用该代码,我收到一条错误消息:

The parameterized query '(@myID int,@myQty bigint,@myDate datetime,@myType int)
INSERT INT' expects the parameter '@myQty', which was not supplied

出于好奇,我尝试将@myQty旁边的0替换为1,查询工作没有问题。我也尝试通过服务器资源管理器手动运行查询,这也很有用。所以我猜在使用参数化查询时0不是有效数字?如果是这样,我将如何去做呢?

2 个答案:

答案 0 :(得分:0)

尝试将特定类型设置为您的参数,就像这里一样; 查看数据库并根据设置为列的类型进行设置。

string queryAdd4 = "INSERT INTO [inventory]([item_id],[item_qty],[item_date],[item_type]) VALUES(@myID,@myQty,@myDate,@myType)";
using (SqlCommand cmd = new SqlCommand(queryAdd4, Con))
{
cmd.Parameters.Add(new SqlParameter("@myID", item_id));

var parameter = new SqlParameter()
parameter.ParameterName = "@myQty";
parameter.SqlDbType = SqlDbType.Int;
parameter.Direction = ParameterDirection.Input;
parameter.Value = 0;


cmd.Parameters.Add(parameter);
cmd.Parameters.Add(new SqlParameter("@myDate", dateNow));
cmd.Parameters.Add(new SqlParameter("@myType", 1));
Con.Open();
cmd.ExecuteNonQuery();
Con.Close();

来源: 类型清单: https://msdn.microsoft.com/en-us/library/system.data.sqldbtype(v=vs.110).aspx 配置查询参数: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/configuring-parameters-and-parameter-data-types

希望它有所帮助。

答案 1 :(得分:0)

在SqlParameter构造函数中使用两个参数时,有两种选择:

SqlParameter(string parameterName, SqlDbType dbType)
SqlParameter(string parameterName, object value)

使用整数时,使用 first 选项。如果要使用两个参数构造函数,则必须将0强制转换为object

cmd.Parameters.Add(new SqlParameter("@myQty", (object)0));

另请参阅Sinatr in the comments的oneliner:

cmd.Parameters.Add(new SqlParameter("@myQty", 0) { SqlDbType = SqlDbType.Int });