2

C#を使用して、リストボックスで実行中の現在のすべてのプロセスをリアルタイムでリストするプログラムがあります。mysql データベースへの挿入に問題がありました。プロセスのスレッド化されたリストボックスからデータを取得し、データベースに保存します。リストボックスが更新されると、同じデータがmysqlデータベースに挿入されるという問題が発生しました。

誰かがこれについて私を助けることができますか?

これはサンプルコードです

foreach (String item in listBox1.Items)
{
    cmd.CommandText = "SELECT * FROM sample";
    MySqlDataReader msdr = cmd.ExecuteReader();

    while (msdr.Read())
    {
        var items = msdr["log"].ToString();
        if(items != item)
        {
            String query = "INSERT INTO sample values('','"+item+"')";
            cmd.CommandText = query;

            using(MySqlDataReader reader = cmd.ExecuteReader())
            {
                reader.Close();
            }
        }
    }
    msdr.Close();
}
4

2 に答える 2

1

まず、 ステートメント内で文字列を使用しないでください。常にParametersを使用してください。INSERT

2 番目:このコードが呼び出される場所によって異なります。更新イベントで呼び出された場合、おそらく正しいことは、実際に何かが変更されたかどうかを理解し、肯定的な結果が得られた場合にのみ SQL クエリを実行することです。

于 2012-09-03T09:49:37.567 に答える
1

次のようなもの(テストされていません):

foreach (String item in listBox1.Items)
{
    cmd.CommandText = "SELECT COUNT(*) as cnt FROM sample WHERE log = @log";
    cmd.Parameters.AddWithValue("@log", item)
    bool found = ((int)cmd.ExecuteScalar()) > 0

    if(!found)
    {

       String query = "INSERT INTO sample values('',@log)";
       cmd.CommandText = query;
       cmd.Parameters.AddWithValue("@log", item);
       cmd.ExecuteNonQuery();

    }  
}
于 2012-09-03T10:00:42.380 に答える