簡體   English   中英

SQL Server數據庫存儲數字數據為指數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM