There's simple .sql file like this:-
helloworld.sql
DECLARE
message varchar2(20):= 'Hello, World!';
BEGIN
dbms_output.put_line(message);
END;
I want to call the file in C# console app, catch and display the output in console. Supposedly, it should just output Hello, world!
in the console. This is what I've tried so far.
Program.cs
string sqlConnectionString = @"User Id=user;Password=password123;Data Source=xxxx.xxx.COM";
string script = File.ReadAllText(@"\\test\\helloworld.sql");
try
{
using (OracleConnection con = new OracleConnection())
{
con.ConnectionString = sqlConnectionString;
con.Open();
var cmd = new OracleCommand(script, con);
var result = cmd.ExecuteScalar();
Console.Write(result.ToString());
}
}
catch (SqlException e)
{
Console.WriteLine("SQL Exception: " + e.Message);
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
But I got an Exception: Object reference not set to an instance of an object
. Then I'm aware about this, so I tried using ExecuteNonQuery()
but because there's actually nothing I retrieve from database, the output is -1
.
I just want to know how can I capture the output Hello, world!
from the .sql file and print it in the C# console?
UPDATE:
After go through the comments, I got the idea to try search about DBMS_OUTPUT
. This answer help me to print the output successfully. Thanks.
Console.Write(result.ToString());
it goes directly to catch execption block. – Naturalistdbms_output.put_line
is going to be made available to you, I believe it'll be sent to the handler you attach to the connection'sInfoMessage
event. – Belshinresult
may returnnull
if no data is present in result set whenExecuteScalar
executed. Also as far as I know, you can retrieve the messages withDBMS_OUTPUT.GET_LINE
, but make sure that it runs on the same Oracle session. – ClaudianusSqlConnection
works. – Belshindbms_output.get_line
in ODP.NET, you can check it here. You need to provideOracleParameter
with output direction to get output text from PL/SQL command. – ClaudianusSqlConnection
'sInfoMessage
event handler. I believe it's reasonable that ODP.NET might do the same withdbms_output.put_line
. Try this: at the start of your using block,var outputLines = new List<string>(); con.InfoMessage += (s, e) => outputLines.Add(e.Message);
and then useExecuteNonQuery
to run your original script. – Belshindbms_output.put_line
. – BelshinoutputLines
after it ran? All that code is supposed to do is accumulate the lines. AfterExecuteNonQuery
, you can iterate throughoutputLines
and do anything you want with them, such as writing them to the console. – BelshinExecuteNonQuery()
, the outputlines does not contains anything. – Naturalist