用户名: 密码: 忘记密码? 注册
收藏此问题 发表新评论

没有执行存储过程,为什么? 各位高手帮帮忙啊!!!

SQL code
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 15:10:36
先确认是否能添加记录,也就是你存储过程中的select是否select出数据了
昵称: bdmh  时间: 2011-01-14 15:14:06
在查询分析器里面可以插入数据,但是代码执行就不能插入了,也不报错。
昵称: zhudashu  时间: 2011-01-14 15:16:24
帮个忙啊。高手们。。急
昵称: zhudashu  时间: 2011-01-14 15:25:29
catch 什么错误。。
昵称: TimZhuFaith  时间: 2011-01-14 15:31:39
代码没有问题的,你调试下

或者看看连接字符串对不对
昵称: wyfde123  时间: 2011-01-14 15:39:08
问题可能在这里
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 15:39:54
数据库连接都没错。我试着改了存储过程名字的话就抱错说没有找到存储过程。正确的名字不报错。但是就是没执行插入
昵称: zhudashu  时间: 2011-01-14 15:40:55
lz是根据表数据判定的还是根据messagebox判定的
引用 2 楼 zhudashu 的回复:
在查询分析器里面可以插入数据,但是代码执行就不能插入了,也不报错。
昵称: TimZhuFaith  时间: 2011-01-14 15:46:22
我查询了数据库。没插入
昵称: zhudashu  时间: 2011-01-14 15:48:45
是不是主鍵重復了
昵称: dgitnet  时间: 2011-01-14 15:49:13
将字段插入值,null 换成 “”
昵称: tangshuinet  时间: 2011-01-14 15:52:12
引用 10 楼 dgitnet 的回复:

是不是主鍵重復了

不会, 主键是自增长的。主键重复也会报错啊
昵称: zhudashu  时间: 2011-01-14 15:52:33
SET NOCOUNT ON
 去掉
昵称: myemail_bake  时间: 2011-01-14 15:54:07
SqlCommand sqlCommand = new SqlCommand("usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.StoredProcedure;

改成
SqlCommand sqlCommand = new SqlCommand("exec usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.Text;

试试看
昵称: herbt  时间: 2011-01-14 15:54:16
引用 11 楼 tangshuinet 的回复:

将字段插入值,null 换成 “”

换了。都不行,我把那些参数都注释掉也插入不进去,在查询分析器里面参数都默认为null的 ,执行回插入一条空的数据,而代码还是什么都没有
昵称: zhudashu  时间: 2011-01-14 15:55:40
引用 14 楼 herbt 的回复:

SqlCommand sqlCommand = new SqlCommand("usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.StoredProcedure;

改成
SqlCommand sqlCommand = new SqlCommand("exec usp_insert_wistable3",……

刚刚是了下。 不可以……
昵称: zhudashu  时间: 2011-01-14 16:00:08

该回复于2011-01-14 16:44:00被管理员删除

#18楼 得分:0回复于:2011-01-14 16:03:04
lz忽略我
SET NOCOUNT ON
以后返回的都是-1
昵称: dfhdhq  时间: 2011-01-14 16:01:22
引用 18 楼 myemail_bake 的回复:

lz忽略我
SET NOCOUNT ON
以后返回的都是-1

  现在先不要管它返回 了几, 只要插入数据就可以了。拜托帮帮忙。。。
昵称: myemail_bake  时间: 2011-01-14 16:03:04
咳咳,吐血了,
你先去改了再回来说
昵称: zhudashu  时间: 2011-01-14 16:04:46
引用 20 楼 myemail_bake 的回复:

咳咳,吐血了,
你先去改了再回来说

这个存储过程不是我写的,别人在调用的时候插入进去了。 也是用的这个存储过程。受影响行数是几应该也不影响存储过程执行插入吧。
昵称: myemail_bake  时间: 2011-01-14 16:05:57
你把存储过程修改成:

begin

 declare @sql varchar(2000);
 set @sql = 'insert into table() values('+@a+','+@b....';
 exec(@sql)

end
试试
昵称: zhudashu  时间: 2011-01-14 16:11:57
引用 21 楼 zhudashu 的回复:
引用 20 楼 myemail_bake 的回复:

咳咳,吐血了,
你先去改了再回来说

这个存储过程不是我写的,别人在调用的时候插入进去了。 也是用的这个存储过程。受影响行数是几应该也不影响存储过程执行插入吧。


如果别人可以插入,说明你的数据有问题。
昵称: tangshuinet  时间: 2011-01-14 16:13:41
引用 22 楼 tangshuinet 的回复:

你把存储过程修改成:

begin

declare @sql varchar(2000);
set @sql = 'insert into table() values('+@a+','+@b....';
exec(@sql)

end
试试


这个存储过程是大家一起在用的。他们都用的好好的。不可能因为我的错了就改掉存储过程吧。那我这个项目就挂了。
昵称: tangshuinet  时间: 2011-01-14 16:14:39
1:先去看下数据库是否插进去了
2: int temp = sqlCommand.ExecuteNonQuery();
你这么写的话,因为有set nocount no,所以temp一直是-1,所以会提示不成功,明白没?
3:你去看下ExecuteNonQuery()方法 
   
昵称: zhudashu  时间: 2011-01-14 16:15:58
引用 23 楼 tangshuinet 的回复:

引用 21 楼 zhudashu 的回复:
引用 20 楼 myemail_bake 的回复:

咳咳,吐血了,
你先去改了再回来说

这个存储过程不是我写的,别人在调用的时候插入进去了。 也是用的这个存储过程。受影响行数是几应该也不影响存储过程执行插入吧。


如果别人可以插入,说明你的数据有问题。

 
我知道我的有问题啊 , 所以才让大家帮我看看怎么改啊
昵称: myemail_bake  时间: 2011-01-14 16:16:30
如果没插进去,你可以试着
usp_insert_wistable3 '','',''....
看出什么问题
昵称: zhudashu  时间: 2011-01-14 16:17:08
史上最详细最诲人不倦的讲解:
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 16:19:31
怎么都在说影响行数的问题呢? 我觉得我获取受影响行数跟插入数据插不插到进应该没什么关系啊
昵称: kdf123  时间: 2011-01-14 16:27:53
当我们在数据库操作数据时,数据库都会提示受影响行数。具体有可参见MSDN上的ExecuteNonQuery方法讲解
昵称: zhudashu  时间: 2011-01-14 16:32:48
俺也来献下丑:

第一步:请楼主F11单步调试下代码。

第二步:请在执行到SqlCommod时停下来;从变量监视器中取出SqlCommand要执行的sql命令(此时的SQL命令是包含数据的完整语句)

第三步:将此SQL粘贴到SqlServer的查询管理器中,测试运行一下。

第四步:相信楼主会知道怎么做的。
昵称: kdf123  时间: 2011-01-14 16:38:37
set nocount on 难道会影响数据操作?
引用 30 楼 kdf123 的回复:
当我们在数据库操作数据时,数据库都会提示受影响行数。具体有可参见MSDN上的ExecuteNonQuery方法讲解
昵称: jorln  时间: 2011-01-14 16:40:01
引用 32 楼 timzhufaith 的回复:

set nocount on 难道会影响数据操作?引用 30 楼 kdf123 的回复:
当我们在数据库操作数据时,数据库都会提示受影响行数。具体有可参见MSDN上的ExecuteNonQuery方法讲解

这个问题问的好了。 我现在不想管受影响行数。只是想知道我的数据有什么问题,插入不进去
昵称: TimZhuFaith  时间: 2011-01-14 16:42:53
SqlParameter [] para=
{
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 16:45:33
事实上并不影响,但它会误导ExecuteNonQuery方法,最后在客户端弹出错误信息,而实际数据可能已经加入数据库了。
昵称: TimZhuFaith  时间: 2011-01-14 16:49:29
引用 35 楼 kdf123 的回复:

事实上并不影响,但它会误导ExecuteNonQuery方法,最后在客户端弹出错误信息,而实际数据可能已经加入数据库了。

 
 我在查询分析器里面查询了的 。 没插入进去。所以现在很烦躁呢。 他也不报错,也不插入数据,都不晓得是什么原因
昵称: kdf123  时间: 2011-01-14 16:50:30
你的主键可能有问题,它或许不是自增列?
昵称: zhudashu  时间: 2011-01-14 16:57:59
引用 37 楼 kdf123 的回复:

你的主键可能有问题,它或许不是自增列?

是自增列,而且在查询分析器里面执行存储过程可以插入一条为空的数据,因为默认都是null
昵称: kdf123  时间: 2011-01-14 17:01:57
你用相同测试数据。。。。测试
引用 38 楼 zhudashu 的回复:
引用 37 楼 kdf123 的回复:

你的主键可能有问题,它或许不是自增列?

是自增列,而且在查询分析器里面执行存储过程可以插入一条为空的数据,因为默认都是null
昵称: zhudashu  时间: 2011-01-14 17:11:17
conn.Open();
  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 17:13:12
引用 40 楼 timzhufaith 的回复:

conn.Open();
SqlCommand sqlCommand = new SqlCommand("usp_insert_wistable3", conn);
sqlCommand.CommandType = CommandType.StoredProcedure;
int temp = sqlCommand.Exec……

我去掉过。不可以。还重新生成了几遍还是不行。特别郁闷,我改了存储过程名字它又会提示没有找到存储过程,找到了却没有执行插入
昵称: TimZhuFaith  时间: 2011-01-14 17:14:17
sqlCommand.ExecuteSclar();用这个试试
昵称: zhudashu  时间: 2011-01-14 17:23:09
方法没什么问题 存储过程别人插入都行

那么就要看你 传入的参数值 是否有问题  

 调试 监视下sqlCommand.Parameters的值 然后再把传入的值拿到查询分析器里面插入看看有没有问题
昵称: TimZhuFaith  时间: 2011-01-14 17:32:31
引用 42 楼 timzhufaith 的回复:
sqlCommand.ExecuteSclar();用这个试试


为什么要用ExecuteSclar

如果用这个 ExecuteNonQuery 不行 而用ExecuteSclar 就行了
那更说明有问题了
昵称: rwm5366745  时间: 2011-01-14 17:36:38
发表评论
昵称:
内容:
验证: