必须声明标量变量 "@XXX"。

aqgsh 2012-01-21 12:37:03
错误如题?具体情况是这样的:
请看C#代码:

using (SqlConnection cn = db.conn())
{
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = @"INSERT INTO jc_WrongPaper ([userName],[libraryID],[mainPID],[lowerPID],[userAnswer])
VALUES
(@userName,@libraryID,@mainPID,@lowerPID,@userAnswer)";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@userName", wpM.userName));
cmd.Parameters.Add(new SqlParameter("@libraryID",SqlDbType.Int));
cmd.Parameters["@libraryID"].Value = wpM.libraryID;
cmd.Parameters.Add(new SqlParameter("@mainPID", SqlDbType.Int));
cmd.Parameters["@mainPID"].Value = wpM.mainPID;
if (wpM.lowerPID != 0)//请注意这里
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
}
cmd.Parameters.Add(new SqlParameter("@userAnswer", wpM.userAnswer));
cn.Open();
cmd.ExecuteNonQuery();
}

说明:
数据库中lowerPID这个字段是int型,可以为空,我原本想是如果传递过来的lowerPID为0,则这个字段不插入值,但是会报错,错误为:
必须声明标量变量 "@lowerPID"。
网上找了一下,应该是@lowerPID必须传值,有人推荐用字符串拼接方式来生成sql语句,但是我不想这样,不知道有没有解决办法,请高手赐教!!!

如能解决,80%分数归你!
...全文
759 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2012-01-21
  • 打赏
  • 举报
回复
if (wpM.lowerPID != 0)//请注意这里
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
}
else
{
cmd.CommandText = cmd.CommandText.Replace("[lowerPID],", "");
cmd.CommandText = cmd.CommandText.Replace("@lowerPID,", "");
}
aqgsh 2012-01-21
  • 打赏
  • 举报
回复
感谢yanbuodiao这位朋友,你的方法可行。不过由于其他的朋友都积极帮助,我也会给他们适当的分数。谢谢!
fest 2012-01-21
  • 打赏
  • 举报
回复
存储过程的变量声明时给@lowerPID设置个默认值,
如:
@lowerPID int = null,
这样在C#中如果没有给@lowerPID设置,则会使用默认值。
p2227 2012-01-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yanbuodiao 的回复:]

修改后的
C# code

using (SqlConnection cn = db.conn())
{
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = @"INSERT INTO jc_WrongPaper ([userName],[libraryID],[mainPID],[lowerPID],[use……
[/Quote]这下是一样的了
烟波钓 2012-01-21
  • 打赏
  • 举报
回复
我去 大牛们都在家了?手慢了
烟波钓 2012-01-21
  • 打赏
  • 举报
回复
修改后的

using (SqlConnection cn = db.conn())
{
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = @"INSERT INTO jc_WrongPaper ([userName],[libraryID],[mainPID],[lowerPID],[userAnswer])
VALUES
(@userName,@libraryID,@mainPID,@lowerPID,@userAnswer)";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@userName", wpM.userName));
cmd.Parameters.Add(new SqlParameter("@libraryID",SqlDbType.Int));
cmd.Parameters["@libraryID"].Value = wpM.libraryID;
cmd.Parameters.Add(new SqlParameter("@mainPID", SqlDbType.Int));
cmd.Parameters["@mainPID"].Value = wpM.mainPID;
if (wpM.lowerPID != 0)//请注意这里
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
}
else
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", DBNull.Value));
}
cmd.Parameters.Add(new SqlParameter("@userAnswer", wpM.userAnswer));
cn.Open();
cmd.ExecuteNonQuery();
}



p2227 2012-01-21
  • 打赏
  • 举报
回复
反正思路差不多吧,因为我不能100%模拟你的环境,我这边根据我的环境是可以插入的
                if (wpM.lowerPID == 0)
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", DBNull.Value));
}
else
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = Int32.Parse(wpM.lowerPID);
}
烟波钓 2012-01-21
  • 打赏
  • 举报
回复

using (SqlConnection cn = db.conn())
{
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = @"INSERT INTO jc_WrongPaper ([userName],[libraryID],[mainPID],[lowerPID],[userAnswer])
VALUES
(@userName,@libraryID,@mainPID,@lowerPID,@userAnswer)";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@userName", wpM.userName));
cmd.Parameters.Add(new SqlParameter("@libraryID",SqlDbType.Int));
cmd.Parameters["@libraryID"].Value = wpM.libraryID;
cmd.Parameters.Add(new SqlParameter("@mainPID", SqlDbType.Int));
cmd.Parameters["@mainPID"].Value = wpM.mainPID;
if (wpM.lowerPID != 0)//请注意这里 按照你的意思你这个东西是0的时候就不走这里啊
{ //但是你Sql语句中又有这个变量 不是很变态么 也就是说你的这个值不
//是0的时候就不报错吧?
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
}
cmd.Parameters.Add(new SqlParameter("@userAnswer", wpM.userAnswer));
cn.Open();
cmd.ExecuteNonQuery();
}
机器人 2012-01-21
  • 打赏
  • 举报
回复
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));

if (wpM.lowerPID != 0)//请注意这里
{
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
}
else
{
cmd.Parameters["@lowerPID"].Value = Convert.DBNull.Value;
}
aqgsh 2012-01-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]
if (wpM.lowerPID != 0)//请注意这里
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
}
else
{
cmd.CommandText = cm……
[/Quote]

你这改法错误还是一样的哦
aqgsh 2012-01-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 p2227 的回复:]
C# code
if (wpM.lowerPID != 0)//请注意这里
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
……
[/Quote]

你好,这种改法,编译通不过哦,提示:

无法确定条件表达式的类型,因为“System.DBNull”和“int”之间没有隐式转换
myhope88 2012-01-21
  • 打赏
  • 举报
回复
判断一下就行了嘛
快乐的小二兔 2012-01-21
  • 打赏
  • 举报
回复
好吧 前面都写对了。。
naonaoye 2012-01-21
  • 打赏
  • 举报
回复
可以为空也要插入""





----------------------------------签----------名----------栏----------------------------------
2012,新年快乐,^_^
p2227 2012-01-21
  • 打赏
  • 举报
回复
if (wpM.lowerPID != 0)//请注意这里      
{
cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID;
}


替换成
        cmd.Parameters.Add(new SqlParameter("@lowerPID", SqlDbType.Int));
cmd.Parameters["@lowerPID"].Value = wpM.lowerPID==0 ? DBNull.Value : wpM.lowerPID;

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧