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

コネクタに問題はないと思われます。投稿されたコードの出力は、コンテンツを適切にエスケープしません。

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

最初の 2 つは を出力します'。最後は を出力します\'

最後に、この問題は MySQL では解決できません。また、呼び出し元に提供するために選択したインターフェイスが原因で、コネクタでも解決できません。 void ProcessNonQuery(string strParam)「エスケープ」作業を API にプッシュするために必要なパラメーター化されたクエリを許可するには単純すぎます。

したがって、この「コネクタ」で得られるソリューションは、DB または API レイヤーに到達する前にエスケープの問題を解決する必要があるため、呼び出す言語 (C#) に固有のものになります。多くの人は、この方法論が貧弱であると考えています。そのため、標準の MySQL コネクタのいずれかを独自の API にラップしようとするのではなく、いずれかを直接使用するように勧めているのです。

于 2012-12-20T18:52:31.943 に答える