【问题标题】:Return Variable From Stored Procedure从存储过程返回变量
【发布时间】:2015-05-19 12:06:58
【问题描述】:

我需要获取员工的开始日期。我想要做的是当一个复选框被选中时调用数据库获取日期并将其返回到我的 C# 代码中。我认为我的所有设置都接近完美,但我的调用过程返回错误。有人可以帮助我设置语法,以便在选中复选框时调用数据库,运行存储过程,并将存储过程中的结果(作为日期时间)返回到我的 C# 语法中?

EDIT --- 抛出的错误是: 无法将类型“System.DateTime”隐式转换为“字符串”

//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

【问题讨论】:

  • 你为什么要把HireDate(我假设是datetime列)转换成varchar(10),然后再设置成datetime变量??
  • 您已将参数定义为 Int SqlParameter("returnVal", SqlDbType.Int)。但是您的 SP 正在返回字符串 SELECT CONVERT(VARCHAR(10), HireDate, 101)
  • @aSharma - 实际上,它返回一个 datetime 但您对 SqlParameter 类型的观察是正确的

标签: c# asp.net sql-server-2008 stored-procedures


【解决方案1】:

您的解决方案完全混乱。为什么要把DATE转换成VARCHAR,然后返回为INT,再转换为DateTime又返回为STRING???

首先将您的stored procedure 更改为返回值标准方式。返回DATE,而不是INTreturn

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 指出这一点。将您的 presentation layer 更改为:

this.txtStartDate.Text = getHireDate(Constants.Database, employeename).ToString("yyyy-MM-dd");

或任何合适的格式。可视化数据是presentation layer 的工作,而不是business layer 的工作。在这里,您将connection string 存储在presentation layer 中,这有点奇怪。

还将您的连接、命令等放入using 块并使用try-catch 块。 另外我注意到您没有将@employeename 参数传递给您的stored procedure

【讨论】:

  • 一个小补充,如果您更改 getHireDate 的返回类型(我同意您应该(+1)),您是否需要更改文本框上的分配 - 例如this.txtStartDate.Text = getHireDate(Constants.Database, employeename).ToString("MM/dd/yyyy");
  • @petelids,当然很明显,业务应该提供数据,如何显示这些数据取决于演示。
  • 我完全同意,我只是认为问题中对类型的混淆值得指出转换错误将转移到文本框分配。
【解决方案2】:

您正在返回 DateTime 而不是函数返回类型中的 string

private static string getHireDate(string Database, string employeename)

{

----

 return Convert.ToDateTime(returnValue.Value); // Here you are returning datetime but your return type should be string as your function return type is string
}

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2017-09-25
    • 2014-04-18
    • 2013-04-05
    • 2017-05-12
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多