列不允许有空值。INSERT 失败的问题

lishan_77 2011-05-18 01:38:18
建立了一个存储过程:ALTER PROCEDURE [dbo].employeeInsert
@em_id int OUTPUT,
@name varchar(50),
@u_id int,
@dep_id int,
@gend int,
@birth datetime,
@mar int,
@native varchar(50),
@na_id int,
@hukou varchar(50),
@v_id int,
@idcard varchar(50),
@health varchar(50),
@phone varchar(50),
@mob varchar(50),
@mail varchar(50),
@school varchar(50),
@spec varchar(50),
@learn varchar(50),
@degree varchar(50),
@language varchar(50),
@lanlevel varchar(50),
@com varchar(50),
@comgood varchar(50),
@address varchar(50),
@em_add varchar(50),
@workdate datetime,
@regtime datetime,
@regper varchar(50),
@photo varchar(50)
AS
SET NOCOUNT ON
insert into employee
(
[em_id],
[name],
[u_id],
[dep_id],
[gend],
[birth],
[mar],
[native],
[na_id],
[hukou],
[v_id],
[idcard],
[health],
[phone],
[mob],
[mail],
[school],
[spec],
[learn],
[degree],
[language],
[lanlevel],
[com],
[comgood],
[address],
[em_add],
[workdate],
[regtime],
[regper],
[photo]
)
values
(
@em_id,
@name,
@u_id,
@dep_id,
@gend,
@birth,
@mar,
@native,
@na_id,
@hukou,
@v_id,
@idcard,
@health,
@phone,
@mob,
@mail,
@school,
@spec,
@learn,
@degree,
@language,
@lanlevel,
@com,
@comgood,
@address,
@em_add,
@workdate,
@regtime,
@regper,
@photo
)set @em_id=scope_identity()
return @@error

表enployee的主键是em_id ,标识设置为否
用 retval = cmd.ExecuteNonQuery();操作数据库
检查了下cmd属性,connection, (commandType, commandText都正常,commandParameters中各个item都有值
但是执行的时候,报错:不能将值 NULL 插入列 'em_id',表 'OA_DB.dbo.employee';列不允许有空值。INSERT 失败。
语句已终止。
cmd.parameters里面@em_id是有值的,
请问怎么回事啊。
...全文
1200 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yibey 的回复:]
但是查来查去,从头到尾,只有在执行完数据库操作之后丢失了,不知道怎么丢失的这个我觉得好理解啊因为你插入失败了那么 返回值自值set @em_id=scope_identity() 肯定为null的了
[/Quote]
谢谢你,我找到原因了
由于以前设为标识列,在增加时要自动添加em_id,为了获得自动增加的em_id,在存储过程中,把@em_id设为output了,取消标识列后,忘记删掉这个output了,就这么简单

还是要谢谢你啊
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yibey 的回复:]
首先看看代码是没问题的我只想知道在cmd.ExecuteNonQuery()的时候,
@em_id的参数值,。。。还有是即使这个值是对的话,执行之后也会有问题的

因为你是非标识的主键字段set @em_id=scope_identity() 如果插入成功后,这个值是NULL。而不是你需要的插入的最后一条记录的ID
[/Quote]
嗯,这个我也注意到了,cmd.ExecuteNonQuery()执行前值是存在的
执行之后确实为空,但是这个不是问题所在,事实上,我改成非标识之后就删掉了set @em_id=scope_identity()实验过的
yibey 2011-05-18
  • 打赏
  • 举报
回复
但是查来查去,从头到尾,只有在执行完数据库操作之后丢失了,不知道怎么丢失的这个我觉得好理解啊因为你插入失败了那么 返回值自值set @em_id=scope_identity() 肯定为null的了
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yibey 的回复:]
光从问题本身看是@em_id 这个参数没传
[/Quote]
是啊,从提示来讲就是这个意思
但是查来查去,从头到尾,只有在执行完数据库操作之后丢失了,不知道怎么丢失的
duzhaolan 2011-05-18
  • 打赏
  • 举报
回复
学习了
yibey 2011-05-18
  • 打赏
  • 举报
回复
光从问题本身看是@em_id 这个参数没传
yibey 2011-05-18
  • 打赏
  • 举报
回复
首先看看代码是没问题的我只想知道在cmd.ExecuteNonQuery()的时候,
@em_id的参数值,。。。还有是即使这个值是对的话,执行之后也会有问题的

因为你是非标识的主键字段set @em_id=scope_identity() 如果插入成功后,这个值是NULL。而不是你需要的插入的最后一条记录的ID
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
而且,我觉得程序是没什么问题的,主要是表和存储过程
表以前把em_id设为标识列自增的,后来因为需求的原因,要自己填,所以取消了标识,修改了下存储过程,把自己填的em_id传过来的
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
大哥,这个是c#的
jxqn_liu 2011-05-18
  • 打赏
  • 举报
回复
建议LZ去JAVA版区问问吧
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yibey 的回复:]
你在断点设置到PrepareCommand 这个函数之后看的时候看看参数看
[/Quote]
就是运行过这个函数之后,查看的cmd的参数,确实有值的

yibey 2011-05-18
  • 打赏
  • 举报
回复
你在断点设置到PrepareCommand 这个函数之后看的时候看看参数看
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
发错了,前面那个
public int Insert(employee employee)
{
string sqlCommand = "employeeInsert";
int res;
SqlParameter[] param ={
new SqlParameter("@em_id",SqlDbType.Int),
new SqlParameter("@name",SqlDbType.VarChar),
new SqlParameter("@u_id", SqlDbType.Int),
new SqlParameter("@dep_id",SqlDbType.Int),
new SqlParameter("@gend",SqlDbType.Int),
new SqlParameter("@birth",SqlDbType.DateTime),
new SqlParameter("@mar",SqlDbType.Int),
new SqlParameter("@native",SqlDbType.VarChar),
new SqlParameter("@na_id",SqlDbType.Int),
new SqlParameter("@hukou",SqlDbType.VarChar),
new SqlParameter("@v_id",SqlDbType.Int),
new SqlParameter("@idcard",SqlDbType.VarChar),
new SqlParameter("@health",SqlDbType.VarChar),
new SqlParameter("@phone",SqlDbType.VarChar),
new SqlParameter("@mob",SqlDbType.VarChar),
new SqlParameter("@mail",SqlDbType.VarChar),
new SqlParameter("@school",SqlDbType.VarChar),
new SqlParameter("@spec",SqlDbType.VarChar),
new SqlParameter("@learn",SqlDbType.VarChar),
new SqlParameter("@degree",SqlDbType.VarChar),
new SqlParameter("@language",SqlDbType.VarChar),
new SqlParameter("@lanlevel",SqlDbType.VarChar),
new SqlParameter("@com",SqlDbType.VarChar),
new SqlParameter("@comgood",SqlDbType.VarChar),
new SqlParameter("@address",SqlDbType.VarChar),
new SqlParameter("@em_add",SqlDbType.VarChar),
new SqlParameter("@workdate",SqlDbType.DateTime),
new SqlParameter("@regtime",SqlDbType.DateTime),
new SqlParameter("@regper",SqlDbType.VarChar),
new SqlParameter("@photo",SqlDbType.VarChar)
};
param[0].Direction = ParameterDirection.Output;
param[0].Value = employee.em_id;
param[1].Value = employee.name;
param[2].Value = employee.u_id;
param[3].Value = employee.dep_id;
param[4].Value = employee.gend;
param[5].Value = employee.birth;
param[6].Value = employee.mar;
param[7].Value = employee.native;
param[8].Value = employee.na_id; ;
param[9].Value = employee.hukou;
param[10].Value = employee.v_id;
param[11].Value = employee.idcard;
param[12].Value = employee.health;
param[13].Value = employee.phone; ;
param[14].Value = employee.mob;
param[15].Value = employee.mail;
param[16].Value = employee.school;
param[17].Value = employee.spec;
param[18].Value = employee.learn;
param[19].Value = employee.degree;
param[20].Value = employee.language;
param[21].Value = employee.lanlevel;
param[22].Value = employee.com;
param[23].Value = employee.comgood;
param[24].Value = employee.address;
param[25].Value = employee.em_add;
param[26].Value = employee.workdate;
param[27].Value = employee.regtime;
param[28].Value = employee.regper;
param[29].Value = employee.photo;

res = SqlHelper.ExecuteNonQuery(Conn.SqlConn, CommandType.StoredProcedure, sqlCommand, param);
return res;
}
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
//create a command and prepare it for execution
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);

//finally, execute the command.
int retval;
try
{
retval = cmd.ExecuteNonQuery();
}
catch
{
throw;
}

// detach the SqlParameters from the command object, so they can be used again.
cmd.Parameters.Clear();
return retval;
}
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yibey 的回复:]
可以吧你程序的代码贴出来看看
[/Quote]
那个有点多了啊
public int Insert(SqlTransaction sp, employee employee)
{
string sqlCommand = "employeeInsert";
int res;
SqlParameter[] param ={
new SqlParameter("@em_id",SqlDbType.Int),
new SqlParameter("@name",SqlDbType.VarChar),
new SqlParameter("@u_id", SqlDbType.Int),
new SqlParameter("@dep_id",SqlDbType.Int),
new SqlParameter("@gend",SqlDbType.Int),
new SqlParameter("@birth",SqlDbType.DateTime),
new SqlParameter("@mar",SqlDbType.Int),
new SqlParameter("@native",SqlDbType.VarChar),
new SqlParameter("@na_id",SqlDbType.Int),
new SqlParameter("@hukou",SqlDbType.VarChar),
new SqlParameter("@v_id",SqlDbType.Int),
new SqlParameter("@idcard",SqlDbType.VarChar),
new SqlParameter("@health",SqlDbType.VarChar),
new SqlParameter("@phone",SqlDbType.VarChar),
new SqlParameter("@mob",SqlDbType.VarChar),
new SqlParameter("@mail",SqlDbType.VarChar),
new SqlParameter("@school",SqlDbType.VarChar),
new SqlParameter("@spec",SqlDbType.VarChar),
new SqlParameter("@learn",SqlDbType.VarChar),
new SqlParameter("@degree",SqlDbType.VarChar),
new SqlParameter("@language",SqlDbType.VarChar),
new SqlParameter("@lanlevel",SqlDbType.VarChar),
new SqlParameter("@com",SqlDbType.VarChar),
new SqlParameter("@comgood",SqlDbType.VarChar),
new SqlParameter("@address",SqlDbType.VarChar),
new SqlParameter("@em_add",SqlDbType.VarChar),
new SqlParameter("@workdate",SqlDbType.DateTime),
new SqlParameter("@regtime",SqlDbType.DateTime),
new SqlParameter("@regper",SqlDbType.VarChar),
new SqlParameter("@photo",SqlDbType.VarChar)
};
param[0].Direction = ParameterDirection.Output;
param[1].Value = employee.u_id;
param[2].Value = employee.dep_id;
param[3].Value = employee.gend;
param[4].Value = employee.birth;
param[5].Value = employee.mar;
param[6].Value = employee.native;
param[7].Value = employee.na_id; ;
param[8].Value = employee.hukou;
param[9].Value = employee.v_id;
param[10].Value = employee.idcard;
param[11].Value = employee.health;
param[12].Value = employee.phone; ;
param[13].Value = employee.mob;
param[14].Value = employee.mail;
param[15].Value = employee.school;
param[16].Value = employee.spec;
param[17].Value = employee.learn;
param[18].Value = employee.degree;
param[19].Value = employee.language;
param[20].Value = employee.lanlevel;
param[21].Value = employee.com;
param[22].Value = employee.comgood;
param[23].Value = employee.address;
param[24].Value = employee.em_add;
param[25].Value = employee.workdate;
param[26].Value = employee.regtime;
param[27].Value = employee.regper;
param[28].Value = employee.photo;
res = SqlHelper.ExecuteNonQuery(sp, CommandType.StoredProcedure, sqlCommand, param);
return res;
}
  • 打赏
  • 举报
回复
代码。
yibey 2011-05-18
  • 打赏
  • 举报
回复
可以吧你程序的代码贴出来看看

lishan_77 2011-05-18
  • 打赏
  • 举报
回复
上面的监视看到cmd.parameters[0].value=101,确实是有的
发现执行cmd.ExecuteNonQuery()后,parameters里面其他列没有变化,只是[0],也就是{@em_id}的值变成{}了
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jxqn_liu 的回复:]
你打印下你那cmd.parameters里面@em_id是有值,是不是存在的
[/Quote]
lishan_77 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jxqn_liu 的回复:]
应该是你在程序中取em_id没有取到,所以是空值
[/Quote]
程序中取到了,cmd.parameters里面@em_id.value不是空
加载更多回复(3)

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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