2

C# WinForms アプリケーションで次のエラーが発生します。

データの読み取り中に致命的なエラーが発生しました

を使用してmysql.data V4.0.30319います。

これが私のコードです:

int catCount = 1;     
while (catCount < 13)
{
    MySqlConnection con = new MySqlConnection("server=server;user id=user;password=password;database=db;");
    con.Open();
    MySqlDataReader Rd;
    string query = "SELECT oc_newsletter_old_system.email FROM oc_newsletter_old_system WHERE oc_newsletter_old_system.cat_uid = "  + catCount;
    MySqlCommand mC = new MySqlCommand(query, con);
    Rd = mC.ExecuteReader();
    try
    {      
        while (Rd.Read())
        {
            string email = Rd.GetString(0);
            Boolean insert = true;
            int realCat = 0;
            switch (catCount)
            {
                case '1':
                    fileBrian += email + "\r\n";
                    break;
                case '2':
                    fileDunamis += email + "\r\n";
                    break;
                case '3':
                    fileFrohlich += email + "\r\n";
                    break;
                case '4':
                    fileGaithers += email + "\r\n";
                    break;
                case '5':
                    fileGospel7 += email + "\r\n";
                    break;
                case '6':
                    fileLifeshop += email + "\r\n";
                    realCat = 1;
                    break;
                case '7':
                    fileMeyer += email + "\r\n";
                    break;
                case '8':
                    fileOpwekking += email + "\r\n";
                    break;
                case '9':
                    filePelgrimKerken += email + "\r\n";
                    realCat = 2;
                    break;
                case 10:
                    filePelgrimKlanten += email + "\r\n";
                    realCat = 2;
                    break;
                case 11:
                    filePelgrimPers += email + "\r\n";
                    insert = false;
                    break;
                case 12:
                    filePelgrimScholen += email + "\r\n";
                    insert = false;
                    break;
            }

            if (insert == true)
            {    
                string salt = "h1bsqnp6wyxjxhf29ziuwsihg8nixe05";
                byte[] asciiBytes = ASCIIEncoding.ASCII.GetBytes(salt + email);
                byte[] hashedBytes = MD5CryptoServiceProvider.Create().ComputeHash(asciiBytes);
                string hashedString = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
                string query2 = "INSERT IGNORE INTO `oc_ne_marketing` (`email`,`code`, `subscribed`, `store_id`) VALUES ('" + email + "', '" + hashedString + "', '1', '" + realCat + "')";
                MySqlConnection connection = new MySqlConnection("server=server;user id=user;password=password;database=db;");
                connection.Open();
                try
                {
                    MySqlCommand cmd1 = new MySqlCommand(query2, connection);
                    cmd1.CommandText = query2;
                    cmd1.ExecuteNonQuery();
                    cmd1.Dispose();
                }
                finally
                {
                    connection.Close();
                }
            }
            Application.DoEvents();
        }
    }
    finally
    {
        Rd.Close();
        con.Close();
    }

    catCount++;
    progressBar1.PerformStep();
    progressBar1.Refresh();
    Application.DoEvents();
}

この行でエラーが発生しています:

while (Rd.Read())

これまでにわかった唯一のことは、リーダーと接続を閉じる際の問題でしたが、私の知る限り、すべてのセットアップが正しいということです...

それで、皆さんは何が問題なのか分かりますか???

4

2 に答える 2

2

問題に対する直接的な回答ではありませんが、ご要望に応じて、 に関する情報とコード例を以下に示しusingます。

using実装するオブジェクトでステートメントを使用することは、一般的に受け入れられているベスト プラクティスですIDisposable。これは、基本的に、try/finally ブロックと同じことを行います。

using ステートメントのスコープが終了すると (操作が完了するか、例外がスローDisposeされます)、オブジェクトで呼び出されます。詳細については、ステートメントの使用を参照してください。

コードに基づく簡略化された例を次に示します。

int catCount = 1;     
string connectionString = "server=server;user id=user;password=password;database=db;"
string query = "SELECT email FROM oc_newsletter_old_system WHERE cat_uid=@cat_uid";

while (catCount < 13)
{

    using (MySqlConnection con = new MySqlConnection(connectionString))
    {

        con.Open();

        MySqlCommand mC = new MySqlCommand(query, con);
        mC.Parameters.AddWithValue("@cat_uid", catCount);

        using (MySqlDataReader Rd = mC.ExecuteReader())
        {

            while (Rd.Read())
            {

                 // rest of your code here
            }
        }
    }    
}

上記は .NET SqlConnection、SqlCommand、および SqlDataReader クラスに基づいていますが、MySql でも同じ (または非常に類似) であることに注意してください。

接続文字列とクエリ文字列を独自の変数に移動しました (ただし、これは個人的な好みです)。また、パラメーター化されたクエリを実行する方法の例も示しました (mCParameters.AddWithValue行 - パラメーター化されたクエリを使用する習慣を身に付けることは (IMO) 良いことです。特に、WinForms から Web ベースのアプリに移行する場合は、SQL インジェクション攻撃を防ぐため)。

于 2013-07-31T23:07:12.733 に答える