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);
}
}
テキストファイルに出力を書き込むには: は 'cmd.CommandTextは= + は "始まり"「即時「SPOOLを実行\ "" + fileNameに+ "\" '; " + "execute immediate" + changeSessionString + "';" + "execute immediate" + queryString + "';" + "execute immediate 'SPOOL off';" + "end;"; ' – user2811630
結果クエリーは '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'を実行します。 immediate 'SPOOL off'; end; 'を実行しますが、出力はありません。 – user2811630
Andにserveroutputを設定します。エコーをオンに設定すると役立ちます。 –