2015-08-14 41 views
1

下面的函數拋出System.InvalidOperationExceptionOracleCommand.Executenonquery拋出「System.InvalidOperationException」

internal void executeNonQuery(string connectionString, OracleCommand cmd) 
    { 
     using (OracleConnection conn = new OracleConnection(connectionString)) 
     { 
      using (cmd) 
      { 
       conn.Open(); 
       cmd.ExecuteNonQuery(); //here is the error 
       conn.Close(); 
      } 
     } 
    } 

的附加信息是:

操作無效由於對象的當前狀態。

我嘗試在表格中插入一行。有沒有另外一種方法來解決這個錯誤?

編輯: 我建立以下方法在binaryManager類查詢:

internal object[] binaryInsert(string tblName, string tblQuery, int conStrgID, int cq) 
    { 
     object[] retValues = new object[3]; 
     Stream myStream = null ; 
     OracleConnection con = null; 
     string conString = qm.getConnectionString("ConnectionStringToMyDB"); //is correct 

     byte[] data = GetBytes(tblQuery); 

     String sql = "INSERT INTO MYTABLES VALUES (NULL, '" + tblName + "', ':tblQueryBlob', " + conStrgID + ", " + cq + ")"; 


     OracleCommand cmd = new OracleCommand(); 
     cmd.CommandText = sql; // Set the sql-command 
     cmd.Connection = con; //con is an OracleConnection 

     OracleParameter param = cmd.Parameters.Add("tblQueryBlob", OracleDbType.Blob); //Add the parameter for the blobcolumn 
     param.Direction = ParameterDirection.Input; 

     param.Value = data;  //Asign the Byte Array to the parameter 

     //command containts the parameter :tblQueryBlob with its value 
     retValues[0] = cmd; 
     retValues[1] = conString; 

     return retValues; 
    } 

private byte[] GetBytes(string str) 
    { 
     byte[] bytes = new byte[str.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 
     return bytes; 
    } 

我從另一個調用類的binaryInsert方法用下面的代碼:

BinaryManager bm = new bBinaryManager(); 
string sqlQuery = "large string with 5100 characters"; 
object[] binaryValues = bm.binaryInsert("TextTbl", sqlQuery, 1, 1); 
string conString = binaryValues[1].ToString(); 
OracleCommand cmd = (OracleCommand)binaryValues[0]; 

QueryManager qm = new QueryManager(); 
qm.executeNonQuery(conString, cmd); 

EDIT2(ExecuteReader):

int csID = 1; 
using (OracleConnection conn = new OracleConnection(conString)) 
       { 
        using (OracleCommand myCommand = new OracleCommand(query, conn)) 
        { 
         conn.Open(); 
         myCommand.Connection = conn; // FIX! 
         using(OracleDataReader read = myCommand.ExecuteReader()) 
         { 
          if (read.HasRows) 
          { 
           while (read.Read()) 
           { 
            if (read[0] == System.DBNull.Value) 
            { 
             TableObject tableDBNull = new TableObject(csID, Convert.ToString(read[1]), (byte[])read[2], Convert.ToInt32(read[3]), Convert.ToInt32(read[4])); 
             allTables.Add(tableDBNull); 
             csID++; 
            } 
            else 
            { 
             TableObject tableDBNNull = new TableObject(Convert.ToInt32(read[0]), Convert.ToString(read[1]), (byte[])read[2], Convert.ToInt32(read[3]), Convert.ToInt32(read[4])); 
             allTables.Add(tableDBNNull); 
            } 
           } 
          } 
         } 
         conn.Close(); 
        } 

錯誤發生在if塊:if (read[0] == System.DBNull.Value)

+0

你能提供查詢嗎? –

+0

@ArtemKulikov發佈更新 – Hack4Life

回答

1

問題不在於查詢(查詢錯誤引發了Oracle命名空間的異常)。

在你的情況下,該命令與任何連接無關。
你可以在某些方面解決這個問題,即

internal void executeNonQuery(string connectionString, OracleCommand cmd) 
{ 
    using (OracleConnection conn = new OracleConnection(connectionString)) 
    { 
     using (cmd) 
     { 
      conn.Open(); 
      cmd.Connection = conn; // FIX! 
      cmd.ExecuteNonQuery(); //here is the error 
      conn.Close(); 
     } 
    } 
} 

通常我prefere另一種方式來做到這一點

OracleConnection con = new OracleConnection(connectionString); 
// Creating command from the connection 
OracleCommand cmd = con.CreateCommand(); 
cmd.CommandText = ........... 
cmd.ExecuteNonQuery(); 
+0

感謝您的快速解決。它現在完美。 – Hack4Life

+0

我現在用'myCommand.ExecuteReader()'有同樣的問題。所有應該是罰款和工作,我已經使用了幾乎相同的代碼,在你的答案,但我得到的錯誤.. – Hack4Life

+0

如果你張貼的代碼段我可以看看...或嘗試以另一種方式工作,創建一個連接,而不是使用myConnection.CreateCommand()創建命令 – bubi

0

你從未連接您的Command對象添加到您Connection對象。

您應該將參數傳遞給此函數並在此處創建命令。然後你可以在命令的構造函數中傳遞你的連接。

將一個外部實例(函數參數)放入一個using塊應該會引發很多紅色標記。如果可以的話,你應該在using塊中創建Disposable對象。使用塊的要點是確保它被丟棄,如果在塊之前構造對象,則在覆蓋範圍內存在差距。

相關問題