Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSureshkumar T <suresh@mono-cvs.ximian.com>2005-01-13 15:40:08 +0300
committerSureshkumar T <suresh@mono-cvs.ximian.com>2005-01-13 15:40:08 +0300
commitcc54e322fab062568a95ef2045506e48535f9aa5 (patch)
treebaa2dd8293336c011fcf3143682c501a36d5e949
parent50473437d7cee8fc31c79d5fdb26ed992fe07256 (diff)
2005-01-13 Sureshkumar T <tsureshkumar@novell.com>
* OdbcDataReader.cs: Implement NextResultSet for multiple result set queries. * OdbcDataReader.cs: build column schema once creating reader and then for each Next result set. Thanks to sebastien.robitaille@croesus.com (Sebastien Robitaille) for pointing out this optimization (bugzilla #70530). * libodbc.cs: Added library calls SQLFreeStmt and SQLMoreResults for mutiple resultsets. svn path=/trunk/mcs/; revision=38868
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/ChangeLog13
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs45
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/libodbc.cs14
3 files changed, 59 insertions, 13 deletions
diff --git a/mcs/class/System.Data/System.Data.Odbc/ChangeLog b/mcs/class/System.Data/System.Data.Odbc/ChangeLog
index 8e642ff8725..4841bf3aab3 100644
--- a/mcs/class/System.Data/System.Data.Odbc/ChangeLog
+++ b/mcs/class/System.Data/System.Data.Odbc/ChangeLog
@@ -1,3 +1,16 @@
+2005-01-13 Sureshkumar T <tsureshkumar@novell.com>
+
+ * OdbcDataReader.cs: Implement NextResultSet for multiple result
+ set queries.
+
+ * OdbcDataReader.cs: build column schema once creating reader and
+ then for each Next result set. Thanks to
+ sebastien.robitaille@croesus.com (Sebastien Robitaille) for
+ pointing out this optimization (bugzilla #70530).
+
+ * libodbc.cs: Added library calls SQLFreeStmt and SQLMoreResults
+ for mutiple resultsets.
+
2005-01-10 Sureshkumar T <tsureshkumar@novell.com>
* OdbcDataReader.cs: Connection has to be closed only after
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
index 31f2b52483f..e8f9c88b595 100644
--- a/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
@@ -4,6 +4,7 @@
// Author:
// Brian Ritchie (brianlritchie@hotmail.com)
// Daniel Morgan <danmorg@sc.rr.com>
+// Sureshkumar T <tsureshkumar@novell.com> (2004)
//
// Copyright (C) Brian Ritchie, 2002
// Copyright (C) Daniel Morgan, 2002
@@ -66,6 +67,7 @@ namespace System.Data.Odbc
short colcount=0;
libodbc.SQLNumResultCols(hstmt, ref colcount);
cols=new OdbcColumn[colcount];
+ GetSchemaTable ();
}
#endregion
@@ -132,7 +134,7 @@ namespace System.Data.Odbc
int i=0;
foreach (OdbcColumn col in cols)
{
- if (col.ColumnName==colname)
+ if (col != null && col.ColumnName==colname)
return i;
i++;
}
@@ -169,8 +171,8 @@ namespace System.Data.Odbc
public void Close ()
{
-
- OdbcReturn ret=libodbc.SQLCloseCursor(hstmt);
+ // FIXME : have to implement output parameter binding
+ OdbcReturn ret = libodbc.SQLFreeStmt (hstmt, libodbc.SQLFreeStmtOptions.Close);
if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
throw new OdbcException(new OdbcError("SQLCloseCursor",OdbcHandleType.Stmt,hstmt));
@@ -183,7 +185,6 @@ namespace System.Data.Odbc
if ((behavior & CommandBehavior.CloseConnection)==CommandBehavior.CloseConnection)
this.command.Connection.Close();
-
}
~OdbcDataReader ()
@@ -614,27 +615,45 @@ namespace System.Data.Odbc
return (GetValue(ordinal) is DBNull);
}
+ /// <remarks>
+ /// Move to the next result set.
+ /// </remarks>
public bool NextResult ()
{
- OdbcReturn ret=libodbc.SQLFetch(hstmt);
- if (ret!=OdbcReturn.Success)
- currentRow=-1;
+ OdbcReturn ret = OdbcReturn.Success;
+ ret = libodbc.SQLMoreResults (hstmt);
+ if (ret == OdbcReturn.Success) {
+ short colcount = 0;
+ libodbc.SQLNumResultCols (hstmt, ref colcount);
+ cols = new OdbcColumn [colcount];
+ GetSchemaTable ();
+ }
+ return (ret==OdbcReturn.Success);
+ }
+
+ /// <remarks>
+ /// Load the next row in the current result set.
+ /// </remarks>
+ public bool NextRow ()
+ {
+ OdbcReturn ret=libodbc.SQLFetch (hstmt);
+ if (ret != OdbcReturn.Success)
+ currentRow = -1;
else
currentRow++;
- GetSchemaTable();
-
+
// Clear cached values from last record
foreach (OdbcColumn col in cols)
{
- if (col!=null)
- col.Value=null;
+ if (col != null)
+ col.Value = null;
}
- return (ret==OdbcReturn.Success);
+ return (ret == OdbcReturn.Success);
}
public bool Read ()
{
- return NextResult();
+ return NextRow ();
}
#endregion
diff --git a/mcs/class/System.Data/System.Data.Odbc/libodbc.cs b/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
index 0bf26a1e4ec..e53043061d8 100644
--- a/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/libodbc.cs
@@ -234,5 +234,19 @@ namespace System.Data.Odbc
byte [] MessageText, short BufferLength,
ref short TextLength);
+ [DllImport ("odbc32.dll")]
+ internal static extern OdbcReturn SQLMoreResults (IntPtr Handle);
+
+ internal enum SQLFreeStmtOptions : short
+ {
+ Close = 0,
+ Drop,
+ Unbind,
+ ResetParams
+ }
+
+ [DllImport ("odbc32.dll")]
+ internal static extern OdbcReturn SQLFreeStmt (IntPtr Handle, SQLFreeStmtOptions option);
+
}
}