2013-06-01 28 views
0

我有這樣的C#代碼:插入日期到數據庫中不工作(ASPX/C#)

string RegisterDate = DateTime.Now.ToString(); 
RegisterDate = RegisterDate.Remove(10); 
RegisterDate = RegisterDate.Replace('/', '-'); 
RegisterDate = String.Join("-", RegisterDate.Split('-').Reverse()); 

其中給出thie結果:2013年1月6日

的問題是,當我嘗試將其插入到表我得到這樣的結果:21/06/1894

當我通過輸入獲取日期它工作在相同的日期格式很大,所以爲什麼在這種情況下,不工作?

更新

如果我試試這個:

var RegisterDate = DateTime.Today.Date; 

我得到錯誤:

在查詢表達式

願望

語法錯誤(缺少操作員)幫助,謝謝!

+1

DB中的數據類型是什麼?約會時間? – Botonomous

+0

是的在DD/MM/YYYY格式 –

+1

爲什麼你不能在你的應用程序中使用DateTime對象而不是字符串? – Botonomous

回答

1

嘗試

string RegisterDate = DateTime.Now.ToString("M-d-yyyy"); 

,然後在數據庫中存儲。

沒有必要手動將日期轉換爲不同的表示形式。你可以通過這個Custom Date and Time Format Strings。但是,我同意Jon Skeet在此答案下的評論:

如果要表示日期/時間類型,請使用日期/時間類型。 您可以利用數據庫可以使用日期/時間值執行的各種事情,並且您永遠不會在該字段中獲取任何非日期/時間值 。

注:

DateTime類型使用Gregorian calendar作爲其默認日曆。所以,正如Jon Skeet指出的那樣,這個答案對其他壓光機(非格里曆日曆)不起作用。

+1

這是一個非常糟糕的主意,通過所有的字符串轉換,海事組織。請注意,如果您使用的是具有非格里曆日曆系統的文化,這對於價值觀來說也會產生嚴重的奇怪現象。 –

+0

@JonSkeet Thaankx指出它......增加了答案。 –

+0

但是,儘管您說「不需要手動將日期轉換爲不同的表示形式」,但您的代碼仍將日期轉換爲字符串表示形式,您可以使用「ToString」將其轉換爲「不同」表示形式。爲什麼這樣做?爲什麼不把它保留爲'DateTime'? –

3

根本不要使用字符串轉換。假設數據庫中的數據類型爲DateTime或類似的東西,只需使用參數並在C#代碼中將其值指定爲DateTime即可。 (我假設你已經在使用參數化SQL,而不是直接在SQL中嵌入數據,如果你還沒有使用參數,請立即開始!)

我建議使用DateTime.Today來使它更清晰你只對日期部分感興趣。 (請注意,這意味着在不同地方運行相同的代碼最終可能會插入不同的日期 - 這樣可以嗎?通常我不喜歡讓系統本地時區受到影響。)

您通常應該避免字符串轉換除非你真的需要數據的字符串表示。在其他時候,他們只是造成麻煩。

編輯:你問了一個例子。這將是這樣的:

using (var connection = new SqlConnection(...)) 
{ 
    connection.Open(); 
    using (var command = new SqlCommand(
     "INSERT INTO Foo (Name, RegisterDate) VALUES (@Name, @RegisterDate)", 
     connection)) 
    { 
     command.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar)) 
          .Value = name; 
     // TODO: Consider whether you really want the *local* date, or some 
     // fixed time zone such as UTC 
     command.Parameters.Add(new SqlParameter("@RegisterDate", SqlDbType.DateTime)) 
          .Value = DateTime.Today; 
     command.ExecuteNonQuery(); 
    } 
} 
+0

謝謝!但你可以發佈代碼應該是什麼樣子? (我只是傾向於這一點,並且我還沒有在C#上做過任何嘗試) –

+0

@NaveTseva:查看我的編輯。您應該*總是*使用SQL中的值參數 - 如果您當前正在構建包含其中值的SQL字符串,那麼您的代碼可能會面臨SQL注入攻擊的風險。 –