在 MySQL 中插入双精度值时出现问题
Problems when insert double value in MySQL
当我尝试将双精度值插入 MySQL 中的 table 时出现错误。
我使用 C# 构建我的事务,使用 ODBC 驱动程序将我的数据库连接到我的项目。
在我的 aspx 页面中,我创建了一个表单,允许用户填写多个字段并提交值。通过 Ajax 调用,我进入了发送表单值的代码。我开始我的交易。
- 如果用户在表格中输入例如“15.00”
值,请求正常,没有问题。
- 但如果他输入“15.65”,我会收到一条错误消息,指出该列
我的 table 的计数与请求列的计数不匹配。
但是,我检查了双精度值,它是正确的。我也尝试在双精度值旁边加上简单的引号,但它不起作用。
这是错误:
`{"Message":"[MySQL][ODBC 5.1 Driver][mysqld-5.1.73-community]Column count doesn\u0027t match value count
at row 1","StackTrace":" à ADODB.ConnectionClass.Execute(String CommandText, Object& RecordsAffected
, Int32 Options)\r\n...
这是我的请求:
Utils.ocn.Execute("INSERT INTO datas VALUES(0,null,null,null,null,null," + RecepAccId + ",1," + CafId + ",123,null,null," + NbrKilos + ",'" + ConvertedDate + "','" + Chrono + "','" + ConvertedTimeStamp + "','" + ChronoNum + "')", out x, -1);
证明我函数参数的几个变量
我的 table 中有 17 个字段,我通常在请求中发送 17 个值。但是,当我在逗号后设置带有数字的双精度数时,我遇到了一个错误。根据错误消息,我们可以假设,逗号后面的数字被认为是插入中的其他字段!
有疑问,我在请求中将 17 个字段的名称放在 table 名称之后,但我得到了相同的结果。
你有解决办法吗?
要让您的数据库驱动程序将用户输入的值视为单独的数据片段,您应该使用参数化查询。因此,如果您的 table 有一个名为 height 的双列,例如。
INSERT INTO datas height
VALUES @height
其中 @height
是从请求的输入解析的双精度值,例如使用 double parsedHeight = double.Parse(subbmittedValue)
。然后,您可以在创建 SQL 命令时添加参数,方法是添加:
command.Parameters.AddWithValue("@height", parsedHeight);
正如@Marko Juvančič 所说,使用来自用户输入的字符串连接来创建 sql 语句是危险的。事实上,这是一个主要的安全问题,让你容易受到 SQL 注入。想象一下,一个恶意用户输入了一个 SQL 查询来删除表单中的数据。如所述对您的查询进行参数化可以防止用户干扰您的查询,从而保护您免受此影响。
所以把所有这些放在一起,而不是用 Utils.ocn.Execute 执行你的连接语句,使用类似的东西:
double parsedValue = double.Parse(valueFromRequest);
//be careful, this will throw if the user didn't enter a valid double.
string connectionString = yourConnectionString;
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
using (OdbcCommand command = new OdbcCommand(
"INSERT INTO datas columnName VALUES(@value)", connection))
{
command.Parameters.AddWithValue("@value", parsedValue);
command.ExecuteNonQuery();
}
}
private double failingGrade;
public double getFailingGrade()
{
using (MySqlConnection conn = new MySqlConnection(DBConnection.Connection()))
{
conn.Open();
using (MySqlCommand comm = conn.CreateCommand())
{
comm.CommandText = "select failing from gradespercentage_tab";
return failingGrade = double.Parse(comm.ExecuteScalar().ToString());
}
}
}
当我尝试将双精度值插入 MySQL 中的 table 时出现错误。 我使用 C# 构建我的事务,使用 ODBC 驱动程序将我的数据库连接到我的项目。
在我的 aspx 页面中,我创建了一个表单,允许用户填写多个字段并提交值。通过 Ajax 调用,我进入了发送表单值的代码。我开始我的交易。
- 如果用户在表格中输入例如“15.00” 值,请求正常,没有问题。
- 但如果他输入“15.65”,我会收到一条错误消息,指出该列 我的 table 的计数与请求列的计数不匹配。
但是,我检查了双精度值,它是正确的。我也尝试在双精度值旁边加上简单的引号,但它不起作用。
这是错误:
`{"Message":"[MySQL][ODBC 5.1 Driver][mysqld-5.1.73-community]Column count doesn\u0027t match value count
at row 1","StackTrace":" à ADODB.ConnectionClass.Execute(String CommandText, Object& RecordsAffected
, Int32 Options)\r\n...
这是我的请求:
Utils.ocn.Execute("INSERT INTO datas VALUES(0,null,null,null,null,null," + RecepAccId + ",1," + CafId + ",123,null,null," + NbrKilos + ",'" + ConvertedDate + "','" + Chrono + "','" + ConvertedTimeStamp + "','" + ChronoNum + "')", out x, -1);
证明我函数参数的几个变量
我的 table 中有 17 个字段,我通常在请求中发送 17 个值。但是,当我在逗号后设置带有数字的双精度数时,我遇到了一个错误。根据错误消息,我们可以假设,逗号后面的数字被认为是插入中的其他字段!
有疑问,我在请求中将 17 个字段的名称放在 table 名称之后,但我得到了相同的结果。
你有解决办法吗?
要让您的数据库驱动程序将用户输入的值视为单独的数据片段,您应该使用参数化查询。因此,如果您的 table 有一个名为 height 的双列,例如。
INSERT INTO datas height
VALUES @height
其中 @height
是从请求的输入解析的双精度值,例如使用 double parsedHeight = double.Parse(subbmittedValue)
。然后,您可以在创建 SQL 命令时添加参数,方法是添加:
command.Parameters.AddWithValue("@height", parsedHeight);
正如@Marko Juvančič 所说,使用来自用户输入的字符串连接来创建 sql 语句是危险的。事实上,这是一个主要的安全问题,让你容易受到 SQL 注入。想象一下,一个恶意用户输入了一个 SQL 查询来删除表单中的数据。如所述对您的查询进行参数化可以防止用户干扰您的查询,从而保护您免受此影响。
所以把所有这些放在一起,而不是用 Utils.ocn.Execute 执行你的连接语句,使用类似的东西:
double parsedValue = double.Parse(valueFromRequest);
//be careful, this will throw if the user didn't enter a valid double.
string connectionString = yourConnectionString;
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
using (OdbcCommand command = new OdbcCommand(
"INSERT INTO datas columnName VALUES(@value)", connection))
{
command.Parameters.AddWithValue("@value", parsedValue);
command.ExecuteNonQuery();
}
}
private double failingGrade;
public double getFailingGrade()
{
using (MySqlConnection conn = new MySqlConnection(DBConnection.Connection()))
{
conn.Open();
using (MySqlCommand comm = conn.CreateCommand())
{
comm.CommandText = "select failing from gradespercentage_tab";
return failingGrade = double.Parse(comm.ExecuteScalar().ToString());
}
}
}