将十进制值从 C# 传递到 SQL 数据库的问题
Problems with Passing Decimal Values From C# to SQL Database
我正在尝试将十进制值从 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;
}
正如评论中指出的那样,使用参数化查询将解决小数问题,并防止可能的安全风险,例如 sql 注入。该方法看起来像这样。
我假设你 Open()
和 Close()
连接在别处,因为我在你的代码中没有看到。
{
bool outcome = false;
SqlCommand cmd = new SqlCommand();
cmd.Connection = this.sql_conn;
cmd.Parameters.AddWithValue("BatteryType", b.BatteryType);
cmd.Parameters.AddWithValue("VoltageMax", b.Vmax);
cmd.Parameters.AddWithValue("Capacity", b.Capacity);
cmd.Parameters.AddWithValue("CurrentMax", b.Imax);
cmd.Parameters.AddWithValue("Manufacturer", b.Manufacturer.ToString());
cmd.Parameters.AddWithValue("Serial", b.Serial.ToString());
try
{
cmd.ExecuteNonQuery();
MessageBox.Show("Inserted Battery Successfully");
outcome = true;
}
catch(Exception e)
{
MessageBox.Show("SQL INSERT error \n\n" + e.Message);
}
return outcome;
}
我正在尝试将十进制值从 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;
}
正如评论中指出的那样,使用参数化查询将解决小数问题,并防止可能的安全风险,例如 sql 注入。该方法看起来像这样。
我假设你 Open()
和 Close()
连接在别处,因为我在你的代码中没有看到。
{
bool outcome = false;
SqlCommand cmd = new SqlCommand();
cmd.Connection = this.sql_conn;
cmd.Parameters.AddWithValue("BatteryType", b.BatteryType);
cmd.Parameters.AddWithValue("VoltageMax", b.Vmax);
cmd.Parameters.AddWithValue("Capacity", b.Capacity);
cmd.Parameters.AddWithValue("CurrentMax", b.Imax);
cmd.Parameters.AddWithValue("Manufacturer", b.Manufacturer.ToString());
cmd.Parameters.AddWithValue("Serial", b.Serial.ToString());
try
{
cmd.ExecuteNonQuery();
MessageBox.Show("Inserted Battery Successfully");
outcome = true;
}
catch(Exception e)
{
MessageBox.Show("SQL INSERT error \n\n" + e.Message);
}
return outcome;
}