当我尝试在MySQL中的表中插入double值时出现错误。 我使用C#来构建我的事务,使用ODBC驱动程序将我的数据库连接到我的项目。
在我的aspx页面中,我创建了一个表单,允许用户填写多个字段并提交值。通过Ajax调用,我在发送表单值的后面进入我的代码。我开始交易。
但是,我检查双值并且它是正确的。我也尝试在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个字段的名字放在表名之后,但我得到了相同的结果。
你有想法解决它吗?
答案 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());
}
}
}