将日期时间保存到SQL Server数据库时出错

时间:2015-04-20 20:29:07

标签: c# sql sql-server winforms

我在业余时间做了一些C#Winforms编码,只是掌握了一切。我有一个SQL脚本,它在vs2012上创建一个本地数据库,如下所示:

-- Creating table 'Users'--
CREATE TABLE [dbo].[Users]
(
    [UserID] int IDENTITY(1,1) NOT NULL,
    [Surname] nvarchar(30)  NOT NULL,
    [Forename] nvarchar(30)  NOT NULL,
    [Company] nvarchar (30) NOT NULL,
    [SecurityLevel] int NOT NULL,
    [IssueDate] DateTime  NOT NULL,
    [ExpiryDate] DateTime  NOT NULL,
    [CardID] int NOT NULL,
);
GO

现在我想将详细信息保存到该表中,因此我创建了一个方法:

  private void btnSaveDetails_Click(object sender, EventArgs e)
  {
        SqlConnection sc = new SqlConnection();
        SqlCommand com = new SqlCommand();
        sc.ConnectionString = (Properties.Settings.Default.BioEngineering);
        sc.Open();
        com.Connection = sc;
        com.CommandText = ("INSERT INTO Users (Forename, Surname, Company, SecurityLevel, IssueDate, ExpiryDate, CardID) VALUES ('" + this.txtFirstName.Text + "','" + this.txtLastName.Text + "','" + this.txtCompany.Text + "','" + this.cboSecurityLevel.Text + "','" + this.dtpIssueDate.Value + "','" + this.dtpExpiryDate.Value + "','" + this.cboCardID.Text + "');");

        com.ExecuteNonQuery();
        sc.Close();
    }

当我运行代码时出现错误

  

将varchar数据类型转换为日期时间数据类型会导致超出范围的值

我知道它与SQL或C#等效的日期时间格式有关,但我不知道如何格式化日期时间以符合错误。有任何想法吗?我尝试使用Command Text行格式化它,但它似乎没有解决问题。

2 个答案:

答案 0 :(得分:0)

Datepicker.Value以

的形式返回
[Your_System_Short_Date_Format] + [Space] + [Your_System_Long_Time_Format]

我不知道为什么使用这种格式,但只是在添加DateTimePicker时使用默认长格式进行检查时找到了。

因此,您传递的值取决于您的系统[区域/日历]设置,其中SQL引擎期望采用EBrown格式表示

yyyy-MM-dd HH:mm:ss.fffffff

因此,如果您确定要连接,那么您可以使用类似

 command.CommandText = 
    "INSERT INTO EMPLOYEES(DateOfBirth) VALUES ('" +
     dtpDateOfBirth.Value.ToString("yyyy-MM-dd HH:mm:ss") + "')";

但我真的建议你保持从一开始就使用参数的做法。或者在创建一个巨大的应用程序之后,您可能需要返回将这些连接更改为Parameters。

很简单,就像

一样
command.CommandText = "INSERT INTO EMPLOYEES(DateOfBirth) VALUES (@dob)";

command.Parameters.Add("@dob", SqlDbType.DateTime).Value = dtpDateOfBirth.Value;

     // Or Simply

command.Parameters.AddWithValue("@dob", dtpDateOfBirth.Value);

您可以使用参数添加具有不同数据类型的更多参数。 SqlCommand类安全地将它们转换为SqlCommand,特别是从注入攻击。

答案 1 :(得分:-5)

首先,你所采用的方式是运行sql语句的粗暴方式,它容易出现大量错误,内存泄漏,sql注入攻击和安全问题。

- 您应该使用using声明处理连接&命令对象,更好的错误处理。

- 您应该使用参数化查询或存储过程或ORM,如nhibernate或EF。

无论如何,您的代码中的错误如下

将日期字段转换为此格式.ToString("MM/dd/YYYY")

 private void btnSaveDetails_Click(object sender, EventArgs e)
    {
        SqlConnection sc = new SqlConnection();
        SqlCommand com = new SqlCommand();
        sc.ConnectionString = (Properties.Settings.Default.BioEngineering);
        sc.Open();
        com.Connection = sc;
        com.CommandText = ("INSERT INTO Users (Forename, Surname, Company, SecurityLevel, IssueDate, ExpiryDate, CardID) VALUES ('" + this.txtFirstName.Text + "','" + this.txtLastName.Text + "','" + this.txtCompany.Text + "','" + this.cboSecurityLevel.Text + "','" + this.dtpIssueDate.Value.ToString("MM/dd/YYYY") + "','" + this.dtpExpiryDate.Value.ToString("MM/dd/YYYY") + "','" + this.cboCardID.Text + "');");

        com.ExecuteNonQuery();
        sc.Close();
    }