-1

このコードを実行しようとしています

public Exception SetData(string Data , long NoOfColumnsAllowed)
    {
        try
        {
            con = new SqlCeConnection(conectionstring);
            con.Open();
            transaction = con.BeginTransaction();
            com = new SqlCeCommand();
            com.Transaction = transaction;
            com.CommandText = "Select  count(*) from [Copy]";
            com.Connection = con;
            sdr = com.ExecuteReader();
            while (sdr.Read())
            {
                noOfColumns = sdr.GetInt32(0);
            }


            if (noOfColumns > NoOfColumnsAllowed)
            {
                long NoOfColumsToBeDeleted = noOfColumns - NoOfColumnsAllowed;
                com.CommandText = "delete from [Copy] where Sno<=@sno";
                com.Parameters.AddWithValue("@sno", NoOfColumsToBeDeleted);
                com.ExecuteNonQuery();
            }

            com.CommandText = "Insert into [Copy] (Data) values (@data)";
            com.Parameters.AddWithValue("@data", Data);
            com.ExecuteNonQuery();
            transaction.Commit();
            con.Close();

            return null;
        }
        catch (Exception ex)
        {
            try
            {
                transaction.Rollback();
            }
            catch (Exception)
            {

            }
            con.Close();
            return ex;
        }


    }

例外発生 -

system.invalidoperationexception: このトランザクションのスコープ内に開いているカーソルがある場合、トランザクションをコミットできません。変更をコミットする前に、すべてのデータ リーダー/結果セットが明示的に閉じられていることを確認してください。

私はトランザクションが初めてで、開いているカーソルに関する価値のある解決策を見つけることができません。コードに何か問題がありますか、データ リーダーを明示的に閉じる必要がある場合は、その方法を教えてください。

4

1 に答える 1

2

sdr.Close();を呼び出すだけです。それがエラーが不平を言っているので、whileループの直後。

于 2013-03-23T12:03:18.190 に答える