如何通过MySql传递带撇号的C#变量

如何通过MySql传递带撇号的C#变量,c#,mysql,phpmyadmin,apostrophe,C#,Mysql,Phpmyadmin,Apostrophe,我在将变量输入数据库时遇到问题。我看过其他关于如何通过转义来传递变量的文章,但这些解决方案并不适用,因为我是通过API来传递变量的。顺便说一下,我正在用foreach循环遍历数据 level = "" + x.Account_Level + ""; name = "" + x.name + ""; command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(" + level + ", " + name + ")"; co

我在将变量输入数据库时遇到问题。我看过其他关于如何通过转义来传递变量的文章,但这些解决方案并不适用,因为我是通过API来传递变量的。顺便说一下,我正在用foreach循环遍历数据

level = "" + x.Account_Level + "";
name = "" + x.name + "";
command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(" + level + ", " + name + ")";
command.ExecuteNonQuery();  
有时,一个变量返回时会带一个撇号,这会使代码出错。是否可以在每个撇号前插入斜杠,或者有没有像PHP中那样的方法,用单引号将整个变量推过?谢谢

编辑: 这样行吗?我认为我需要添加I来更改每个循环的参数名称,因为它声明了已经声明的参数

using (var web = new WebClient())
        {
        web.Encoding = System.Text.Encoding.UTF8;
        var jsonString = responseFromServer;
        var jss = new JavaScriptSerializer();
        var MatchesList = jss.Deserialize<List<Matches>>(jsonString);
        string connectString = "Server=myServer;Database=myDB;Uid=myUser;Pwd=myPass;";
        MySqlConnection connect = new MySqlConnection(connectString);
        MySqlCommand command = connect.CreateCommand();
        int i = 1;


        connect.Open();
        foreach (Matches x in MatchesList)
        {

            command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(?level" + i + ", ?name" + i + ")";

             command.Parameters.AddWithValue("level" + i, x.Account_Level);
             command.Parameters.AddWithValue("mode" + i, x.name);

            command.ExecuteNonQuery();
            i++;
        }
        connect.Close();                    
    }
使用(var web=new WebClient())
{
web.Encoding=System.Text.Encoding.UTF8;
var jsonString=responseFromServer;
var jss=新的JavaScriptSerializer();
var MatchesList=jss.Deserialize(jsonString);
string connectString=“Server=myServer;Database=myDB;Uid=myUser;Pwd=myPass;”;
MySqlConnection=newmysqlconnection(connectString);
MySqlCommand=connect.CreateCommand();
int i=1;
connect.Open();
foreach(匹配列表中的x)
{
command.CommandText=“插入到`data`(`level`,`name`)值(?level“+i+”,?name“+i+”);
command.Parameters.AddWithValue(“级别”+i,x.Account\u级别);
command.Parameters.AddWithValue(“模式”+i,x.name);
command.ExecuteNonQuery();
i++;
}
connect.Close();
}

快速而肮脏的解决方法是使用以下方法:

level = level.Replace("'","whatever");
但这方面仍然存在问题。它不会捕捉到其他糟糕的字符,甚至可能不适用于撇号的边缘情况

最好的解决方案是不要以这种方式构造查询。相反,要学习如何使用参数化查询,这样SQL注入攻击就不可能发生,并且无论您在其中添加了什么参数,参数都可以工作(当然,这是合理的)

例如(在我的脑海中,可能需要一些调试):


您应该真正使用SQL参数,因为您的代码很容易受到SQL注入攻击。作为一个很好的副作用,你也可以这样解决你的问题。它只是返回我之前已经声明了类似于'@level'的东西。是否可以在参数名中使用变量i中的计数并使用i++每个循环?@Kragalon,是的,您可以这样做。我不会问自己:-)这是安全问题还是效率低下?这似乎是我唯一的选择。由于我需要生成参数,所以在前面,它是一个安全问题。Kragalon说,按照现有的方式构造查询是一个安全问题,因为它使您容易受到SQL注入攻击。有几种方法可以让DBMS执行任意指令。参数化查询解决了这个问题。
MySqlCommand cmd = new MySqlCommand(
    "insert into data (level, name) values (?lvl, ?nm)", con);
cmd.Parameters.Add(new MySqlParameter("lvl", level));
cmd.Parameters.Add(new MySqlParameter("nm", name)); 
cmd.ExecuteNonQuery();