【发布时间】:2016-11-01 03:51:26
【问题描述】:
我正在尝试将十进制值从 C# 传递到 SQL 数据库。我构建了一个 INSERT 查询字符串并使用 SqlCommand 将其发送。我遇到的问题是,当我在 Windows 窗体中输入值时,它们以逗号分隔小数点(即 55,679)保存。这在 SQL 查询字符串中很明显(我已经通过调试进行了检查)。但似乎数据库查询需要一个小数点(即 55.679)。这可能与我所在的地区和那里的标准有关(即欧洲使用“,”作为小数点分隔符)。有人知道怎么设置吗?
函数的代码如下。问题存在于Vmax、Vmin、Imax。
public bool addBattery(Battery b)
{
bool outcome = false;
string sql = @"INSERT INTO [BATTERY_INFO]
(BatteryType, VoltageMax, VoltageMin, Capacity, CurrentMax, Manufacturer, Serial)
VALUES ('" + b.BatteryType.ToString() + "'," + b.Vmax + "," + b.Vmin + ","
+ b.Capacity + ","+b.Imax+ ",'"+b.Manufacturer.ToString()+"','"+b.Serial.ToString()+"')";
SqlCommand command = new SqlCommand(sql, this.sql_conn);
try
{
command.ExecuteNonQuery();
MessageBox.Show("Inserted Battery Successfully");
outcome = true;
}
catch (Exception e)
{
MessageBox.Show("SQL INSERT error \n\n" + e.Message);
}
return outcome;
}
【问题讨论】:
-
请使用参数化查询而不是字符串连接:msdn.microsoft.com/en-us/library/…
-
正如@Stanley 建议的那样,参数化查询将解决小数分隔符的问题并有助于提高数据库性能。
-
你能告诉我们电池类的样子吗?而且,还有更好的插入方法。试试这样的方法:new SqlParameter("@VmaxParameter", SqlDbType.Decimal, b.VMax),
-
我会这样做的,谢谢。只是出于兴趣,参数化查询是否也为软件增加了安全性?我在this thread 中看到他们这样做了。有人可以发送一个链接来确认吗?
-
@tdwolff:是的,这也增加了安全性,想象一下如果您在
b.Imax值中获得值666,'uh','oh'); DROP TABLE BATTERY_INFO; --会发生什么。
标签: c# sql-server decimal