1

「ovhidhan_e_word」という名前のデータベースがあり、行の繰り返しを含むという名前のテーブルがあります。しかし、「ovidhan」という名前の別のデータベースの下にある名前の別のテーブルTable1にコピーしたいのですが、今回は行の繰り返しは必要ありません.私はこのコードを使用しました:Table1dic

  string english_w = "";

        SqlConnection mssql_con = new System.Data.SqlClient.SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Imon-Bayazid\Documents\ovhidhan_e_word.mdf;MultipleActiveResultSets=true;Integrated Security=True;Connect Timeout=30;User Instance=True");
        SqlConnection con2 = new System.Data.SqlClient.SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Imon-Bayazid\Documents\ovidhan.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

        mssql_con.Open();

        SqlCommand mssql_cmnd = new System.Data.SqlClient.SqlCommand("SELECT * from Table1", mssql_con);

        SqlDataReader rd = mssql_cmnd.ExecuteReader();
        while (rd.Read())
        {
            english_w = rd.GetString(0);

            con2.Open();

            SqlCommand cmnd2 = new System.Data.SqlClient.SqlCommand("select * from dic where english=@h",con2);
            cmnd2.Parameters.AddWithValue("@h",english_w);

            SqlDataReader r = cmnd2.ExecuteReader();
            if (r.Read())
            { }
               else {
                    SqlCommand c = new System.Data.SqlClient.SqlCommand("insert into dic values(@k)", con2); ;
                    c.Parameters.AddWithValue("@k", english_w);
                    c.ExecuteNonQuery();
                 }

            con2.Close();      
        }

        mssql_con.Close();

ただし、 「このコマンドに関連付けられた開いている DataReader が既にあり、最初に閉じる必要があります」という例外が表示されます。行「c.ExecuteNonQuery();

どうすればこれを解決できますか??? もう 1 つの質問は、mssql のテーブルから行の繰り返しを削除するにはどうすればよいですか??

4

3 に答える 3

0

「mssql_cmnd」ではなく「c」にする必要があると思います。また、接続、コマンド、およびデータリーダー オブジェクトの周りに「using」ステートメントを含めることをお勧めします。

編集

私はコードをテストしませんでしたが、リファクタリングを試み、データ リーダーを実行スカラーに置き換えました。

        string english_w = string.Empty;
        using (SqlConnection mssql_con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Imon-Bayazid\Documents\ovhidhan_e_word.mdf;MultipleActiveResultSets=true;Integrated Security=True;Connect Timeout=30;User Instance=True"))
        {
            using (SqlCommand mssql_cmnd = new SqlCommand("SELECT * from Table1", mssql_con))
            {
                mssql_con.Open();
                using (SqlDataReader rd = mssql_cmnd.ExecuteReader())
                {
                    while (rd.Read())
                    {
                        english_w = rd.GetString(0);
                        using (SqlConnection con2 = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Imon-Bayazid\Documents\ovidhan.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"))
                        {
                            con2.Open();
                            using (SqlCommand cmnd2 = new SqlCommand("select top 1 * from dic where english=@h", con2))
                            {
                                cmnd2.Parameters.AddWithValue("@h", english_w);
                                object obj = cmnd2.ExecuteScalar();
                                if (obj == null)
                                {
                                    using (SqlCommand c = new SqlCommand("insert into dic values(@k)", con2))
                                    {
                                        c.Parameters.AddWithValue("@k", english_w);
                                        c.ExecuteNonQuery();
                                    }
                                }
                            }
                            con2.Close();
                        }
                    }
                    rd.Close();
                }
            }
            mssql_con.Close();
        }
于 2013-02-27T18:24:04.247 に答える
0

これは、mssql_cmnd が最初の SQLReader で使用した SQLCommand と同じであるためです。おそらく、SQLCommand c を呼び出したいと思うでしょう:

c.Parameters.AddWithValue("@k", english_w);
c.ExecuteNonQuery();

繰り返しに関しては、データを読み取るときにいつでも SELECT DISTINCT を実行できます。次のリンクの見出し C を参照してください。

http://msdn.microsoft.com/en-us/library/ms187731.aspx

于 2013-02-27T18:23:34.340 に答える
0

どこでエラーが発生しますか? mssql_cmndないExecuteNonQuery()場合はc、試しc.Dispose()てみてくださいc.ExecuteNonQuery()。重複行を削除するには、これを試してください

select * from table1 h1 where H1.ID in (select max(id) from table1 group by duplicate_row_id);
于 2013-02-27T18:50:56.850 に答える