diff options
author | Sureshkumar T <suresh@mono-cvs.ximian.com> | 2005-01-13 15:40:08 +0300 |
---|---|---|
committer | Sureshkumar T <suresh@mono-cvs.ximian.com> | 2005-01-13 15:40:08 +0300 |
commit | cc54e322fab062568a95ef2045506e48535f9aa5 (patch) | |
tree | baa2dd8293336c011fcf3143682c501a36d5e949 | |
parent | 50473437d7cee8fc31c79d5fdb26ed992fe07256 (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/ChangeLog | 13 | ||||
-rw-r--r-- | mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs | 45 | ||||
-rw-r--r-- | mcs/class/System.Data/System.Data.Odbc/libodbc.cs | 14 |
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); + } } |