在MySQL

时间:2015-12-28 09:42:38

标签: c# mysql transactions odbc

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

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

  • 如果用户在双重表单中放置例如“15.00” 值,resquest是好的,没有问题。
  • 但如果他输入“15.65”,我会收到一个错误,表示该列 我的表的数量与请求列数不匹配。

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

这是错误:

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

证明我的函数参数的几个变量

我的桌子中有17个字段,我通常会在我的请求中发送17个值。但是当我用逗号后面的数字设置双倍时,我得到一个错误。根据错误信息,我们可以假设,逗号后的数字与插入中的其他字段一样考虑!

有疑问我在我的请求中将17个字段的名字放在表名之后,但我得到了相同的结果。

你有想法解决它吗?

2 个答案:

答案 0 :(得分:0)

要使数据库驱动程序将用户输入中的值视为单独的数据,您应该使用参数化查询。因此,如果您的表有一个名为height的双列,例如。

INSERT INTO datas height
VALUES @height

其中@height是从请求的输入中解析的double值,例如使用double parsedHeight = double.Parse(subbmittedValue)。然后,您可以在创建SQL命令时添加参数:

command.Parameters.AddWithValue("@height", parsedHeight);

正如@MarkoJuvanč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();
    }
}

答案 1 :(得分:0)

   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());

            }
        }
    }