C# 从存储过程返回变量

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

我需要一个员工的开始日期。我试图做的是,当选中复选框时,调用数据库获取日期并将其返回到我的C#代码中。我想我的一切设置都接近完美,但我的调用过程返回了一个错误。有人能帮我设置语法吗?这样,当选中复选框时,它将调用数据库,运行存储过程,并将结果(作为日期时间)从存储过程返回到我的C#语法中

编辑---抛出的错误是: 无法将类型“System.DateTime”隐式转换为“string”

//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
变量之前,您已经将参数定义为Int
SqlParameter(“returnVal”,SqlDbType.Int)
。但是您的SP正在返回字符串
选择CONVERT(VARCHAR(10),HireDate,101)
@aSharma-实际上,它返回的是一个
datetime
,但是您对
SqlParameter
类型的观察结果正好说明了为什么要使用
HireDate
(我假设是
datetime
列)并将其转换为
varchar(10)
在将其设置为
datetime
变量之前,您已经将参数定义为Int
SqlParameter(“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,这当然是显而易见的,企业应该提供数据,如何显示这些数据取决于演示文稿。我完全同意,我只是认为,由于问题中对类型的混淆,值得指出的是,转换错误将转移到文本框分配。