2010-03-17 41 views
1

考慮這個代碼片段:如何在C#中的SQLite數據庫中插入和查詢DateTime對象?

string sDate = string.Format("{0:u}", this.Date); 

      Conn.Open(); 
      Command.CommandText = "INSERT INTO TRADES VALUES(" + "\"" + this.Date + "\"" + "," +this.ATR + "," + "\"" + this.BIAS + "\"" + ")"; 
      Command.ExecuteNonQuery(); 

注意該命令的 「this.Date」 的一部分。現在Date是C#環境DateTime類型的一個對象,數據庫不存儲它(在SQLite論壇的某處,它寫道ADO.NET封裝器會自動將DateTime類型轉換爲ISO1806格式)

但不是這樣。我使用sDate(顯示在第一行),然後正確存儲。

我的探頭實際上並沒有在這裏結束。即使我使用「sDate」,我也必須通過查詢來檢索它。而考慮創建問題

這種格式

SELECT * FROM <Table_Name> WHERE DATES = "YYYY-MM-DD" 

回報沒有任何查詢,而用「>」或更換「=」「<」返回正確的結果。

所以我的觀點是:

如何查詢從SQLite數據庫日期變量。

,如果有與我將其存儲(即非1806兼容)的方式有問題,那麼我該如何使之符合

+1

你正在使用哪個SQLite庫? – SLaks

+0

System.Data.SQLite,用於SQLite的ADO.NET包裝器 – Soham

+1

有幾個用於SQLite的ADO.NET包裝器。 System.Data.SQLite是最常見的,但如果您將其稱爲「ADO.NET包裝器」,則其他包裝提供程序將被冒犯。 –

回答

5

ADO.NET的包裝不能將DateTime值轉換爲ISO 8601(不是1806),如果您將其轉換爲字符串並將其放入查詢中。您需要使用的參數爲:

Command.CommandText = "INSERT INTO TRADES VALUES (@Date, @Atr, @Bias)"; 
Command.Parameters.Add("@Date", this.Date); 
Command.Parameters.Add("@Atr", this.ATR); 
Command.Parameters.Add("@Bias", this.BIAS); 
Conn.Open(); 
Command.ExecuteNonQuery(); 

(再說了,你轉換的日期時間值的字符串,並放在SDATE變量,但你使用的日期時間值反正產生的SQL查詢。)

同樣獲取數據時適用:

Command.CommandText = "SELECT * FROM <Table_Name> WHERE DATES = @Date"; 
Command.Parameters.Add("@Date", theDate); 
+0

是的,我只是展示了另一種選擇。我沒有寫和檢查這個日期以及sDate。 SDate的工作,這個日期不。 感謝Guffa,我想也許問題就解決了,讓我插上電源,檢查 – Soham

2

關於你的第二個問題,如果SQLite是任何接近的SQL Server,

SELECT * FROM其中日期=「Y YYY-MM-DD'不會返回,因爲它可能會隱含地將YYYY-MM-DD轉換爲YYYY-MM-DD 00:00:00。您可能需要添加一個範圍(例如,大於或等於今天,小於tomrrow)。

+0

-1如果SQLite是任何接近到SQL Server。 –

+0

對不起,如果我沒有足夠明確的。當我說SQLite接近SQL Server時,我的意思是從查詢語言的角度來看。我以前沒有碰過SQLite,而且我意識到其他類型的SQL在執行基本命令的方式上可能存在差異。 –

+0

只是把它回到0.我明白你的意思,瓦格納... –

0

@Guffa,我收到這條線 「不能轉換從System.DateTime的到的System.Data.DbType」:

Command.Parameters.Add( 「@日」,this.Date);

+1

有一些不同的重載創建參數。檢查有什麼可用的文檔,並使用preferrably過載,您可以指定數據類型,喜歡的東西:'Command.Parameters.Add(「@日」,DbType.DateTime).value的= this.Date;' – Guffa

相關問題