2011-03-01 167 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();