【问题标题】:DateTime.Now Throw exception in SQL saying it's not valid datetime valueDateTime.Now 在 SQL 中抛出异常,说它不是有效的日期时间值
【发布时间】:2016-02-28 09:42:52
【问题描述】:

我是 ASP.NET 新手,我需要您的专家帮助来解决这个问题。我正在使用 ASP.NET MVC 5 和 SQL Server。我尝试使用 SQL 向数据库插入一些数据,这是我的查询

INSERT INTO tem (Telephone, Status, CreateDate) 
VALUES ('" + telephone + "','"+ status +"','" + DateTime.Now + "');

它在 localhost 中运行良好,但在我部署到服务器后它显示错误消息:

导致将 varchar 数据类型转换为 datetime 数据类型 在一个超出范围的值。声明已终止。

我的DateTime.Now 值类似于28/02/2016 8:45:45 AM

如果我通过硬编码添加 2016-02-28 8:45:45 AM,那么它就可以工作了。

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
  • 感谢您的评论。它是参数化的,我在测试时对其进行了更改。关于我的问题的任何建议。
  • 嗯,建议是:使用参数! 这些不仅可以解决您的 SQL 注入漏洞,正确使用参数还可以解决您的“将日期格式化为字符串”问题(因为您不再需要将日期格式化为字符串 - 您将其作为 native DateTime 值传入)

标签: c# asp.net sql-server asp.net-mvc


【解决方案1】:

您需要使用参数化查询来解决您的 SQL 注入漏洞,同时避免将您的 DateTime 转换为经常导致问题的字符串。

使用类似这样的代码:

// define connection string and **PARAMETRIZED** insert query 
string connectionStirng = ".....";
string insertQry = "INSERT INTO tem (Telephone, Status, CreateDate) VALUES (@Telephone, @Status, @CreateDate);";

// set up connection and command in using blocks
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(insertQry, conn))
{
    // define the parameters
    cmd.Parameters.Add("@Telephone", SqlDbType.VarChar, 50).Value = telephone;
    cmd.Parameters.Add("@Status", SqlDbType.VarChar, 20).Value = status;
    cmd.Parameters.Add("@CreateDate", SqlDbType.DateTime).Value = DateTime.Now;

    // open connection, execute query, close connection
    conn.Open();
    int rowsInserted = cmd.ExecuteNonQuery();
    conn.Close();
}

【讨论】:

  • 感谢您对 marc_s 的支持。在测试环境中,此代码工作正常,但在我部署它后显示此错误“对象引用未设置为对象的实例。”。 SqlConnection 对象未创建。
  • @wajira000:检查你的配置——通常,连接字符串是在配置文件中定义的——你有你的配置文件吗?是否缺少连接字符串,或名称不同?
  • 谢谢 marc_s。这是问题,现在它工作正常。有什么工具或方法可以用来调试类似的情况。我可以访问服务器。因为在生产中很难跟踪这样的错误。
【解决方案2】:

正如@marc_s 在第一条评论中所说,你不应该使用 SQL 语句,而不是你的代码,做这样的事情:

conn2 = new SqlConnection();
        conn2.ConnectionString = ConfigurationManager.ConnectionStrings["connSpionshopString"].ConnectionString;
 SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn2;
        cmd.CommandText = "INSERT INTO tem (Telephone, Status, CreateDate)    VALUES(@param1,@param2,@param3)";

        cmd.Parameters.Add("@param1", "telephone ");
        cmd.Parameters.Add("@param2", "status ");
        cmd.Parameters.Add("@param3", DateTime.Now);

    cmd.ExecuteNonQuery(); 

    conn2.Close();

【讨论】:

【解决方案3】:

了解基础知识。 DatetimeNow 与 SQL 无关。

我的 DateTime.Now 值类似于 28/02/2016 8:45:45 AM。

没有。您的 datetime.Now 值实际上是内部的两倍。 STRING 表示是由您的 UI 设置生成的,因为您没有定义文化或格式字符串。如果你想要一个特定的格式,你应该这样做。

如果您的文化和服务器的文化不匹配 - 自然日期时间将无法正确解析。

这就是为什么你应该使用参数(并且它们避免 sql 注入)而不是处理字符串。

【讨论】:

  • 谢谢汤姆汤姆。正如我所说,我是一个初学者,所以你能提供任何示例或任何链接来帮助我解决这个问题。
  • @wajira000 您拥有 marc_s 答案中所需的所有样本。并自己对 Sql 注入和参数化查询进行一些研究
猜你喜欢
  • 2018-07-02
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多