没有执行存储过程,为什么? 各位高手帮帮忙啊!!!
CREATE PROCEDURE [dbo].[usp_insert_wistable3] @Personid INT = null,--人员ID @Wisfield301 VARCHAR(30) = null,--子女姓名 @Wisfield302 VARCHAR(2) = null,--子女孩次 @Wisfield304 VARCHAR(10) = null,--子女性别 @Wisfield305 VARCHAR(10) = null,--子女出生政策属性 @Wisfield3a1 VARCHAR(20) = null,--生育证号 @Wisfield313 VARCHAR(10) = null,--与育龄夫妇血缘关系 @Wisfield311 DATETIME = null,--子女出生日期 @Wisfield314 VARCHAR(10) = null,--子女出生健康状况 @Wisfield316 VARCHAR(10) = null,--子女当前健康状况 @Wisfield307 VARCHAR(18) = null,--子女公民身份号码 @Wisfield317 DATETIME = null,--子女死亡日期 @Wisfield3a2 VARCHAR(10) = null,--政策外原因 @Wisfield3a3 VARCHAR(10) = null,--死亡原因 @Wisfieldsbdw CHAR(12) = null,--上报单位 @Wisfieldxgdw CHAR(12) = null,--修改单位 @Wisfieldxjdw CHAR(14) = null,--现居地单位 @Wisfieldhjdw CHAR(14) = null,--户籍地单位 @Confirmdate DATETIME = null,--确认时间 @Flag CHAR(1) = null --标志 AS SET NOCOUNT ON -- 新增 生养信息 并返回主键 INSERT WisTable3 ( personid, --人员ID wisfield301, --子女姓名 wisfield302, --子女孩次 wisfield304, --子女性别 wisfield305, --子女出生政策属性 wisfield3a1, --生育证号 wisfield313, --与育龄夫妇血缘关系 wisfield311, --子女出生日期 wisfield314, --子女出生健康状况 wisfield316, --子女当前健康状况 wisfield307, --子女公民身份号码 wisfield317, --子女死亡日期 wisfield3a2, --政策外原因 wisfield3a3, --死亡原因 wisfieldsbsj, --上报时间 wisfieldsbdw, --上报单位 wisfieldxgsj, --修改时间 wisfieldxgdw, --修改单位 wisfieldxjdw, --现居地单位 wisfieldhjdw, --户籍地单位 confirmdate, --确认时间 flag) --标志 SELECT @Personid, @Wisfield301, @Wisfield302, @Wisfield304, @Wisfield305, @Wisfield3a1, @Wisfield313, @Wisfield311, @Wisfield314, @Wisfield316, @Wisfield307, @Wisfield317, @Wisfield3a2, @Wisfield3a3, --@Wisfield3a6, getdate(), @Wisfieldsbdw, getdate(), @Wisfieldxgdw, @Wisfieldxjdw, @Wisfieldhjdw, @Confirmdate, @Flag -- 返回新增记录的主键 SELECT @@IDENTITY RETURN 0 ------------------------------------------------ GO
这是我的方法
C# code
SqlConnection conn = null; conn = new SqlConnection(ConfigurationSettings.AppSettings["connectionString"]); try { conn.Open(); SqlCommand sqlCommand = new SqlCommand("usp_insert_wistable3", conn); sqlCommand.CommandType = CommandType.StoredProcedure; SqlParameter[] param1 = new SqlParameter[] { //new SqlParameter("@returnValue",SqlDbType.Int), new SqlParameter("@Personid",FrmFind.ynInfo[0]), new SqlParameter("@Wisfield301",txtZNXM.Text), new SqlParameter("@Wisfield302","孩次"), new SqlParameter("@Wisfield304",cmbXB.Text), new SqlParameter("@Wisfield305",cmbCSZCSX.Text), new SqlParameter("@Wisfield3a1",txtSYZH.Text), new SqlParameter("@Wisfield313",cmbZNXYGX.Text), new SqlParameter("@Wisfield311",txtCSRQ.Text), new SqlParameter("@Wisfield314",cmbCSJKZK.Text), new SqlParameter("@Wisfield316",cmbDQJKZK.Text), new SqlParameter("@Wisfield307",txtGMSFZH.Text), new SqlParameter("@Wisfield317",txtSWRQ.Text), new SqlParameter("@Wisfield3a2",cmbZCWYY.Text), new SqlParameter("@Wisfield3a3",cmbSWYY.Text), new SqlParameter("@Wisfieldsbdw",txtSBDW.Text), new SqlParameter("@Wisfieldxgdw",null), new SqlParameter("@Wisfieldxjdw","现居地单位"), new SqlParameter("@Wisfieldhjdw","户籍单位"), new SqlParameter("@Confirmdate",null), new SqlParameter("@Flag",null), }; sqlCommand.Parameters.AddRange(param1); //param1[0].Direction = ParameterDirection.ReturnValue; int temp = sqlCommand.ExecuteNonQuery(); if (temp > 0) { MessageBox.Show("生养信息添加成功", "提示"); } else { MessageBox.Show("生养信息添加失败", "提示"); } }
作者: zhudashu 发布时间: 2011-01-14
作者: bdmh 发布时间: 2011-01-14
作者: zhudashu 发布时间: 2011-01-14
作者: zhudashu 发布时间: 2011-01-14
作者: TimZhuFaith 发布时间: 2011-01-14
或者看看连接字符串对不对
作者: wyfde123 发布时间: 2011-01-14
C# code
[color=#FF0000]new SqlParameter("@Flag",null)[/color] 应该是 new SqlParameter("@Flag",DBValue.Null) 同理 new SqlParameter("@Confirmdate",null),.. new SqlParameter("@Wisfieldxgdw",null),
作者: sxiaohui8709253 发布时间: 2011-01-14
作者: zhudashu 发布时间: 2011-01-14
在查询分析器里面可以插入数据,但是代码执行就不能插入了,也不报错。
作者: TimZhuFaith 发布时间: 2011-01-14
作者: zhudashu 发布时间: 2011-01-14
作者: dgitnet 发布时间: 2011-01-14
作者: tangshuinet 发布时间: 2011-01-14
是不是主鍵重復了
不会, 主键是自增长的。主键重复也会报错啊
作者: zhudashu 发布时间: 2011-01-14
去掉
作者: myemail_bake 发布时间: 2011-01-14
sqlCommand.CommandType = CommandType.StoredProcedure;
改成
SqlCommand sqlCommand = new SqlCommand("exec usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.Text;
试试看
作者: herbt 发布时间: 2011-01-14
将字段插入值,null 换成 “”
换了。都不行,我把那些参数都注释掉也插入不进去,在查询分析器里面参数都默认为null的 ,执行回插入一条空的数据,而代码还是什么都没有
作者: zhudashu 发布时间: 2011-01-14
SqlCommand sqlCommand = new SqlCommand("usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.StoredProcedure;
改成
SqlCommand sqlCommand = new SqlCommand("exec usp_insert_wistable3",……
刚刚是了下。 不可以……
作者: zhudashu 发布时间: 2011-01-14
该回复于2011-01-14 16:44:00被管理员删除
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
|
#18楼 得分:0回复于:2011-01-14 16:03:04
|
作者: dfhdhq 发布时间: 2011-01-14
lz忽略我
SET NOCOUNT ON
以后返回的都是-1
现在先不要管它返回 了几, 只要插入数据就可以了。拜托帮帮忙。。。
作者: myemail_bake 发布时间: 2011-01-14
你先去改了再回来说
作者: zhudashu 发布时间: 2011-01-14
咳咳,吐血了,
你先去改了再回来说
这个存储过程不是我写的,别人在调用的时候插入进去了。 也是用的这个存储过程。受影响行数是几应该也不影响存储过程执行插入吧。
作者: myemail_bake 发布时间: 2011-01-14
begin
declare @sql varchar(2000);
set @sql = 'insert into table() values('+@a+','+@b....';
exec(@sql)
end
试试
作者: zhudashu 发布时间: 2011-01-14
引用 20 楼 myemail_bake 的回复:
咳咳,吐血了,
你先去改了再回来说
这个存储过程不是我写的,别人在调用的时候插入进去了。 也是用的这个存储过程。受影响行数是几应该也不影响存储过程执行插入吧。
如果别人可以插入,说明你的数据有问题。
作者: tangshuinet 发布时间: 2011-01-14
你把存储过程修改成:
begin
declare @sql varchar(2000);
set @sql = 'insert into table() values('+@a+','+@b....';
exec(@sql)
end
试试
这个存储过程是大家一起在用的。他们都用的好好的。不可能因为我的错了就改掉存储过程吧。那我这个项目就挂了。
作者: tangshuinet 发布时间: 2011-01-14
2: int temp = sqlCommand.ExecuteNonQuery();
你这么写的话,因为有set nocount no,所以temp一直是-1,所以会提示不成功,明白没?
3:你去看下ExecuteNonQuery()方法
作者: zhudashu 发布时间: 2011-01-14
引用 21 楼 zhudashu 的回复:
引用 20 楼 myemail_bake 的回复:
咳咳,吐血了,
你先去改了再回来说
这个存储过程不是我写的,别人在调用的时候插入进去了。 也是用的这个存储过程。受影响行数是几应该也不影响存储过程执行插入吧。
如果别人可以插入,说明你的数据有问题。
我知道我的有问题啊 , 所以才让大家帮我看看怎么改啊
作者: myemail_bake 发布时间: 2011-01-14
usp_insert_wistable3 '','',''....
看出什么问题
作者: zhudashu 发布时间: 2011-01-14
SET NOCOUNT ON改为SET NOCOUNT OFF
大致原因如上所述。
为什么 SqlCommand.ExecuteNonQuery() 方法返回 -1?
不知道大家在使用ExecuteNonQuery方法的时候有没有碰到过返回-1的情况。ExecuteNonQuery方法返回增删改时,受影响的行数。那怎么会返回-1呢?查了一些资料后终于得知返回-1的原因。
在进行增删改时,数据库能为我们统计受影响行数的前提条件是,关闭NOCOUNT,即 Set nocount off。默认情况下,它是关闭的,即我们是可以得到受影响的行数的。你可以测试如下(加与不加set nocount on是有区别的):
SqlCommand cmd = new SqlCommand("set nocount on; insert into test values ('test')", con);
int rows = cmd.ExecuteNonQuery();有的人就说了,我仅仅是调用一个简单的存储过程,怎么还是返回-1呢?这个是由于Visual Studio引起的。
我们在Visual Studio中写了一个存储过程时,它会被默认加上set nocount on。这样就导致了调用存储过程时始终得不到影响的行数,而返回-1。
作者: myemail_bake 发布时间: 2011-01-14
作者: kdf123 发布时间: 2011-01-14
作者: zhudashu 发布时间: 2011-01-14
第一步:请楼主F11单步调试下代码。
第二步:请在执行到SqlCommod时停下来;从变量监视器中取出SqlCommand要执行的sql命令(此时的SQL命令是包含数据的完整语句)
第三步:将此SQL粘贴到SqlServer的查询管理器中,测试运行一下。
第四步:相信楼主会知道怎么做的。
作者: kdf123 发布时间: 2011-01-14
当我们在数据库操作数据时,数据库都会提示受影响行数。具体有可参见MSDN上的ExecuteNonQuery方法讲解
作者: jorln 发布时间: 2011-01-14
set nocount on 难道会影响数据操作?引用 30 楼 kdf123 的回复:
当我们在数据库操作数据时,数据库都会提示受影响行数。具体有可参见MSDN上的ExecuteNonQuery方法讲解
这个问题问的好了。 我现在不想管受影响行数。只是想知道我的数据有什么问题,插入不进去
作者: TimZhuFaith 发布时间: 2011-01-14
{
new SqlParameter("@Personid",SqlDbType.Int,4),
new SqlParameter("@Wisfield301",SqlDbType.VarChar,30)
}
para[0].Value=int.parse(FrmFind.ynInfo[0]);
para[1].Value=txtZNXM.Text;
改成这种形式的试试
作者: zhudashu 发布时间: 2011-01-14
作者: TimZhuFaith 发布时间: 2011-01-14
事实上并不影响,但它会误导ExecuteNonQuery方法,最后在客户端弹出错误信息,而实际数据可能已经加入数据库了。
我在查询分析器里面查询了的 。 没插入进去。所以现在很烦躁呢。 他也不报错,也不插入数据,都不晓得是什么原因
作者: kdf123 发布时间: 2011-01-14
作者: zhudashu 发布时间: 2011-01-14
你的主键可能有问题,它或许不是自增列?
是自增列,而且在查询分析器里面执行存储过程可以插入一条为空的数据,因为默认都是null
作者: kdf123 发布时间: 2011-01-14
引用 37 楼 kdf123 的回复:
你的主键可能有问题,它或许不是自增列?
是自增列,而且在查询分析器里面执行存储过程可以插入一条为空的数据,因为默认都是null
作者: zhudashu 发布时间: 2011-01-14
SqlCommand sqlCommand = new SqlCommand("usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.StoredProcedure;
int temp = sqlCommand.ExecuteNonQuery();
if (temp > 0)
{
MessageBox.Show("生养信息添加成功", "提示");
}
else
{
MessageBox.Show("生养信息添加失败", "提示");
}
把参数全部去掉。。。执行
作者: TimZhuFaith 发布时间: 2011-01-14
conn.Open();
SqlCommand sqlCommand = new SqlCommand("usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.StoredProcedure;
int temp = sqlCommand.Exec……
我去掉过。不可以。还重新生成了几遍还是不行。特别郁闷,我改了存储过程名字它又会提示没有找到存储过程,找到了却没有执行插入
作者: TimZhuFaith 发布时间: 2011-01-14
作者: zhudashu 发布时间: 2011-01-14
那么就要看你 传入的参数值 是否有问题
调试 监视下sqlCommand.Parameters的值 然后再把传入的值拿到查询分析器里面插入看看有没有问题
作者: TimZhuFaith 发布时间: 2011-01-14
sqlCommand.ExecuteSclar();用这个试试
为什么要用ExecuteSclar
如果用这个 ExecuteNonQuery 不行 而用ExecuteSclar 就行了
那更说明有问题了
作者: rwm5366745 发布时间: 2011-01-14