在 MySQL 中插入双精度值时出现问题

Problems when insert double value in MySQL

当我尝试将双精度值插入 MySQL 中的 table 时出现错误。 我使用 C# 构建我的事务,使用 ODBC 驱动程序将我的数据库连接到我的项目。

在我的 aspx 页面中,我创建了一个表单,允许用户填写多个字段并提交值。通过 Ajax 调用,我进入了发送表单值的代码。我开始我的交易。

但是,我检查了双精度值,它是正确的。我也尝试在双精度值旁边加上简单的引号,但它不起作用。

这是错误:

`{"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());

            }
        }
    }