2010-06-13 18 views
3

我必須將浮點值插入到不同的SQL Server中。每個人可以有不同的地區,因此在一個它可以是「42,2」和另一個「42.2」或其他。我應該如何構建查詢,以便它可以在任何SQL Server中工作?如何將浮點值插入到正確語言環境的SQL表中

我是否需要在構建查詢之前檢測服務器的區域設置或什麼?

+1

內部浮點數是一個浮點數,而不管語言環境如何。你是否在談論以文本形式表現的花車? – 2010-06-13 09:58:29

+0

據我所知,將數據插入SQL服務器的唯一方法是通過字符串查詢是不是? – 2010-06-13 10:32:54

+1

您可以使用參數化查詢。 – 2010-06-13 10:42:32

回答

7

除非您傳遞基本的常量字面值(即每次都爲數字0和1),那麼您應該使用參數化查詢。

要做到這一點,您需要在您的SQL語句中指定「這裏我沒有寫入值,但是我會在SQL語句旁邊提供此參數的值」。

這裏是如何做到這一點在.NET:

using (SqlCommand cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = "INSERT INTO tablename (column) VALUES (@value)"; 
    cmd.Parameters.Add("@value", 42.2);      ^
    cmd.ExecuteNonQuery();^         | 
}       |         | 
          +-- these have to match up ----------+ 

在這裏你可以看到,我不這樣做的價值的任何格式可言,我提供它作爲一個普通的C#字面值。我當然也可以從變量中添加它,而不必將其重新格式化爲文本。

應該通過這種方式傳遞值,或者你必須處理各種格式問題,並且如果你從用戶獲取值,你也可以設置自己的SQL注入攻擊,這是不好的!

+0

+1的建議 – 2010-06-13 11:34:17

+0

看起來非常好。謝謝。我曾經使用String.Format(「INSERT INTO xxx VALUES({0},{1} ...」)構建查詢 – 2010-06-13 12:28:49

1

使用準備好的語句。例如(在Java中):

long id=1234; 
BigDecimal value = new BigDecimal("42.2");// parse it, or get it form a text field 

PreparedStatement pstmt = connection.prepareStatement(
    "UPDATE test_table SET decimal_field=? WHERE id=?"); 
pstmt.setBigDecimal(1, value); 
pstmt.setLong(2, id); 
pstmt.executeUpdate(); 

預處理語句,你不必擔心與''sql injection逃逸字符串。

+0

你知道在.Net中是否有像PreparedStatement這樣的字眼嗎? – 2010-06-13 10:33:42

+0

也許SQLParameters會工作...我會檢查。 – 2010-06-13 10:36:00

1

人們已經回答了插入問題,但沒有回答問題。

正如您所期望的那樣,SQL支持內置語言環境。如果你給它一個類型,比如說一個日期,它會將這個日期存儲在你在SQL上配置的任何語言環境/排序規則中。從SQL到.NET的消費是自動的 - 您不必將美國SQL日期顯式轉換爲GB .NET日期。

請注意,如果您發送SQL編碼爲字符串的值,則此智能會丟失,因爲所有SQL看到的都是字符串 - 不是日期或數字。

插入或檢索SQL中的本地化值將在可能的情況下隱式發生 - 因此使用參數化查詢(參數爲受支持的類型)將會很好。

我已經看到日期被作爲字符串存儲在數據庫中的情況。由於三個客戶端是GB,US和BR,導致嚴重破壞 - 不支持來自.NET或SQL的隱式區域設置,他們只是嘗試並使用它並在某些方面失敗。

相關問題