使用C#中的mySQL转义逗号,冒号和单引号

时间:2015-11-18 15:02:08

标签: c# mysql

---这是用于个人用途的,所以不要担心SQL注入---

我一直在浏览几个关于mySQL逃避C#的教程,但找不到适合我的教程(也许我只是错误地使用它)

我正在尝试将数据插入mySQL数据库。

以下是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Diagnostics;
using System.Net;
using System.IO;
using System.Security.Cryptography;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace HASHSITE
{
    class Program
    {
        static void Main(string[] args)
        {
            bool success;
            int done = 0;

            string path = @"C:\Users\somePC\Documents\someFolder\somefile.txt";

            string server = "someIP";
            string database = "some_db";
            string uid = "some_dbu";
            string password = "pass";
            string connectionstring = "SERVER=" + server + ";DATABASE=" + database + ";UID=" + uid + ";PASSWORD=" + password + ";";

            using (var connection = new MySqlConnection(connectionstring))
            {
                connection.Open();
                using (var cmd = new MySqlCommand("INSERT INTO databases(data) VALUES(@name)", connection))
                {
                    var parameter = cmd.Parameters.Add("@name", MySqlDbType.LongText);
                    foreach(string line in File.ReadLines(path))
                    {
                        success = false;
                        while (!success)
                        {
                            parameter.Value = line;
                            cmd.ExecuteNonQuery(); //ERROR IS HERE
                            success = true;
                        }
                        done += 1;
                        Console.WriteLine("\n" + done);
                    }
                }
            }
        }
    }
}

我需要转义字符串行中出现的逗号

  

名,名@ name.com

ERROR:

  

其他信息:您的SQL语法有错误;检查与MariaDB服务器版本对应的手册,以便在'databases(data)VALUES

附近使用正确的语法

1 个答案:

答案 0 :(得分:0)

不要试图逃避任何事情 - 只需使用参数化SQL。您现在可能不关心SQL注入攻击,但是您将在某些点...并且通过对您的值使用参数化SQL,您将删除转义注射攻击问题。哦,你会减少类型转换问题。并使您的SQL更具可读性。这是一场全面的胜利。

请注意DATABASESreserved word,所以你需要引用它 - 或者将你的表名更改为不会那么尴尬的东西。

// TODO: Specify the column name as well, for clarity if nothing else
cmd.CommandText = "INSERT INTO 'databases' VALUES(@name)";
// Adjust for your actual type
cmd.Parameters.Add("@name", MySqlDbType.LongText).Value = line;
...

请注意,您只想调用cmd.Parameters.Add 一次,因此在您使用循环的情况下,您可能希望在循环外调用它(并设置命令文本) ,然后在循环中设置Value属性。

如果有疑问,养成尽早做正确事情的习惯,而不是假设你以后会找到时间来消除你的坏习惯。

当你在这里时,现在是开始使用using语句的好时机......你可以重复使用几乎所有内容,只需在每次迭代时更改参数值:

using (var connection = new MySqlConnection(...))
{
    connection.Open();
    using (var command = new MySqlCommand("INSERT INTO 'databases' VALUES(@name)", connection)
    {
        var parameter = command.Parameters.Add("@name", MySqlDbType.LongText);
        foreach (...)
        {
            parameter.Value = line;
            command.ExecuteNonQuery();
        }
    }
}