2017-09-28 27 views
-2

私はこのエラーが発生し、私は何を間違っているのか分からない。下のコードはbackrgoundworkerにあります。クリップボードに基になるRCWから分離されたCOMオブジェクトは使用できません。 oledbで

コピー例外詳細:

はSystem.Runtime.InteropServices.InvalidComObjectExceptionは、基礎となるRCWから 分離されたHRESULT = -2146233049メッセージ= COMオブジェクトを使用することができないユーザコードによって 未処理でした。ソース= mscorlib
のStackTrace:System.Data.Common.UnsafeNativeMethods.IAccessor.ReleaseAccessorでSystem.StubHelpers.StubHelpers.StubRegisterRCWで (pThisオブジェクト) (のIntPtr hAccessor、のInt32 & pcRefCount)のSystem.Data.OleDbで 。 RowBinding.Dispose()System.Data.OleDb.OleDbCommand.ResetConnection()System.Data.OleDb.OleDbCommand.Disposeで で (ブール処分)にSystem.ComponentModel.Component.Disposeで ()AttendanceSystem.Studentで 。 frmNewStudent.bgwInsertStudent_DoWork センダ、DoWorkEventArgs e)in c:\ Users \ victorbaccaljr \ Desktop \ PROGRAM \ Event AttendaceSystem.ComponentModel.BackgroundWorker.WorkerThreadStart(オブジェクト 引数)のInnerExceptionのライン System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)に :システム\ AttendanceSystem \ AttendanceSystem \学生\のfrmNewStudent.cs

コード:

private void bgwInsertStudent_DoWork(object sender, DoWorkEventArgs e) 
    { 
     List<object> arg = (List<object>)e.Argument; 
     bool found = false; 
     using (OleDbConnection cnn = new OleDbConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString)) 
     { 
      using (OleDbCommand cmd = new OleDbCommand()) 
      { 
       cmd.CommandText = "select top 1 * from [student info] where [email protected]"; 
       cmd.Connection = cnn; 

       cmd.Parameters.Clear(); 
       cmd.Parameters.AddWithValue("@id", arg[0].ToString()); 

       cnn.Open(); 
       using (OleDbDataReader rdr = cmd.ExecuteReader()) 
       { 
        rdr.Read(); 
        if (rdr.HasRows) 
        { 
         found = true; 
        } 
        cnn.Close(); 
       } 
      } 
      using(OleDbCommand cmd=new OleDbCommand()) 
      { 
       if(found) 
       { 
        MessageBox.Show("Student ID already inserted."); 
       } 
       else 
       { 
        cmd.CommandText = "insert into [Student info] values(@id, @firstname, @lastname, @department, @address)"; 
        cmd.Connection = cnn; 

        cmd.Parameters.Clear(); 
        cmd.Parameters.AddWithValue("@id", arg[0].ToString()); 
        cmd.Parameters.AddWithValue("@firstname", arg[1].ToString()); 
        cmd.Parameters.AddWithValue("@lastname", arg[2].ToString()); 
        cmd.Parameters.AddWithValue("@department", arg[3].ToString()); 
        cmd.Parameters.AddWithValue("@address", arg[4].ToString()); 

        cnn.Open(); 
        cmd.ExecuteNonQuery(); 
        cnn.Close(); 

        MessageBox.Show("Record inserted!"); 

        this.DialogResult = DialogResult.OK; 

       } 
      } 
     } 
    } 
+2

'cnn.Close()'を呼び出さない – ASpirin

+0

あなたの質問の中に実際のコードを投稿してください。画像を検索エンジンで見つけることは不可能ですので、イメージを使用しないでください。 – HimBromBeere

+3

[基になるRCWから分離されたCOMオブジェクトは重複している可能性があります](https://stackoverflow.com/questions/2260990/com-object-that-has-been-separated-from-its-underlying- rcw-can not-be-used) –

答えて

0

アスピリンは、あなたがshouldn't自分でConnection.Closeを呼び出すコメントで述べたように。 しかし、それは一般的なルールではありません。データベースまたはファイルハンドラへの接続のような管理されていないリソースを解放するには、接続を閉じる必要があります。しかし、usingブロックを囲んでいるので、変数がスコープから外れると自動的にDiposeが呼び出され、Connection.Closeが呼び出されます。この後者の呼び出しは、接続を閉じるときに例外を引き起こします。

あなたusing - ブロックはこのようになります

OleDbConnection con; 
try 
{ 
    con = new OleDbConnection(...); 
    // ... 
    con.Close(); 
} 
finally 
{ 
    if(con != null) con.Close(); 
} 

Closeが正常に実行に二度呼ばれることを引き起こします。

したがって、cnn.Closeへの呼び出しを単に省略することができます。それはすでに全面的に行われているからです。

+0

いいです。私はusing(){}が自動的にオブジェクトを破棄することを忘れています。 – Vic

関連する問題