我试图使用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 ..
答案 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)
它有两个原因无效:
您必须在内联字符串插入内联查询之前和之后添加单引号,如下所示:
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注入攻击或根据数据类型等对某些参数添加单引号。这对您来说都是透明的,您更安全,数据库引擎将能够优化执行计划您的查询。