【发布时间】:2015-04-20 20:29:07
【问题描述】:
我在业余时间做一些 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 数据类型转换为 datetime 数据类型导致值超出范围
我知道它与 SQL 或 C# 等效的日期时间格式有关,但我不知道如何格式化日期时间以符合错误。有任何想法吗?我尝试使用命令文本行对其进行格式化,但似乎没有解决问题。
【问题讨论】:
-
您应该使用参数化查询。不仅如此,您的问题的一部分是 .Value,SQL 期望 DateTime 的格式为:“yyyy-MM-dd HH:mm:ss.fffffff”,具体取决于列类型。此外,DateTime2 更适合 SQL 列类型。
-
不应该,必须。您的问题看起来不像是代码问题,而更像是数据问题。你的价值观是什么?
-
日期时间值来自日期选择器框
-
@EBrown 您对参数化查询的看法是正确的,但您本可以停在那里。一旦 OP 转向正确的参数使用,字符串强制和预期格式就无关紧要了。
-
goldeneye 请阅读此内容:msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx 您对 DateTimePicker.Value 的使用将其转换为默认的、本地化的、SQL 不可表示的字符串。正如@DonBoitnott 和我所说,切换到参数化查询不仅可以解决这个问题,而且可以消除任何人都可以在你的代码上执行的大量 SQL 注入攻击。另外:msdn.microsoft.com/en-us/library/vstudio/…
标签: c# sql sql-server winforms