2

我需要通过 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);

}
4

1 回答 1

2

连接器可能没有问题。已发布代码的输出不会正确转义内容。

如果内容 =it's don"t working那么输出类似于:

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("\\'");

前两个将输出'。最后一个会输出\'

最后,由于您选择提供给调用者的接口,这个问题无法在 MySQL 中解决,也无法在您的连接器中解决。 void ProcessNonQuery(string strParam)太简单了,无法允许将“转义”工作推入 API 所必需的参数化查询。

因此,您使用此“连接器”获得的任何解决方案都将特定于您从 (C#) 调用它的语言,因为在进入 DB 或 API 层之前必须解决转义问题。许多人认为这种方法很糟糕,这就是为什么他们推动您直接使用任何标准 MySQL 连接器,而不是尝试将其中一个包装在您自己的 API 中。

于 2012-12-20T18:52:31.943 回答