我需要通过 C# 将文本插入到 MySQL 表中。 dbConnect
是我自己创建的适配器,ProcessNonQuery
仅接受一个字符串。
我无法插入包含字符 "
和 '
的文本。
这是我的尝试:
public void InsertArticle(string name, string title, string keywords, string desc, string content, int idCategory,bool featured)// int level, int typeArt
{
this.dbConnect.ProcessNonQuery(" set global sql_mode=\"NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"");
string strFeatured;
if (featured)
strFeatured = "1";
else
strFeatured = "0";
content = content.Replace("'", "\'");
StringBuilder sbInsertArticle = new StringBuilder("INSERT INTO Article(NameArt, TitleArt, keywordsArt, DescArt, ContentArt, idCategory, idLevel, idTypeArt, Featured) VALUES('");
sbInsertArticle.Append(name); sbInsertArticle.Append("', '");
sbInsertArticle.Append(title); sbInsertArticle.Append("', '");
sbInsertArticle.Append(keywords); sbInsertArticle.Append("', '");
sbInsertArticle.Append(desc); sbInsertArticle.Append("', '");
sbInsertArticle.Append(content); sbInsertArticle.Append("', '");
sbInsertArticle.Append(idCategory.ToString()); sbInsertArticle.Append("', '");
sbInsertArticle.Append(1); sbInsertArticle.Append("', '");
sbInsertArticle.Append(1); sbInsertArticle.Append("', '");
sbInsertArticle.Append(strFeatured); sbInsertArticle.Append("')");
string strInsertArticle = sbInsertArticle.ToString();
this.dbConnect.ProcessNonQuery(strInsertArticle);
}
最佳答案
连接器可能没有任何问题。发布的代码的输出不会正确转义内容。
如果 content = 它不起作用
那么输出类似于:
INSERT INTO Article(NameArt, TitleArt, keywordsArt,
DescArt, ContentArt, idCategory, idLevel, idTypeArt, Featured)
VALUES('foo', 'bar', 'mysql escaping', 'hmph',
'it's don"t working', '12', '1', '1', '1');
这在任何连接器中都应该失败。
content = content.Replace("'", "\\'");
将是一个开始,但您至少应该使用类似mysql_real_escape_string()
的东西。
编辑:进一步解释
在测试程序中运行以下几行:
Console.WriteLine("'");
Console.WriteLine("\'");
Console.WriteLine("\\'");
前两个将输出'
。最后将输出\'
。
最后,由于您选择向调用者提供的接口(interface),这个问题无法在 MySQL 中解决,也无法在您的连接器中解决。 void ProcessNonQuery(string strParam) 过于简单,无法进行参数化查询,而参数化查询是将“转义”工作插入 API 所必需的。
因此,使用此“连接器”获得的任何解决方案都将特定于您调用它的语言 (C#),因为在进入 DB 或 API 层之前必须解决转义问题。许多人认为这种方法很糟糕,这就是为什么他们敦促您直接使用任何标准 MySQL 连接器,而不是尝试将其中一个包装到您自己的 API 中。
关于sql - 创建 MySQL 字符串 "safe"(转义双引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13977744/