[Mono-list] re f cursor issue in oracle stored procedure invoked from mono
sumesh0710
sumeshjose at gmail.com
Wed Sep 3 05:37:46 EDT 2008
Thanks for the reply. I tried using execute reader, but the outputparameter
value was null. In my case I used
cmdSp = New OracleCommand("test", con)
cmdSp.CommandType = CommandType.StoredProcedure
I will try as ur code. Is your mono version is latest? I saw in release
notes of mono 1.9.1, that there is ref cursor support, which means no cursor
support in previous versions?
Daniel Morgan-3 wrote:
>
> DbDataAdapter uses ExecuteReader and the returned reader to populate the
> data table. If you try your example with ExecuteReader and then try to
> get the data reader from the parameter, it will fail because you will have
> DBNull.Value. At least this is what you get on .net 2.0.
>
> My advice is to use ExecuteNonQuery(), then get the data reader from the
> parameter. Then manually load a data table.
>
> Here is an example that works for me on .net 2.0 and mono:
>
> // test.cs
> // gmcs test.cs /r:System.Data.dll /r:System.Data.OracleClient.dll
> using System;
> using System.Data;
> using System.Data.Common;
> using System.Data.OracleClient;
>
> public class test
> {
> public static void Main(string[] args)
> {
> Console.WriteLine("Start.");
> OracleConnection con = new OracleConnection("Data
> source=testdb;user id=someuser;password=somepass");
> con.Open();
> OracleCommand cmdSp = con.CreateCommand();
> cmdSp.CommandText = "BEGIN\n SP_TEST_REF_CURSOR(:crsdata);
> \nEND;\n";
> DataSet ds = new DataSet();
> OracleParameter oprCursor = new OracleParameter("crsdata",
> OracleType.Cursor);
> oprCursor.Direction = ParameterDirection.Output;
> cmdSp.Parameters.Add(oprCursor);
>
> cmdSp.ExecuteNonQuery();
>
> OracleDataReader reader = (OracleDataReader)oprCursor.Value;
>
> Console.WriteLine("Build DataSet from reader that holds a REF CURSOR");
>
> DataTable schema = reader.GetSchemaTable();
> DataTable newTable = new DataTable();
> if (reader.FieldCount > 0)
> {
> foreach (DataRow row in schema.Rows)
> {
> string columnName = row["ColumnName"].ToString();
> Type columnType = (Type)row["DataType"];
> newTable.Columns.Add(columnName, columnType);
> }
> while (reader.Read())
> {
> object[] values = new object[newTable.Columns.Count];
> reader.GetValues(values);
> newTable.Rows.Add(values);
> }
> }
>
> reader.Close();
>
> Console.WriteLine("Add DataTable to DataSet");
> ds.Tables.Add(newTable);
>
> Console.WriteLine("Show Result");
> Console.WriteLine("Columns in DataTable");
> foreach (DataColumn column in ds.Tables[0].Columns)
> {
> Console.WriteLine(" ColumnName: " + column.ColumnName);
> Console.WriteLine(" DataType: " +
> column.DataType.ToString());
> }
> Console.WriteLine("Rows in DataTable");
> foreach (DataRow row in ds.Tables[0].Rows)
> {
> for (int c = 0; c < ds.Tables[0].Columns.Count; c++)
> {
> Console.WriteLine("Column " + c.ToString());
> if (row[c].Equals(DBNull.Value))
> Console.WriteLine(" Value is DBNull.Value");
> else
> {
> Console.WriteLine(" Value: " + row[c].ToString());
> Console.WriteLine(" Value Type: " +
> row[c].GetType().ToString());
> }
> }
> }
>
> con.Close();
> con = null;
> Console.WriteLine("Success!");
> }
> }
>
>
>
>
>
>
> --- On Tue, 9/2/08, sumesh0710 <sumeshjose at gmail.com> wrote:
>
>> From: sumesh0710 <sumeshjose at gmail.com>
>> Subject: [Mono-list] re f cursor issue in oracle stored procedure invoked
>> from mono
>> To: mono-list at lists.ximian.com
>> Date: Tuesday, September 2, 2008, 10:27 AM
>> Hi,
>> OS - Linux Version 2.6.9-42.0.0.0.1( Red hat version
>> 3.4.6-3.1)
>> Oracle - 9.2.0
>> mono - 1.2.4
>>
>> I have a simple procedure which has a ref cursor as
>> parameter as follows.
>>
>> CREATE OR REPLACE PROCEDURE
>> "DARSTRAN"."TEST" (crsdata out
>> sys_refcursor)
>> as
>>
>> BEGIN
>> open crsdata for select sysdate from dual;
>> END;
>>
>> If i execute this from proc from sql plus. It works fine.
>> Also in windows
>> OS, if i call from an application developed in vb.net it
>> will work. But same
>> code executed in mono in Linux OS shows below error while
>> filling into
>> dataset.
>> ora- 01403: no data found.
>>
>> Code used is
>>
>> cmdSp = New OracleCommand("test", con)
>> cmdSp.CommandType = CommandType.StoredProcedure
>> ds = New DataSet
>> oprCursor = New OracleParameter("crsdata",
>> OracleType.Cursor)
>> oprCursor.Direction = ParameterDirection.Output
>> cmdSp.Parameters.Add(oprCursor)
>> dasp = New OracleDataAdapter(cmdSp)
>> dasp.Fill(ds)
>>
>> If i execute above SP from linux sql plus, also it works
>> ok.
>>
>> Is there any workaround to solve this problem?
>> --
>> View this message in context:
>> http://www.nabble.com/ref-cursor-issue-in-oracle-stored-procedure-invoked-from-mono-tp19271280p19271280.html
>> Sent from the Mono - General mailing list archive at
>> Nabble.com.
>>
>> _______________________________________________
>> Mono-list maillist - Mono-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-list
>
>
>
> _______________________________________________
> Mono-list maillist - Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>
>
--
View this message in context: http://www.nabble.com/ref-cursor-issue-in-oracle-stored-procedure-invoked-from-mono-tp19271280p19285959.html
Sent from the Mono - General mailing list archive at Nabble.com.
More information about the Mono-list
mailing list