DateTime.Now进入smalldatetime?

时间:2012-08-06 13:16:32

标签: c# sql-server-2008 ado.net

我试图使用C#获取日期和时间,然后将其插入SQL SERVER中的smalldatetime数据类型。

这就是我尝试这样做的方法:

DateTime date = DateTime.Now;

        sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)VALUES (1,'','','',2,'1',"+ date +")";

        dataObj = new DataObj();
        dataObj.InsertCommand(sql);


  connection = new SqlConnection(conn);
        connection.Open();

        cmd = new SqlCommand(sql, connection);
        cmd.ExecuteNonQuery();
        connection.Close();

然后它给了我:“'16'附近的语法不正确。” 我想它指的是我现在的时间,现在是16:15 ..

2 个答案:

答案 0 :(得分:3)

我建议使用参数。 cmd.Parameters.AddWithValue("@date", date.toString); AddWithField将负责正确的转换。

您的InsertSQL语句变为:

sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)VALUES (1,'','','',2,'1',@date)";

答案 1 :(得分:1)

它有两个原因无效:

  1. 您的日期参数需要调用date.ToString()
  2. 您必须在内联字符串插入内联查询之前和之后添加单引号,如下所示:

    sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,
    YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)
    VALUES (1,'','','',2,'1','"+ date +"')";
    
  3. 但是上面的策略并不好,因为它通过以你的方式连接字符串来暴露你的SQL注入攻击,还因为你不得不担心添加单引号等等。

    更好的方法是使用参数:

    sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,
        YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)
        VALUES (@First,@Second,@Third,@Fourth,@Fifth,@Sixth,@YourDate)";
    
    cmd.Parameters.AddWithValue("@First", 1);
    // ... and so on
    cmd.Parameters.AddWithValue("@YourDate", date);
    

    现在您不必担心SQL注入攻击或根据数据类型等对某些参数添加单引号。这对您来说都是透明的,您更安全,数据库引擎将能够优化执行计划您的查询。