---这是用于个人用途的,所以不要担心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
附近使用正确的语法
答案 0 :(得分:0)
不要试图逃避任何事情 - 只需使用参数化SQL。您现在可能不关心SQL注入攻击,但是您将在某些点...并且通过对您的值使用参数化SQL,您将删除转义和注射攻击问题。哦,你会减少类型转换问题。并使您的SQL更具可读性。这是一场全面的胜利。
请注意DATABASES
是reserved 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();
}
}
}