2017-04-18 53 views
1

我正在执行oracle查询并将所述查询的结果写入一个txt文件。输出多个查询

现在我需要改变模式如果正在处理自定义查询

的模式正在发生变化,正在执行的查询,但由于某些原因,查询输出不写(由布尔值isCustom设置)到输出文件中。

如果isCustom设置为false,一切正常。

我将不胜感激的任何建议/提示。

public void OracleConnect(string queryString, string fileName, bool isCustom = false) 
    { 
     //downloaded oracle managed data access.dll 
     //changed reference 
     //changed connection to long unfunny one 
     //http://stackoverflow.com/questions/659341/the-provider-is-not-compatible-with-the-version-of-oracle-client#25412992 
     log.Debug("Task " + Task.CurrentId + ": executing " + queryString); 
     string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + host + ")(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=" + instance + ")));User Id = " + oracleUser + "; Password =" + oraclePassword; 
     try 
     { 
      //create connection 
      OracleConnection conn = new OracleConnection(oradb); 
      conn.Open(); 

      OracleCommand cmd = new OracleCommand(); 
      //if a custom query is being handled change the schema 
      if (isCustom == true) 
      { 
       log.Debug("##Test executing custom query!"); 
       string changeSessionString = "ALTER SESSION SET CURRENT_SCHEMA = " + resultUser; 
       cmd.CommandText = 
        "begin " + 
         " execute immediate '"+ changeSessionString +"';" + 
         " execute immediate '"+ queryString+"';" + 
        "end;"; 
       log.Debug("##Test custom query command = " + cmd.CommandText); 
      } 
      else 
      { 
       queryString = queryString.Replace("%pumaUser%", resultUser); 
       cmd.CommandText = queryString; 
      } 

      cmd.Connection = conn; 
      cmd.CommandType = CommandType.Text; 

      OracleDataReader reader = cmd.ExecuteReader(); 

      //get and write content to file 
      List<string> columnName = new List<string>(); 
      columnName = GetColumnNames(reader); 
      using (StreamWriter writer = new StreamWriter(fileName)) 
      { 
       //write query command to file 
       writer.WriteLine(queryString + Environment.NewLine); 

       //write header/column names into first line 
       StringBuilder header = new StringBuilder(); 
       for (int i = 0; i < columnName.Count; i++) 
       { 
        header.Append(columnName[i].ToString()); 

        if (i != columnName.Count - 1) 
         header.Append("\t"); 

       } 
       writer.WriteLine(header); 

       //fill rest of lines with data 
       while (reader.Read()) 
       { 
        StringBuilder row = new StringBuilder(); 
        for (int i = 0; i < reader.FieldCount; i++) 
        { 
         row.Append(reader[i]); 

         if (i != reader.FieldCount - 1) 
          row.Append("\t"); 
        } 
        writer.WriteLine(row); 
       } 

      } 
      log.DebugFormat("Task: {0} Writing query result into file: {1}", Task.CurrentId, fileName); 

      conn.Dispose(); 
     } 
     catch (OracleException e) 
     { 
      log.ErrorFormat("Task {0} had an OracleError: {1}", Task.CurrentId, e.Message); 
      Helpers.writeErrorFile(fileName, e.Message); 
     } 
     catch (Exception e) 
     { 
      log.ErrorFormat("Task {0} Could not connect to database: {1} ", Task.CurrentId, e.Message); 
     } 
    } 

回答

0
> -for pl/sql procedures: set serveroutput on 

将输出写入文本文件

>  1.spool <location\xxx.txt> after finishing 
>  2.spool off 
+0

我改变了我的查询: 'cmd.CommandText = “开始” + “立即执行“SPOOL \ ”“ +文件名+“\”';“ + “立即执行”+ changeSessionString +“';” + “立即执行”+ queryString +“';” + “立即执行'SPOOL off';” + “end;”;' – user2811630

+0

生成的查询看起来像'OracleObject:10:24:48,949 [3] DEBUG - ##测试自定义查询命令=开始立即执行'SPOOL'D:\ CHHC \ manual \ Debug \ output \ 20-APR-2017--10-24-43 \ ATGRZSW2240_HOST153 \ custom1.txt“';立即执行'ALTER SESSION SET CURRENT_SCHEMA = HOST153';立即执行'SELECT COUNT(*)FROM project_2';立即执行'SPOOL off'; end;'但它不提供输出 – user2811630

+0

在And上设置服务器输出。设置回声应该有所帮助。 –