0

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

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

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

4

2 回答 2

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)";
于 2012-08-06T13:19:25.407 回答
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 +"')";
    

但是上述策略并不好,因为它通过连接字符串的方式使您暴露于 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注入攻击或根据数据类型为某些参数添加单引号等。这对您来说都是透明的,您更安全,数据库引擎将能够为您优化执行计划询问。

于 2012-08-06T13:25:32.843 回答