2014-02-21 62 views
0

我正在使用ServiceStack.ormLite.dll的3.8.5.0版本。ORMLite的ExecuteSQL調用中dateTime.Now的格式是什麼?

我們正在使用postgreSql服務器。我們的postgreSQL服務器的語言環境設置爲en-GB(在postgres.conf中,我們將dateStyle參數設置爲「ISO,DMY」)。

在我們的web應用程序中,當我們通過一個原始的SQL語句:

var insertSql = string.Format("insert into ReportTable values (
            '{0}', '{1}',)", 
              message.Id, DateTime.Now); 

和使用的ExecuteSQL(insertSql),我得到的日期範圍過時的Postgres裏的日期是MDY和數據庫期望DMY。

但是,如果我做的:

var insertSql = string.Format("insert into ReportTable values (
            '{0}', 'now',)", 
              message.Id); 

插入工作。

我知道我可以設置

<globalization Culture="en-GB"/> 

不過,我有一些線程做一些後臺處理,我將不得不改變他們的文化也得到這個工作。

任何想法,如果有任何其他方式我可以解決ormLite庫上的這個問題?

+2

爲什麼你想要傳遞原始SQL,而不是使用參數化SQL?此時,您不必擔心轉換*或* SQL注入攻擊。 –

+0

謝謝喬恩。我意識到通過使用參數化SQL解決了轉換問題,但甚至沒有考慮SQL注入。我會改變我的代碼來迎合這一點。謝謝。 –

回答

1

您必須格式DateTime.Now postgreSQL(或任何關於此事的RDBMS)的預期方式。

var insertSql = string.Format("insert into ReportTable values (
           '{0}', '{1:your format here}',)", 
             message.Id, DateTime.Now); 

例如,如果您的RDBMS預計將在日 - 月 - 年格式的日期,那麼你就需要通過這樣的:

var insertSql = string.Format("insert into ReportTable values (
           '{0}', '{1:dd-MM-yyyy}',)", 
             message.Id, DateTime.Now); 

當然,你也可以使用參數對象作爲喬恩斯基特建議中,儘管你可能有一個原因是你特別想使用string

+2

Pg更喜歡ISO日期,YYYY-MM-DD。所以大多數DB都應該如此。 –

+1

是的,但是OP說他特別在DMY上設置了配置,所以我想我的答案應該考慮到這一點。 ;) – Crono

+2

當然。只是注意到Pg將*總是*接受ISO日期。 –