C# 执行SqlDataReader时发生日期时间转换错误

C# 执行SqlDataReader时发生日期时间转换错误,c#,asp.net,sql-server,datetime,C#,Asp.net,Sql Server,Datetime,当执行读取器从表中检索某些日期时间时,我遇到了一个问题 首先,我有一个页面将一些变量转移到另一个页面: //calStart.SelectedDate is a DateTime value Response.Redirect("SpecialReports_Results.aspx?userListValues=" + userListValues + "&groupListValues=" + groupListValues + "&calSelected=" + calSt

当执行读取器从表中检索某些日期时间时,我遇到了一个问题

首先,我有一个页面将一些变量转移到另一个页面:

//calStart.SelectedDate is a DateTime value
Response.Redirect("SpecialReports_Results.aspx?userListValues=" + userListValues + "&groupListValues=" + groupListValues + "&calSelected=" + calStart.SelectedDate);
然后,在新页面上:

    //To retrieve the values that were sent over
    string userListValues = Request.QueryString["userListValues"];
    string groupListValues = Request.QueryString["groupListValues"];
    string dateSelected = Request.QueryString["calSelected"];

    // SQL Server connection stuff + string argument
    SqlCommand command2 = new SqlCommand();
    command2.Connection = gconn;

    String sql2 = "SELECT MAX([Day]) as TheDay FROM Days WHERE User_ID = @User_ID AND [Day] < '@dateSelected' AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = @User_ID AND [DAY] >= '@dateSelected')";
    command2.CommandText = sql2;

    command2.Parameters.Add(new SqlParameter("@User_ID", ""));
    command2.Parameters.Add(new SqlParameter("@dateSelected", dateSelected));

    List<string> dates = new List<string>();

    //userID is a List<string>
    foreach (string str in userID)
    {
        command2.Parameters["@User_ID"].Value = str;

        using (SqlDataReader reader = command2.ExecuteReader())
        {
            while (reader.Read()) //Getting error here: Conversion failed when converting datetime from character string.
            {
                if (reader.HasRows)
                {
                    dates.Add(reader["Day"].ToString());
                }
            }
        }
    }
Day列的类型为DateTime

我已尝试通过执行以下操作将字符串dateSelected和列表日期转换为DateTime:

DateTime confirmedDate = DateTime.Parse(dateSelected);
List<DateTime> dates = new List<DateTime>()
但我也犯了同样的错误


注意:SQL语句在Microsoft的SQL Server Management Studio中执行时确实有效。

我认为您需要删除“@dateSelected”上的单引号

这样,您的代码将其视为一个参数,而不是一个参数

String sql2 = "SELECT MAX([Day]) as TheDay FROM Days WHERE User_ID = @User_ID AND [Day] < @dateSelected AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = @User_ID AND [DAY] >= @dateSelected)";

由于没有从字符串到日期时间的隐式对话,您的读者尝试将此@dateSelected字符串文字转换为datetime,但失败。

我认为您需要删除“@dateSelected”上的单引号

这样,您的代码将其视为一个参数,而不是一个参数

String sql2 = "SELECT MAX([Day]) as TheDay FROM Days WHERE User_ID = @User_ID AND [Day] < @dateSelected AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = @User_ID AND [DAY] >= @dateSelected)";

由于没有从字符串到日期时间的隐式对话,您的读者尝试将此@dateSelected字符串文字转换为datetime,但失败。

您是否在datetime.Parse之前检查了dateSelected的值?那是什么?数据类型是什么?字符串?是的,它是相同的值,但只是一个字符串。示例:12/1/2015 12:00:00 AM是一个字符串,解析后变成{12/1/2015 12:00:00 AM}即System.DateTime错误到底是什么?在哪一行?在foreach循环中,我在whilereader.Read行旁边放了一条注释,这是错误发生的地方。您是否检查了DateTime.Parse之前选择的dateSelected的值?那是什么?数据类型是什么?字符串?是的,它是相同的值,但只是一个字符串。示例:12/1/2015 12:00:00 AM是一个字符串,解析后变成{12/1/2015 12:00:00 AM}即System.DateTime错误到底是什么?在哪一行?在foreach循环中,我在whilereader.Read行旁边放了一条注释,这是错误发生的地方。这是正确的。此外,在将Request.QueryString[calSelected]值分配给参数之前,最好先将其解析为C DateTime对象。否则,SqlParameter构造函数将创建一个nvarchar参数,当需要将值与索引匹配时,这可能会带来痛苦的后果。它通过了第一个错误,但现在我得到一个IndexOutOfRangeException未被dates.Addreader[Day].ToString;上的用户代码错误处理;。某些结果应为空,不应添加到列表中。这就是我添加reader.HasRows的原因,但可能这不正确?@pfferno@pfferno不,HasRows检查不是您想要的。空值仍然生成一行。您可以改为检查DBNull.Value,或者更好的是,您可以在sql WHERE子句中添加一个条件,以便在返回C之前由数据库过滤掉这些记录。@pfferreno您在Select语句中的列名就是正确的日期。此外,在将Request.QueryString[calSelected]值分配给参数之前,最好先将其解析为C DateTime对象。否则,SqlParameter构造函数将创建一个nvarchar参数,当需要将值与索引匹配时,这可能会带来痛苦的后果。它通过了第一个错误,但现在我得到一个IndexOutOfRangeException未被dates.Addreader[Day].ToString;上的用户代码错误处理;。某些结果应为空,不应添加到列表中。这就是我添加reader.HasRows的原因,但可能这不正确?@pfferno@pfferno不,HasRows检查不是您想要的。空值仍然生成一行。您可以改为检查DBNull.Value,或者更好的是,您可以在sql WHERE子句中添加一个条件,以便在返回C之前由数据库过滤掉这些记录。@pfferreno Select语句中的列名就是日期