【问题标题】:DateTime.Now into smalldatetime?DateTime.Now 变成 smalldatetime?
【发布时间】:2012-08-03 11:17:45
【问题描述】:

我尝试使用 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..

【问题讨论】:

  • 一方面,您应该使用参数化查询。即使您使用此代码,也不会在查询中使用撇号包装 date 变量。
  • 那是有效还是失败?你有错误信息吗?还是一个问题?不幸的是,您的帖子并不太清楚您要问什么 - 我建议您进行编辑以明确您的问题。
  • 这应该隐式转换为 smalldatetime 没有问题。当前的问题是什么?你的问题是什么?也许您不应该在插入列表中包含所有这些 YTOODLE_LINKS. 前缀?
  • 哎呀,对不起..忘了把错误信息!已编辑!
  • 您是否意识到传递的列数和值不相等,我猜这是不对的?

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


【解决方案1】:

我建议使用参数。 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)";

【讨论】:

  • 您是否意识到传递的列数和值不相等,我猜这是不对的?
【解决方案2】:

它不起作用有两个原因:

  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注入攻击或根据数据类型为某些参数添加单引号等。这对您来说都是透明的,您更安全,数据库引擎将能够优化执行计划您的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2010-09-19
    相关资源
    最近更新 更多