'datetime'附近的语法不正确。 :'System.Data.SqlClient.SqlException'发生在System.Data.dll中,但未在用户代码中处理

时间:2018-02-07 05:28:28

标签: c# sql-server-2012

我收到此错误:

  

'datetime'附近的语法不正确。

运行我的代码时:

private static string connectionString = "Data Source=1.1.1.1;Initial Catalog=rs;User Id=rs;Password=rs";

public static List<Cal> getEvents(DateTime start, DateTime end)
{
    List<CalendarEvent> events = new List<CalendarEvent>();

    SqlConnection con = new SqlConnection(connectionString);

    SqlCommand cmd = new SqlCommand("SELECT [ID], [Name], [Room], [Time-in], [Time-out] FROM [rs].[dbo].[res_time] WHERE [Time-in]>=[@Time-in] AND [Time-out]<=[@Time-out]", con);
    cmd.Parameters.AddWithValue("[@Time-in]", start);
    cmd.Parameters.AddWithValue("[@Time-out]", end);

    using (con)
    {
        con.Open();

        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            CalendarEvent ce = new CalendarEvent();
            ce.id = (int)reader["id"];
            ce.title = (string)reader["Name"];
            ce.description = (string)reader["Room"];
            ce.start = (DateTime)reader["Time-in"];
            ce.end = (DateTime)reader["Time-out"];

            events.Add(cevent);
        }
    }

    return events;
}

2 个答案:

答案 0 :(得分:0)

AddWithValue()方法可能会对日期和时间造成问题。使用

cmd.Parameters.Add("[@Time-in]", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("[@Time-out]", SqlDbType.DateTime).Value = end;

您可以阅读此article以获取有关AddWithValue()方法限制的更多信息。它的要点是,因为它必须推断出正确的数据类型,所以它有时会出错。对于日期和时间尤其如此。

使用Add()方法的此重载指定在表上创建列时声明的确切数据类型,有助于确保解析正确的类型。

答案 1 :(得分:-1)

首先,您是要尝试返回List<Cal>还是List<CalenderEvent>

要回答您的问题,您需要在Visual Studio中手动解析它

ce.start = Convert.ToDateTime(reader["Time-in"]).ToString();

这假设您的列数据的格式正确,以便转换生效。

<强>更新

好的,我搞砸了我的.ToString()

试试这个:

// I moved the .ToString() inside the Convert function
ce.start = Convert.ToDateTime(reader["Time-in"].ToString());

你得到了隐式转换错误,因为它在解析后应用了.ToString(),这意味着你正在尝试将字符串值放入DateTime变量中。我的坏!