我對.net中的Sqlite沒有太多的經驗,但我看到的行爲很奇怪。比方說,我們有以下project.json
一個.net核心應用:小數類型從內存中的Sqlite數據庫讀取爲double或int
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.Data.Sqlite": "1.0.0",
"Dapper": "1.50.2"
},
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
}
},
"imports": "dnxcore50"
}
}
}
另外,我們有一個簡單的類Item
:
public class Item
{
public Item() { }
public Item(int id, string name, decimal price)
{
this.Id = id;
this.Name = name;
this.Price = price;
}
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
然後,我創建的內存數據庫和填充數據(使用小巧玲瓏):
var connection = new SqliteConnection("Data Source=:memory:");
connection.Open();
connection.Execute("CREATE TABLE IF NOT EXISTS Items(Id INT, Name NVARCHAR(50), Price DECIMAL)");
var items = new List<Item>
{
new Item(1, "Apple", 3m),
new Item(2, "Banana", 1.4m)
};
connection.Execute("INSERT INTO Items(Id, Name, Price) VALUES (@Id, @Name, @Price)", items);
然後我嘗試從Items
表如下:
var dbItems = connection.Query<Item>("SELECT Id, Name, Price FROM Items").ToList();
當運行該溶液中,得到類似如下例外:
未處理異常:System.InvalidOperationException:錯誤解析 第2列(價格= 1.4 - 雙)---> System.Invali dCastException : 無法投射「System.Double」類型的對象以鍵入「System.Int64」。
好吧,那我就用Microsoft.Data.Sqlite
獲取數據:
var command = connection.CreateCommand();
command.CommandText = "SELECT Price FROM Items";
var reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader[0].GetType());
}
結果我得到:
System.Int64 // Price = 3
System.Double // Price = 1.4
我試圖運行與小數的價格真正的數據庫查詢,返回的數據類型是正確的,並且總是十進制的(如預期的那樣)。
我應該進一步挖掘什麼方向?我的內存數據庫有問題嗎?如何使其與小數一致?
哇,我會很高興,感謝您的鏈接,會讀。那麼這是否適用於插入和選擇?我確信,當我使用一個真正的數據庫文件,並在那裏使用了一個「decimal」字段時,它按預期的方式被讀取(如十進制),沒有錯誤。我現在很困惑...... –
SQLite會將您示例中的第一個值存儲爲「3」,而不是「3.0」或「3m」。當它讀取它時,由於動態類型是假設值是一個int。真正的數據庫具有強類型數據,因此它不做任何假設,並將其作爲十進制返回。 – bib1257