我必须将浮点值插入到不同的SQL服务器中。每一个都可以有不同的语言环境,所以其中一个的表示可以是"42,2“,而另一个可以是"42.2”或其他什么。我应该如何构造查询才能在任何SQL Server中运行?
在构造查询之前,我需要检测服务器的区域设置吗?
发布于 2010-06-13 10:59:49
除非您传递的是基本常量文字(即。列的数字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#字面值提供。当然,我也可以从变量中添加它,同样不需要将其重新格式化为文本。
您的应该以这种方式传递值,否则您必须处理所有类型的格式化问题,并且如果您从用户处获取值,您还可能为注入攻击设置自己,这是不好的!
发布于 2010-06-13 10:02:26
使用预准备语句。示例(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对字符串进行转义。
发布于 2010-06-13 11:30:58
人们已经回答了插入,但没有回答区域设置。
正如您所期望的那样,SQL具有内置的区域设置支持。如果你给它一个类型,比如说日期,它会将这个日期存储在你在SQL上配置的任何语言环境/排序规则中。将这个从SQL转换到.NET是自动的--您不必显式地将一个US SQL日期转换为GB的.NET日期。
请注意,如果您向SQL发送一个编码为字符串的值,这种智能就会丢失,您要为此负责,因为SQL看到的只是一个字符串,而不是日期或数字。
从SQL中插入或检索本地化的值将在可能的情况下隐式发生-因此使用参数化查询(参数是支持的类型)将是很好的。
我见过日期以字符串形式存储在数据库中的情况。造成了很大的破坏,因为三个客户端分别是GB、US和BR -没有来自.NET或SQL的隐式区域设置支持,他们只是尝试使用它,但在一些客户端上失败了。
https://stackoverflow.com/questions/3031791
复制相似问题