如何使用asp.net读取从没有参数的存储过程返回的日期

本文关键字:参数 存储过程 返回 日期 asp 何使用 net 读取 | 更新日期: 2023-09-27 18:04:19

ALTER PROCEDURE [dbo].[usp_currentDate]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Insert statements for procedure here
    SELECT CONVERT(VARCHAR(10), GETDATE(), 101) 
END

这是我的存储过程代码。我得到了正确的日期,但我无法读取asp.net中的值。

public DateTime getCurrentDate()
{
    try
    {
        DateTime dt;
        SqlDataReader reader;
        SqlConnection objSqlConn = new SqlConnection(ConnString);
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "usp_currentDate";
        cmd.Connection = objSqlConn;
        objSqlConn.Open();
        me(1);
        reader = cmd.ExecuteReader();
        dt = reader.GetDateTime(1);  
        return dt;  
    }
    catch (Exception ex)
    {
        throw ex;
    }
} 

但它不起作用。它抛出一个异常

没有数据时读取无效

我需要做哪些更改?

如何使用asp.net读取从没有参数的存储过程返回的日期

尝试这样做,使用ExecuteScalar获取单行/单列值:

public DateTime getCurrentDate()
{
    try
    {
        DateTime dt;
        // set up connection and command in *using* blocks
        using (SqlConnection objSqlConn = new SqlConnection(ConnString))
        using (SqlCommand cmd = new SqlCommand("dbo.usp_currentDate", objSqlConn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            objSqlConn.Open();
            // since the query returns exactly one row, one column -> use ExecuteScalar
            object result = cmd.ExecuteScalar();
            // if something was returned .....
            if (result != null)
            {
                // try to convert to DateTime
                if (DateTime.TryParse(result.ToString(), out dt)
                {
                    return dt;
                }
            }
            // return default value, if no data was read or could not be converted 
            return DateTime.MinValue;
        }
    }
    catch (Exception ex)
    {
        throw;
    }
} 

除了为什么使用GETDATE作为字符返回本地时间之外,如果不使用Read方法将光标移动到数据阅读器的第一行,则无法读取数据阅读器。

从文档;

SqlDataReader的默认位置在第一条记录之前。因此,您必须调用Read才能开始访问任何数据。

string s;
reader = cmd.ExecuteReader();
if(reader.Read())
   s = reader.GetString(0);

或者更好,使用ExecuteScalar方法,因为您返回一行和一列,如;

string s = (string)cmd.ExecuteScalar();

请记住,CONVERT(VARCHAR(10), GETDATE(), 101)返回varchar,这在CLR端与string一起使用更可取,这就是为什么你不能将此值分配给DateTime变量。

还可以使用using语句来处理数据库连接和命令。