我是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 时发生语法错误。"
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 时发生语法错误。"
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();
txtDep文本框输入的是:Y01007
txtNam文本框输入的是:%
winform界面条件输入是没问题,但就是报错
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)试试吧……
你要保证两边一致,要么都用 varchar,要么都用 nvarchar
这是基本的调试手段。
2.报错说明文本框里是字符串,你直接将字符串给了时间字段,转换下格式吧。