2017-04-25 106 views
1

我有一個函數可以從存儲rtf字符串的Oracle DB中抽出一個CLOB列。.NET Oracle SQL命令不執行

public static string GetRTFNoteParsed(string limsNoteNum, string radioEnv) 
{ 
    var rtfNote = ""; 
    string oradb = GetDBconfig(radioEnv); 
    OracleConnection conn = new OracleConnection(oradb); 

    using (conn) 
    { 
     try 
     { 
      conn.Open(); 
      OracleCommand cmd = new OracleCommand(); 
      cmd.Connection = conn; 
      if (limsNoteNum != null) 
      { 
       //rtf notes are not stored as plain text. This regex takes it out 
       cmd.CommandText = "SELECT REGEXP_REPLACE(REGEXP_REPLACE(NOTE_CONTENTS, '\\(fcharset|colortbl)[^;]+;', ''), '(\\[^ ]+ ?)|[{}]', '') FROM LIMS_NOTES WHERE NOTE_ID = " + limsNoteNum; 
       //cmd.CommandText = "SELECT NOTE_CONTENTS FROM LIMS_NOTES WHERE NOTE_ID = 86253"; 
      } 
      cmd.CommandType = CommandType.Text; 

      OracleDataReader dr = cmd.ExecuteReader(); 
      if (dr.HasRows) 
      { 
       while (dr.Read()) 
       { 
        rtfNote = dr.GetValue(0).ToString(); 
       } 
      } 

      if (conn != null) 
      { 
       conn.Dispose(); 
      } 
     } 
     catch (Exception e4) 
     { 
      log.Error("Error with data pulling", e4); 
      return (null); 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       conn.Dispose(); 
      } 
     } 
     return rtfNote.ToString(); 

     } 
    } 

我知道這個問題有什麼做的命令,因爲註釋掉命令作品(但仍格式化RTF)。我知道導致我的問題的命令在SQL Developer中工作得很好,註釋掉的也是如此。但是當我在.NET應用程序中運行它時,我會回到「ORA-01002:無法順序讀取」。有任何想法嗎?

+0

看看這有助於http://stackoverflow.com/questions/27862878/error-fetch-out-of- sequence-returning-table-from-oracle-function-in -c-sharp-wh – OldProgrammer

回答

0

我無法重現您的錯誤ORA-01002: fetch out of sequence,但我確實收到了運行您的代碼的錯誤ORA-12725: unmatched parentheses in regular expression。該修復程序,這是使用C#逐字字符串爲您的查詢,換言之,以取代

cmd.CommandText = "SELECT REGEXP_REPLACE(REGEXP_REPLACE(......"; 

cmd.CommandText = @"SELECT REGEXP_REPLACE(REGEXP_REPLACE(......"; 

使用逐字字符串停止C#從你的字符串處理反斜槓,在特別是用\代替\\


而且,如果我不建議您使用參數化的SQL,而不是連接字符串的,因爲你的代碼是目前容易受到SQL注入這將是我的疏忽。更換

cmd.CommandText = @"SELECT ... FROM LIMS_NOTES WHERE NOTE_ID = " + limsNoteNum; 

cmd.CommandText = @"SELECT ... FROM LIMS_NOTES WHERE NOTE_ID = :note_id"; 

,並添加行

cmd.Parameters.Add(new OracleParameter("note_id", OracleDbType.Varchar2, limsNoteNum, ParameterDirection.Input)); 
+0

完美的工作,並感謝您的額外建議。即使將命令作爲逐字串,C#仍然可以在設置命令文本時將每個「\\」設置爲「\\\\」。但是這個命令仍然有效,所以謝謝你 – pdaniels0013

+0

我不確定你的意思是'C#將每個「\\」變成「\\\\」'。如果我查看VS調試器中的SQL文本的字符串值,我會看到這種行爲,但這是調試器的操作方式。嘗試將SQL文本寫入日誌中。 –