-这是个人使用的,所以不要担心SQL注入---
我已经浏览了几个关于C#的mySQL转义的教程,但找不到一个适合我的教程(也许我只是用错了)
我正在尝试将数据插入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:UserssomePCDocumentssomeFoldersomefile.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@name.com
错误:
附加信息:您的SQL语法有错误;查看与MariaDB服务器版本对应的手册,了解在数据库(数据)VALUES 附近使用的正确语法
不要试图转义任何内容,只需使用参数化SQL即可。您现在可能不关心SQL注入攻击,但您会在某个点。。。通过对您的值使用参数化SQL,您将消除转义和注入攻击问题。哦,这样可以减少类型转换问题。并提高SQL的可读性。这是一场全面的胜利。
请注意,DATABASES
是一个保留字,所以您确实需要引用它,或者将表的名称更改为不会那么尴尬的名称。
// 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();
}
}
}