C# 从存储过程返回变量
我需要一个员工的开始日期。我试图做的是,当选中复选框时,调用数据库获取日期并将其返回到我的C#代码中。我想我的一切设置都接近完美,但我的调用过程返回了一个错误。有人能帮我设置语法吗?这样,当选中复选框时,它将调用数据库,运行存储过程,并将结果(作为日期时间)从存储过程返回到我的C#语法中 编辑---抛出的错误是: 无法将类型“System.DateTime”隐式转换为“string”C# 从存储过程返回变量,c#,asp.net,sql-server-2008,stored-procedures,C#,Asp.net,Sql Server 2008,Stored Procedures,我需要一个员工的开始日期。我试图做的是,当选中复选框时,调用数据库获取日期并将其返回到我的C#代码中。我想我的一切设置都接近完美,但我的调用过程返回了一个错误。有人能帮我设置语法吗?这样,当选中复选框时,它将调用数据库,运行存储过程,并将结果(作为日期时间)从存储过程返回到我的C#语法中 编辑---抛出的错误是: 无法将类型“System.DateTime”隐式转换为“string” //Calling Procedure this.txtStartDate.Text = getHireDate
//Calling Procedure
this.txtStartDate.Text = getHireDate(Constants.Database, employeename);
//Actual Procedure
private static string getHireDate(string Database, string employeename)
{
SqlConnection connection = new SqlConnection(Database);
SqlCommand command = new SqlCommand("_uspGetHireDate", connection);
command.CommandType = CommandType.StoredProcedure;
SqlParameter returnValue = new SqlParameter("returnVal", SqlDbType.Int);
returnValue.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(returnValue);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
//This line throws an error of can not implicitly convert 'System.DateTime' to 'string'
return Convert.ToDateTime(returnValue.Value);
}
//Stored Procedure Being Called
alter procedure [dbo].[_uspGetHireDate]
(
@employeename varchar(100)
)
as
declare @StartDate datetime
set NOCOUNT ON
Set @StartDate = (SELECT CONVERT(VARCHAR(10), HireDate, 101)
FROM tbl_employeeinformation
where hiredate is not null
AND active = 1
AND employeename = @employeename
return @StartDate
您返回的是
DateTime
,而不是函数返回类型中预期的string
private static string getHireDate(string Database, string employeename)
{
您返回的是
DateTime
,而不是函数返回类型中预期的string
private static string getHireDate(string Database, string employeename)
{
您的解决方案非常混乱。为什么要将
DATE
转换为VARCHAR
,然后将其作为INT
返回,然后将其转换为DateTime
并作为字符串返回
首先,将存储过程更改为以标准方式返回值。使用返回日期
,而不是INT
:
alter procedure [dbo].[_uspGetHireDate]
@employeename varchar(100)
as
set NOCOUNT ON
SELECT HireDate
FROM tbl_employeeinformation
where hiredate is not null
AND active = 1
AND employeename = @employeename
然后将方法更改为返回DateTime
:
private static DateTime getHireDate(string Database, string employeename)
{
SqlConnection connection = new SqlConnection(Database);
SqlCommand command = new SqlCommand("_uspGetHireDate", connection);
command.CommandType = CommandType.StoredProcedure;
connection.Open();
var result = Convert.ToDateTime(command.ExecuteScalar());
connection.Close();
return result;
}
感谢@petelids指出这一点。将您的表示层更改为:
this.txtStartDate.Text = getHireDate(Constants.Database, employeename).ToString("yyyy-MM-dd");
或者任何适当的格式。可视化数据是表示层的工作,而不是业务层的工作。在这里,您将连接字符串存储在表示层中,这有点奇怪
还可以使用块将连接、命令等放入中,并使用try catch
块。
我还注意到,您没有将@employeename
参数传递给存储过程您的解决方案非常混乱。为什么要将日期
转换为VARCHAR
,然后将其作为INT
返回,然后将其转换为日期时间
并作为字符串返回?
首先,将存储过程更改为以标准方式返回值。使用返回日期
,而不是INT
:
alter procedure [dbo].[_uspGetHireDate]
@employeename varchar(100)
as
set NOCOUNT ON
SELECT HireDate
FROM tbl_employeeinformation
where hiredate is not null
AND active = 1
AND employeename = @employeename
然后将方法更改为返回DateTime
:
private static DateTime getHireDate(string Database, string employeename)
{
SqlConnection connection = new SqlConnection(Database);
SqlCommand command = new SqlCommand("_uspGetHireDate", connection);
command.CommandType = CommandType.StoredProcedure;
connection.Open();
var result = Convert.ToDateTime(command.ExecuteScalar());
connection.Close();
return result;
}
感谢@petelids指出这一点。将您的表示层更改为:
this.txtStartDate.Text = getHireDate(Constants.Database, employeename).ToString("yyyy-MM-dd");
或者任何适当的格式。可视化数据是表示层的工作,而不是业务层的工作。在这里,您将连接字符串存储在表示层中,这有点奇怪
还可以使用块将连接、命令等放入中,并使用try catch
块。
我还注意到,您没有将@employeename
参数传递给存储过程
为什么要使用HireDate
(我假设它是datetime
列)并将其转换为varchar(10)
在将其设置为datetime
变量之前,您已经将参数定义为IntSqlParameter(“returnVal”,SqlDbType.Int)
。但是您的SP正在返回字符串选择CONVERT(VARCHAR(10),HireDate,101)
@aSharma-实际上,它返回的是一个datetime
,但是您对SqlParameter
类型的观察结果正好说明了为什么要使用HireDate
(我假设是datetime
列)并将其转换为varchar(10)
在将其设置为datetime
变量之前,您已经将参数定义为IntSqlParameter(“returnVal”,SqlDbType.Int)
。但是您的SP正在返回字符串选择CONVERT(VARCHAR(10),HireDate,101)
@aSharma-实际上,它返回的是一个日期时间
,但是你对SqlParameter
类型的观察仅仅是一个小小的增加,如果你更改getHireDate
的返回类型(我同意你应该(+1)),你是否需要更改文本框上的赋值-例如this.txtStartDate.Text=getHireDate(Constants.Database,employeename).ToString(“MM/dd/yyyy”)
@petelids,这当然是显而易见的,企业应该提供数据,如何显示这些数据取决于演示文稿。我完全同意,我只是认为,由于问题中对类型的混淆,值得指出的是,转换错误将移到文本框分配中。如果您更改getHireDate
(我同意您应该(+1))是否需要更改文本框上的赋值-例如this.txtStartDate.Text=getHireDate(Constants.Database,employeename).ToString(“MM/dd/yyyyy”)
@petelids,这当然是显而易见的,企业应该提供数据,如何显示这些数据取决于演示文稿。我完全同意,我只是认为,由于问题中对类型的混淆,值得指出的是,转换错误将转移到文本框分配。