[英]SQL Server Database store number data as exponential
我有一個簡單的控制台應用程序,該應用程序使用OpenXML從excel文件(source.xlsx)中讀取,並使用ADO.NET進行SQL插入,以將數據保存到SQL Server數據庫中。
當我讀取一個十進制數字(如0.00015)時發現了問題,在將其保存到SQL Server之后,它將被保存為“ 1.5 E-2”而不是0.00015。
當我嘗試在生產環境中運行它時,會出現此問題,但是當我嘗試在過渡環境中運行它時,不會發生此問題(在過渡環境中,它另存為0.00015)。
至於環境之間的差異,我還沒有發現任何有用的東西,到目前為止,所有設置看起來都一樣(我很可能錯過了一些重要的東西)。
以這種方式存儲數據的根本原因可能是什么?如何防止這種情況?
一個可能的原因是如果您使用以下方式創建SQL Insert語句:
float value = 0.00015f;
string sql = "INSERT INTO [mytable] ([fieldname]) VALUES (" + value.ToString() + ")";
要么
string sql = string.Format("INSERT INTO [mytable] ([fieldname]) VALUES ({0})", value);
這兩個都依靠.net的字符串格式來生成有效的SQL,這是不安全的。 默認的字符串格式將產生“更緊湊的定點或科學計數法”。 因此,您有時會得到科學計數法(1.5E-5),有時會得到定點格式(0.00015)。 您在服務器和開發環境上的文化可能不同,這可能會影響哪種格式更緊湊。
正確的方法是在SQL中使用參數,以避免格式問題和SQL注入:
using (var cmd = dbConnection.CreateCommand()) {
var prm = cmd.CreateParameter();
prm.ParameterName = "value";
prm.DbType = DbType.Single;
prm.Direction = ParameterDirection.Input;
prm.Value = 0.00015f;
cmd.Parameters.Add(prm);
cmd.CommandText = "INSERT INTO [mytable] ([fieldname]) VALUES (@value)";
cmd.ExecuteNonQuery();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.