【问题标题】:The conversion of a varchar data type to a datetime data type resulted in an out-of-range value error将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值错误
【发布时间】:2012-09-12 17:46:09
【问题描述】:

将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值错误

我正在尝试使用表单将数据输入到我的表中,表单验证和 sql 服务器中的日期格式都是 dd/mm/yy,但是当我尝试从表单中提交数据时高于 12(例如 13/12/2012)它会引发异常,其原因是“将 varchar 数据类型转换为日期时间数据类型导致超出范围的值错误”,如果我尝试输入数据以 mm/dd/yy 格式输入表格,它指出“错误的日期格式”,这意味着 dd/mm/yy 格式是正确的格式

下面是我的表单的代码:

    private void btnAddProject_Click(object sender, EventArgs e)
    {
        DateTime startDate;
        DateTime endDate;

        if (txtProjectName.Text == "") //client side validation
        {
            MessageBox.Show("Enter Project Name");
            return;
        }

        try
        {
            startDate = DateTime.Parse(txtProjectStart.Text);
            endDate = DateTime.Parse(txtProjectEnd.Text);
        }
        catch (Exception)
        {
            MessageBox.Show("Wrong Date Format");
            return;
        }
        fa.CreateProject(txtProjectName.Text, startDate, endDate, (int)cbCustomers.SelectedValue, ptsUser.Id);
        txtProjectName.Text = "";
        txtProjectStart.Text = "";
        txtProjectEnd.Text = "";
        cbCustomers.SelectedIndex = 0;
        MessageBox.Show("Project Created");
        adminControl.SelectTab(2);
    }// end btnAddProject

这是我的 DAO 中的代码:

public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
    {
        string sql;
        SqlConnection cn;
        SqlCommand cmd;
        Guid projectId = Guid.NewGuid();

        sql = "INSERT INTO Project (ProjectId, Name, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)";
        sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate, endDate, customerId, administratorId);

        cn = new SqlConnection(Properties.Settings.Default.WM75ConnectionString);
        cmd = new SqlCommand(sql, cn);

        try
        {
            cn.Open();
            cmd.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            throw new Exception("Error Creating Project", ex);
        }
        finally
        {
            cn.Close();
        }

    }//end CreateProject Method

这是我的门面代码:

public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
    {
        dao.CreateProject(name, startDate, endDate, customerId, administratorId);
    }//end CreateProject

【问题讨论】:

    标签: c# .net sql-server-2008 visual-c#-express-2010


    【解决方案1】:

    您可以像这样进行 sqldatetime 转换 sqldatetime

     var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");
    

    【讨论】:

      【解决方案2】:

      基本上,您根本不应该在 SQL 中将 DateTime 值作为 字符串 传递。使用参数化SQL,直接设置参数值即可。您应该始终尽可能使用参数化 SQL:

      • 它提供了更好的代码/数据分离
      • 它避免了有问题的转换(比如这个)
      • 避免 SQL 注入攻击

      此外,您的异常处理是毫无意义的复杂。只需使用using 声明,然后让SqlException 直接冒泡 - 为什么还要将它包装在香草Exception 中?

      【讨论】:

        【解决方案3】:
        sql = "INSERT INTO Project (ProjectId, Name, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)";
        sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate.toString("dd-MMM-yyyy"), endDate.toString("dd-MMM-yyyy"), customerId, administratorId);
        

        一个建议:你为什么在你的代码中使用Insert 语句?您可以使用存储过程。

        【讨论】:

        • 没有必要使用存储过程——或者至少,您没有提出任何可以带来的好处。只需使用参数化 SQL 就可以解决这个问题。
        • 解决方案是将日期时间转换为“dd-MMM-yyyy”。 sql = "插入项目(项目 ID、名称、ExpectedStartDate、ExpectedEndDate、CustomerId、AdministratorId)"; sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate。 toString("dd-MMM-yyyy"), endDate.toString("dd-MMM-yyyy"), customerId, administratorId);
        • 这是一个糟糕的解决方案。一个更好的解决方案是避免不必要的字符串转换。
        • 那么你就可以使用CulturInfo了。
        • 这是假设数据库使用与系统相同的文化。当有一个简单且更清洁且有效的解决方案时,你为什么要跳过复杂的圈子来创建一个脆弱的解决方案?从 SQL 中分离参数值是一种很好的做法——适用于所有类型。
        猜你喜欢
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 2011-11-12
        • 2016-02-08
        相关资源
        最近更新 更多