我是C#winform初学者,以下问题向各位大虾求助!C#winform 中调用预存程序:
                SqlCommand cmd = new SqlCommand("HXZTJY", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@years", SqlDbType.NVarChar ).Value = txtDate.ToString().Trim();
                cmd.Parameters.Add("@departno", SqlDbType.NVarChar).Value = txtDep.Text.ToString().Trim();
                cmd.Parameters.Add("@staffno", SqlDbType.NVarChar).Value = txtNam.Text.ToString().Trim();                int i = cmd.ExecuteNonQuery();
                conn.Dispose();
                conn.Dispose();
                conn.Close();
                MessageBox.Show("计算完成!", "系统提示");原本的预存程序 HXZTJY 是一段薪资计算的代码,我简化了内容 如下:
               CREATE    PROCEDURE [dbo].[HXZTJY]
                         @years varchar(6),
                         @departno nvarchar(6),
                         @staffno nvarchar(6)
                       AS
                         declare @begin_date datetime
                         declare @end_date    datetime 
                         declare @day float(8),
                         @Y1 float(8), --基本底薪
                         @Y2 float(8), --每月標准天數
                         @Y3 float(8), --標准工作時間
                         @Y4 float(8) --應出勤天數                       set @begin_date=convert(datetime,@years+'01')
                      set @end_date=dateadd(dd,-1,dateadd(mm,1,@begin_date)) 
                      set @Y2=21.75
                      set @Y3=8
                      set @day=day(@end_date) 
                      
                 GO
以上的预存程序我在 SQLSERVER的查询分析器中执行是没问题 ,如:exec HXZTJY'201209','Y01007','%'
加上: print @begin_date ,print @end_date 也是能打印出时间变量的值,但用在C# winform程序中就会报错:
"从字符串转换为 datetime 时发生语法错误。"

解决方案 »

  1.   

    cmd.Parameters.Add("@years", SqlDbType.NVarChar ).Value 这里还有个长度吧,你忘记设置长度了
      

  2.   

    加上长度也是一样报错:
    cmd.Parameters.Add("@years", SqlDbType.NVarChar,6).Value = txtDate.ToString().Trim();
                    cmd.Parameters.Add("@departno", SqlDbType.NVarChar,6).Value = txtDep.Text.ToString().Trim();
                    cmd.Parameters.Add("@staffno", SqlDbType.NVarChar,6).Value = txtNam.Text.ToString().Trim();
      

  3.   

    从你提示的错误看,是你 @years 在代码中传的时间值或格式有问题 ,你在sql中传的是年月格式吧'201209',但你在winfrom中传给的值得格式不知道是否是这样的格式?
      

  4.   

    txtDate文本框输入的是:201209
    txtDep文本框输入的是:Y01007
    txtNam文本框输入的是:%
    winform界面条件输入是没问题,但就是报错
      

  5.   

    cmd.Parameters.Add("@years", SqlDbType.NVarChar ).Value = txtDate.ToString().Trim();
      cmd.Parameters.Add("@departno", SqlDbType.NVarChar).Value = txtDep.Text.ToString().Trim();
      cmd.Parameters.Add("@staffno", SqlDbType.NVarChar).Value = txtNam.Text.ToString().Trim();
    -------------------CREATE PROCEDURE [dbo].[HXZTJY]
      @years varchar(6),
      @departno nvarchar(6),
      @staffno nvarchar(6)
      AS这里@years的数据类型不会一致,但我觉得c#可以进行自动转换,这里没有c#环境,测试了你的存储过程,是没有问题的,把@years类型更改为nvarchar (6)试试吧……
      

  6.   

    对,换成 varchar,
    你要保证两边一致,要么都用 varchar,要么都用 nvarchar
      

  7.   

    另外,你可以用事件跟踪器跟踪一下 sql 语句,
    这是基本的调试手段。
      

  8.   

    一般找不到出错的地方,就用事件跟踪器看一下,到底生成的sql语句是什么样的,就一目了然。
      

  9.   

     1.txtDate.ToString().Trim();---->txtDate.Text.ToString().Trim();
     2.报错说明文本框里是字符串,你直接将字符串给了时间字段,转换下格式吧。