如何对.NET中的两个不同区域使用相同的数据库和相同的程序

如何对.NET中的两个不同区域使用相同的数据库和相同的程序,.net,localization,.net,Localization,我有一个使用SQL Server数据库的C#程序。我已经在一个使用SQL Server数据库的国家使用它了。作为十进制分隔符。 现在我想在另一个国家使用它,作为十进制分隔符 在C#中是否有一些应用程序级设置,我可以更改或编写一些代码,以便使用相同的数据库和相同的程序?或者我必须改变我的整个代码来处理这个新的十进制分隔符 我不知道这是怎么回事。基本上我认为我的Sql查询会有问题。 例如,我现有的一个语句是 现在在新的国家,它将成为 insert into tblproducts(productI

我有一个使用SQL Server数据库的C#程序。我已经在一个使用SQL Server数据库的国家使用它了。作为十进制分隔符。 现在我想在另一个国家使用它,作为十进制分隔符

在C#中是否有一些应用程序级设置,我可以更改或编写一些代码,以便使用相同的数据库和相同的程序?或者我必须改变我的整个代码来处理这个新的十进制分隔符

我不知道这是怎么回事。基本上我认为我的Sql查询会有问题。 例如,我现有的一个语句是

现在在新的国家,它将成为

insert into tblproducts(productId,Price) values('A12',24,10)
这将引起一个错误

所以我必须改变整个代码来处理这种情况吗


谢谢你

你可以做几件事来解决这个问题

首先,如果要从接口中获取值,则要将这些值转换为十进制。Decimal.parse是一个依赖于区域性的函数,将使用当前区域性来解析值。因此,如果CurrentCulture使用逗号作为十进制分隔符,则您的强制转换将正常工作。 然后,当您从变量输出值时,可以指定decimal.ToString格式,以便始终使用句点作为分隔符输出


哦,忘了加。您还可以更改解析以指示货币,这允许逗号和美元符号。例如:decimal.parse(amount,numberstyle.Currency)

在global.asax.vb文件中,可以设置当前页面加载的区域性:

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
这将使所有的区域性感知功能都能很好地工作。e、 (5000.25).ToString()将根据您设置的区域性使用逗号和句点。此外,将用户的输入读入数字类型将根据其区域性规则进行解析。日期将正确显示(2008年9月12日与2008年12月9日)。这些基本上都是免费的

这显然会导致在与其他系统交谈时出现问题,这些系统期望在相同的文化中实现所有功能。要解决此问题,请使用不变区域性编写查询:

(5000.25).ToString(CultureInfo.InvariantCulture) 
这将显式地将输出设置为Mysql可以处理的内容


注意:如果您有一个合适的数据层,并将数字类型传递给它,您可能可以避免很多这种混乱。

如果您使用字符串连接构建查询,请改用参数。 因此,与其写:

 var query = "insert into tblproducts(productId,Price) values('" + article + "','"
    + price + ')';
使用:

这将为您节省很多麻烦,包括本地化问题

 var query = "insert into tblproducts(productId,Price) values('" + article + "','"
    + price + ')';
 var query = "insert into tblproducts(productId,Price) values(?,?)"
 var cmd = new OleDbCommand(query, connection);
 cmd.Parameters.Add("@article", OleDbType.VarChar).Value = article;
 cmd.Parameters.Add("@price", OleDbType.Single).Value = price;