【问题标题】:asp conversion of a varchar data type to a datetime error SQL aspxasp将varchar数据类型转换为日期时间错误SQL aspx
【发布时间】:2015-06-21 17:32:22
【问题描述】:

我不知道我需要做什么。我搜索了两天,没有找到有用的东西。

fieldValue = row.Cells[0].Text;
DateTime timeNow = DateTime.Now;

string constring = System.Configuration.ConfigurationManager.ConnectionStrings["ITCConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(constring)) {
    timeNow = Convert.ToDateTime(timeNow);
    using (SqlCommand cmd = new SqlCommand("UPDATE AktywneZgloszenia SET Data_przyjecia_do_realizacji='" + timeNow + "' WHERE Nr_zgloszenia ='"+fieldValue+"';", connection)) {
        using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
            connection.Open();
            cmd.ExecuteNonQuery(); // <--executeNon
            connection.Close();
            GridView1.DataBind();
        }
    }
}

当我尝试保存/更新变量 time 时出现错误:

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

两个数据库中的列 type= datetime dane[] type= string 中的变量。(不在此片段中) 我从数据库中清除了所有数据。 我做错了什么?

【问题讨论】:

  • 假设这是 SQL Server,这可能是区域设置吗?例如。您要存储 21/06/2015 而不是 06/21/2015?如果你使用字符串 YYYYMMDD 是唯一安全的格式。
  • 使用正确数据类型的参数化查询。
  • 我做了:DateTime timeNow = DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"); - 无法将类型“字符串”隐式转换为 System.DateTime。我试过这样的事情: DateTime timeNow = DateTime.Now;字符串格式 = "yyyy-MM-dd HH:mm:ss";格式 = timeNow.ToString(格式);但仍然像第一个错误一样。

标签: c# asp.net sql-server datetime varchar


【解决方案1】:

正如 Martin Smith 所暗示的,您希望使用 SQL 命令参数,而不是通过串联构建命令。

类似:

fieldValue = row.Cells[0].Text;
DateTime timeNow = DateTime.Now;

string constring = System.Configuration.ConfigurationManager.ConnectionStrings["ITCConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(constring)) {
// timeNow = Convert.ToDateTime(timeNow);  (not needed)
using (SqlCommand cmd = new SqlCommand("UPDATE AktywneZgloszenia SET Data_przyjecia_do_realizacji= @pTimeNow  WHERE Nr_zgloszenia = @pFieldValue;", connection)) {
    using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
        connection.Open();
    cmd.Parameters.AddWithValue("@pTimeNow", timeNow); // <-- 'pass' timenow
    cmd.Parameters.AddWithValue("@pFieldValue", fieldValue); // <-- 'pass' fieldValue
        cmd.ExecuteNonQuery(); // <--executeNon
        connection.Close();
        GridView1.DataBind();
    }
}

}

【讨论】:

  • 使用 SQL 参数的做法效果更好,可以防止 SQL 注入攻击。
  • 删除此行:timeNow = Convert.ToDateTime(timeNow);。已经是DateTime了,不用再转换了。
  • 很好 @Zohad Peled - 它来自 OP 的代码,与答案无关,我完全应该删除它。上面的评论是为了连续性和清晰性。
  • 是的,我添加了这个无用的代码,因为我很沮丧:)。谢谢。它现在运行良好:)
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多