4
private void button14_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                    string c = openFileDialog1.FileName;

                    string connString = "Server=Localhost;Database=test;Uid=root;password=root;";
                    MySqlConnection conn = new MySqlConnection(connString);
                    MySqlCommand command = conn.CreateCommand();
                    command.CommandText = ("Insert into data (path) values('" + c + "')");
                    conn.Open();
                    command.ExecuteNonQuery();
                    conn.Close();
                    MessageBox.Show("Success");
                }
            }

このコードは私にとってはうまくいきますが、残念ながら、データベースに保存されているパスは正しくありません..保存されているパスは、このようC:Users hesisDesktopREDEFENSEResourcesImagesRED1f.pngになっているはずの場所がこのようになっています ( C:P/Users/thesis/Desktop..../1f.png)。

しかし、このコードで「sr」値を確認すると..メッセージボックスは正しく表示されます..

private void button14_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {         
        MessageBox.Show(openFileDialog1.FileName);
    }
}

なぜそれが起こっているのですか?

4

3 に答える 3

6

おそらく、MySQL は「\」文字がエスケープであると考えているため、文字列に含まれていません。試す

c.Replace(@"\", @"\\")

挿入すると、エスケープ文字がエスケープされます。

EDIT:たとえば、コマンドテキストの初期化行を次のように置き換えます。また、一重引用符のエスケープを追加します。

string escapedPath = c.Replace(@"\", @"\\").Replace("'", @"\'");    
command.CommandText = ("Insert into data (path) values('" + escapedPath + "')");

編集:パラメーター化されたクエリを使用して、さらに「ベスト プラクティス」のソリューションについては、@Matthew の回答を参照してください。

于 2013-02-16T16:57:07.933 に答える
3

これは、クエリの書き方が原因です。MySQL では、バックスラッシュ文字\(ファイル パスに存在する) には、次の文字をエスケープするという特別な意味があります。これらをエンコードする必要があります。多くの異なる DBMS には、これを行うためのパターンがあります。

それ以外では、コードはSQL インジェクションの影響を受けやすくなります。

これらの問題を両方とも解決するには、パラメーター化されたクエリを使用できます。

public void InsertPath(string path)
{
    string connString = "Server=Localhost;Database=test;Uid=root;password=root;";

    using (var connection = new MySqlConnection(connString))
    {
        connection.Open();

        using (var command = connection.CreateCommand())
        {
            command.CommandText = "INSERT INTO data(path) VALUES(?path)";

            command.Parameters.AddWithValue("?path", path);

            command.ExecuteNonQuery();
        }
    }
}

私のコンピューターには MySQL がないため、この回答は 100% 正確ではないかもしれませんが、うまくいかない場合は、少なくともこの問題に対処する方法についての情報が得られるはずです。

于 2013-02-16T17:03:04.193 に答える
0

パラメータ化されたクエリを使用しないのはなぜですか? 文字列をエスケープすることでほとんどの問題を回避し、あらゆる種類のセキュリティ リスクを回避し、クエリ キャッシングからわずかなパフォーマンスを得ることができます。

通常、次のようになります。

cmd.CommandText = "INSERT INTO data (path) values(?path)";

cmd.Prepare();
cmd.Parameters.AddWithValue("?path", c);

明示的な C# クエリ コードを作成してから (6 か月ほど) 時間が経ちましたが、これが正確かどうか思い出せません。また、MySql プロバイダーが名前付きパラメーターに対して MSSQL とはわずかに異なるパラメーター化規則を使用していることも知っています (これは ?path の代わりに @path を使用します) が、正しいパスにたどり着くはずです。関連する可能性があるもう少し詳しいガイダンスについては、C# MySqlParameter problemを参照してください。

于 2013-02-16T17:06:23.753 に答える