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

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

先确认是否能添加记录,也就是你存储过程中的select是否select出数据了

作者: bdmh   发布时间: 2011-01-14

在查询分析器里面可以插入数据,但是代码执行就不能插入了,也不报错。

作者: zhudashu   发布时间: 2011-01-14

帮个忙啊。高手们。。急

作者: zhudashu   发布时间: 2011-01-14

catch 什么错误。。

作者: 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

lz是根据表数据判定的还是根据messagebox判定的
引用 2 楼 zhudashu 的回复:
在查询分析器里面可以插入数据,但是代码执行就不能插入了,也不报错。

作者: TimZhuFaith   发布时间: 2011-01-14

我查询了数据库。没插入

作者: zhudashu   发布时间: 2011-01-14

是不是主鍵重復了

作者: dgitnet   发布时间: 2011-01-14

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

作者: tangshuinet   发布时间: 2011-01-14

引用 10 楼 dgitnet 的回复:

是不是主鍵重復了

不会, 主键是自增长的。主键重复也会报错啊

作者: zhudashu   发布时间: 2011-01-14

SET NOCOUNT ON
 去掉

作者: myemail_bake   发布时间: 2011-01-14

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

引用 11 楼 tangshuinet 的回复:

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

换了。都不行,我把那些参数都注释掉也插入不进去,在查询分析器里面参数都默认为null的 ,执行回插入一条空的数据,而代码还是什么都没有

作者: zhudashu   发布时间: 2011-01-14

引用 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

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

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#18楼 得分:0回复于:2011-01-14 16:03:04
lz忽略我
SET NOCOUNT ON
以后返回的都是-1

作者: dfhdhq   发布时间: 2011-01-14

引用 18 楼 myemail_bake 的回复:

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

  现在先不要管它返回 了几, 只要插入数据就可以了。拜托帮帮忙。。。

作者: myemail_bake   发布时间: 2011-01-14

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

作者: zhudashu   发布时间: 2011-01-14

引用 20 楼 myemail_bake 的回复:

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

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

作者: 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

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

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

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


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

作者: tangshuinet   发布时间: 2011-01-14

引用 22 楼 tangshuinet 的回复:

你把存储过程修改成:

begin

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

end
试试


这个存储过程是大家一起在用的。他们都用的好好的。不可能因为我的错了就改掉存储过程吧。那我这个项目就挂了。

作者: tangshuinet   发布时间: 2011-01-14

1:先去看下数据库是否插进去了
2: int temp = sqlCommand.ExecuteNonQuery();
你这么写的话,因为有set nocount no,所以temp一直是-1,所以会提示不成功,明白没?
3:你去看下ExecuteNonQuery()方法 
   

作者: zhudashu   发布时间: 2011-01-14

引用 23 楼 tangshuinet 的回复:

引用 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

当我们在数据库操作数据时,数据库都会提示受影响行数。具体有可参见MSDN上的ExecuteNonQuery方法讲解

作者: zhudashu   发布时间: 2011-01-14

俺也来献下丑:

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

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

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

第四步:相信楼主会知道怎么做的。

作者: kdf123   发布时间: 2011-01-14

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

作者: jorln   发布时间: 2011-01-14

引用 32 楼 timzhufaith 的回复:

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

这个问题问的好了。 我现在不想管受影响行数。只是想知道我的数据有什么问题,插入不进去

作者: TimZhuFaith   发布时间: 2011-01-14

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

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

作者: TimZhuFaith   发布时间: 2011-01-14

引用 35 楼 kdf123 的回复:

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

 
 我在查询分析器里面查询了的 。 没插入进去。所以现在很烦躁呢。 他也不报错,也不插入数据,都不晓得是什么原因

作者: kdf123   发布时间: 2011-01-14

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

作者: zhudashu   发布时间: 2011-01-14

引用 37 楼 kdf123 的回复:

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

是自增列,而且在查询分析器里面执行存储过程可以插入一条为空的数据,因为默认都是null

作者: kdf123   发布时间: 2011-01-14

你用相同测试数据。。。。测试
引用 38 楼 zhudashu 的回复:
引用 37 楼 kdf123 的回复:

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

是自增列,而且在查询分析器里面执行存储过程可以插入一条为空的数据,因为默认都是null

作者: zhudashu   发布时间: 2011-01-14

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

引用 40 楼 timzhufaith 的回复:

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

我去掉过。不可以。还重新生成了几遍还是不行。特别郁闷,我改了存储过程名字它又会提示没有找到存储过程,找到了却没有执行插入

作者: TimZhuFaith   发布时间: 2011-01-14

sqlCommand.ExecuteSclar();用这个试试

作者: zhudashu   发布时间: 2011-01-14

方法没什么问题 存储过程别人插入都行

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

 调试 监视下sqlCommand.Parameters的值 然后再把传入的值拿到查询分析器里面插入看看有没有问题

作者: TimZhuFaith   发布时间: 2011-01-14

引用 42 楼 timzhufaith 的回复:
sqlCommand.ExecuteSclar();用这个试试


为什么要用ExecuteSclar

如果用这个 ExecuteNonQuery 不行 而用ExecuteSclar 就行了
那更说明有问题了

作者: rwm5366745   发布时间: 2011-01-14