【发布时间】:2019-10-16 13:44:16
【问题描述】:
我真的很难用 OdbcConnection 和 MySQL 在 C# 中创建参数化插入查询。如果我在 SQL 语句中使用字符串连接,它可以正常工作。但是,我需要接受来自文本框的用户输入,这很容易受到 SQL 注入的攻击。
当我尝试设置参数化查询时,命令 sorta 有效。一条记录被插入到数据库中,所以我知道正在建立连接并且可以插入一条记录。问题是所有插入的字段值都是空的,就好像它没有读取参数一样。
以下代码有效:
public static void Insert(string connectionString, Vendor vendor)
{
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
string SQL = "INSERT INTO tbl_vendor (name) VALUES (\"" + vendor.Name + "\")";
using (OdbcCommand command = new OdbcCommand(SQL, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}
}
以下代码插入一条空记录:
public static void Insert(string connectionString, Vendor vendor)
{
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
string SQL = "INSERT INTO tbl_vendor (name) VALUES (@name)";
using (OdbcCommand command = new OdbcCommand(SQL, connection))
{
OdbcParameter parameter = new OdbcParameter("@name", vendor.Name);
command.Parameters.Add(parameter)
connection.Open();
command.ExecuteNonQuery();
}
}
}
我已经尝试了上述代码的一百万种不同的变体。他们似乎都工作,但每次他们只插入一个空记录。我可能遗漏了一些明显的东西并使事情变得比他们需要的更复杂,但我做错了什么?
【问题讨论】:
-
您是否使用过硬编码的
SQL字符串(例如INSERT INTO tbl_vendor (name) VALUES ('test'))? -
在调用 ExecuteNonQuery 方法之前,需要将值设置为参数:`parameter.Value = 'Something'。
-
你可以试试这个sql字符串
string SQL = "INSERT INTO tbl_vendor (name) VALUES (?)";和使用这个参数OdbcParameter parameter = new OdbcParameter("?", vendor.Name); -
啊哈!!哈克曼的建议最终奏效了。使用 ?标记而不是命名参数有效,尽管它比使用命名参数更令人困惑。
标签: c# mysql parameters insert odbc