我在业余时间做了一些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行格式化它,但它似乎没有解决问题。
答案 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();
}