2011-03-01 174 views
0

嗨我尝试插入到DB日期时间和列是日期类型我需要做什么? 这是代码日期时间格式

string query = "INSERT INTO Feedback (user_Name, date_of_, Praise) VALUES  ('"+TextBox1.Text+"',"+DateTime.Now+",'"+TextBox2.Text+"')"; 
    SqlCommand cmd = new SqlCommand(query, con); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
+7

使用SqlParameters,而不是一个纯文本 – Stecya 2011-03-01 13:17:25

+0

哇,你的代码是一个SQL注入攻击完全开放..!这两个文本框将使任何黑客能够完全分析您的Web应用程序并危及您的数据库。改用参数化查询! – code4life 2011-03-01 14:49:28

回答

1

DateTime.Now.ToString("yyyy-MM-dd");

同时更换DateTime.Now,你真的应该参数化INSERT语句中,这样就可以不属于一个SQL injection攻击的受害者。

+0

这将删除时间组件... – linepogl 2011-03-01 13:20:28

+3

参数化查询比仅适当地格式化日期要好得多。 OP不应该包含SQL语句中的数据。 – 2011-03-01 13:32:06

+0

@linepogl - 我从这个问题了解到他想把日期放入数据库,而不是时间。我当然可能会误解,但无论如何这应该很容易改变。无论如何,他应该参数化查询,让Jon Skeet在答案和评论中都提到他的应用程序更强大。 – 2011-03-01 13:37:08

1

大多数SQL实现中都有NOW()函数。

+0

如果SQL Server - 它是'getdate()'或'CURRENT_TIMESTAMP' – 2011-03-01 13:24:56

0

您必须将DateTime转换为Sql DateTime文字。做到这一点最简单的方法是这样的:

DateTime.Now.ToString(System.Globalisation.CultureInfo.InvariantCulture) 

然而,特别是对于DateTime.Now,你可以使用一些SQL函数,如GetDate()但往往取决于你的数据库服务器上。

2

为什么不在数据库中使用TIMESTAMP列?通过在代码中插入它看起来像开销一样。

下面的链接提供了更多的信息:

http://msdn.microsoft.com/en-us/library/aa260631(SQL.80).aspx

编辑:设置你的数据库列CURRENT_TIMESTAMP (Transact-SQL)的默认值,并留下列名出你的INSERT语句。当前的日期和时间将被数据库自动插入。转换没有问题了!

+0

timestamp是一个行版本标记 - 与SQL Server中的日期和时间无关! – 2011-03-01 13:24:32

+1

你说得对,我混淆了MySQL!我后来的想法仍然有效。为什么在DBMS知道确切时间的情况下通过代码插入“NOW”。 – 2011-03-01 13:31:13

+0

如果他们不执行更新,这是一个好主意。但是,如果更新包括输入日期时间,那么应该工作。 – jlafay 2011-03-01 13:31:15

0

可以使用Date属性:

DataTime.Now.Date 
5

不要在您的SQL包括直接的价值。

改为使用参数化查询。当数据库完全可以接受带有DateTime参数的预准备语句时,无需考虑字符串格式。

您应该习惯于使用所有值的查询参数,这些值不能简单地硬编码到SQL开始。例如,您的查询目前仅仅是快速获取TextBox1.Text的内容并将其插入到SQL中。这是SQL注入攻击的秘诀。

您应该将代码(SQL)与数据(值)分开。参数化查询是实现这一目标的方法。

编辑:在SQL中使用内置函数很好,当然,如果您很乐意使用数据库的“现在”的想法而不是您的客户端的“现在”的想法。制定出更适合你的情况。

6

我建议不要使用从应用程序服务器向数据库中插入值的时间。最基本的例子是如何可能出错的是,您可以将两台服务器设置为不同的时区,并使用相同的数据库。什么服务器的时间是正确的时间?

另一件事是当您使用内联SQL语句时,日期时间必须转换为字符串。如果应用程序服务器和数据库服务器设置为不同的文化,则需要非常小心,以便在插入May 5th(02.05)的时候插入Feb 5th(02.05)。

当然,所有这些问题都是可以避免的,但为什么RDBMS可以为我们做所有这些工作呢?


顺便说一句,即使你不想使用存储过程,使用参数。
此代码应被重新格式化,如:

string query = "INSERT INTO Feedback (user_Name, date_of_, Praise) VALUES  (@username, getdate(), @praise)"; 

SqlCommand cmd = new SqlCommand(query, con); 
SqlParameter param = new SqlParameter("@username", SqlDbType.Text); 
param.Value = text1; 
cmd.Parameters.Add(param); 

param = new SqlParameter("@praise", SqlDbType.Text); 
param.Value = text2; 
cmd.Parameters.Add(param); 

con.Open(); 
cmd.ExecuteNonQuery(); 
con.Close();