-//\r
-// System.Data.Odbc.OdbcCommand\r
-//\r
-// Authors:\r
-// Brian Ritchie (brianlritchie@hotmail.com)\r
-//\r
-// Copyright (C) Brian Ritchie, 2002\r
-//\r
+//
+// System.Data.Odbc.OdbcCommand
+//
+// Authors:
+// Brian Ritchie (brianlritchie@hotmail.com)
+//
+// Copyright (C) Brian Ritchie, 2002
+//
//
// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-\r
-using System.ComponentModel;\r
-using System.Data;\r
-using System.Data.Common;\r
-using System.Collections;\r
-using System.Runtime.InteropServices;\r
-\r
-namespace System.Data.Odbc\r
-{\r
- /// <summary>\r
- /// Represents an SQL statement or stored procedure to execute against a data source.\r
- /// </summary>\r
- [DesignerAttribute ("Microsoft.VSDesigner.Data.VS.OdbcCommandDesigner, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.ComponentModel.Design.IDesigner")]\r
- [ToolboxItemAttribute ("System.Drawing.Design.ToolboxItem, "+ Consts.AssemblySystem_Drawing)]\r
- public sealed class OdbcCommand : Component, ICloneable, IDbCommand\r
- {\r
- #region Fields\r
-\r
- string commandText;\r
- int timeout;\r
- CommandType commandType;\r
- OdbcConnection connection;\r
- OdbcParameterCollection parameters;\r
- OdbcTransaction transaction;\r
- bool designTimeVisible;\r
- bool prepared=false;\r
- OdbcDataReader dataReader;\r
- IntPtr hstmt;\r
- \r
- #endregion // Fields\r
-\r
- #region Constructors\r
-\r
- public OdbcCommand ()\r
- {\r
- commandText = String.Empty;\r
- timeout = 30; // default timeout \r
- commandType = CommandType.Text;\r
- connection = null;\r
- parameters = new OdbcParameterCollection ();\r
- transaction = null;\r
- designTimeVisible = false;\r
- dataReader = null;\r
- }\r
-\r
- public OdbcCommand (string cmdText) : this ()\r
- {\r
- CommandText = cmdText;\r
- }\r
-\r
- public OdbcCommand (string cmdText, OdbcConnection connection)\r
- : this (cmdText)\r
- {\r
- Connection = connection;\r
- }\r
-\r
- public OdbcCommand (string cmdText,\r
- OdbcConnection connection,\r
- OdbcTransaction transaction) : this (cmdText, connection)\r
- {\r
- this.transaction = transaction;\r
- }\r
-\r
- #endregion // Constructors\r
-\r
- #region Properties\r
-\r
- internal IntPtr hStmt\r
- {\r
- get { return hstmt; }\r
- }\r
- \r
-\r
- [OdbcCategory ("Data")]\r
- [DefaultValue ("")]\r
- [OdbcDescriptionAttribute ("Command text to execute")]\r
- [EditorAttribute ("Microsoft.VSDesigner.Data.Odbc.Design.OdbcCommandTextEditor, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.Drawing.Design.UITypeEditor, "+ Consts.AssemblySystem_Drawing )]\r
- [RefreshPropertiesAttribute (RefreshProperties.All)]\r
- public string CommandText \r
- {\r
- get {\r
- return commandText;\r
- }\r
- set { \r
- prepared=false;\r
- commandText = value;\r
- }\r
- }\r
-\r
-\r
- [OdbcDescriptionAttribute ("Time to wait for command to execute")]\r
- [DefaultValue (30)]\r
- public int CommandTimeout {\r
- get {\r
- return timeout;\r
- }\r
- set {\r
- timeout = value;\r
- }\r
- }\r
-\r
- [OdbcCategory ("Data")]\r
- [DefaultValue ("Text")]\r
- [OdbcDescriptionAttribute ("How to interpret the CommandText")]\r
- [RefreshPropertiesAttribute (RefreshProperties.All)]\r
- public CommandType CommandType { \r
- get {\r
- return commandType;\r
- }\r
- set {\r
- commandType = value;\r
- }\r
- }\r
-\r
- [OdbcCategory ("Behavior")]\r
- [OdbcDescriptionAttribute ("Connection used by the command")]\r
- [DefaultValue (null)]\r
- [EditorAttribute ("Microsoft.VSDesigner.Data.Design.DbConnectionEditor, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.Drawing.Design.UITypeEditor, "+ Consts.AssemblySystem_Drawing )]\r
- public OdbcConnection Connection { \r
- get {\r
- return connection;\r
- }\r
- set {\r
- connection = value;\r
- }\r
- }\r
-\r
- [BrowsableAttribute (false)]\r
- [DesignOnlyAttribute (true)]\r
- [DefaultValue (true)]\r
- public bool DesignTimeVisible { \r
- get {\r
- return designTimeVisible;\r
- }\r
- set {\r
- designTimeVisible = value;\r
- }\r
- }\r
-\r
- [OdbcCategory ("Data")]\r
- [OdbcDescriptionAttribute ("The parameters collection")]\r
- [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]\r
- public OdbcParameterCollection Parameters {\r
- get {\r
- return parameters;\r
- }\r
- }\r
- \r
- [BrowsableAttribute (false)]\r
- [OdbcDescriptionAttribute ("The transaction used by the command")]\r
- [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
- public OdbcTransaction Transaction {\r
- get {\r
- return transaction;\r
- }\r
- set {\r
- transaction = value;\r
- }\r
- }\r
- \r
- [OdbcCategory ("Behavior")]\r
- [DefaultValue (UpdateRowSource.Both)]\r
- [OdbcDescriptionAttribute ("When used by a DataAdapter.Update, how command results are applied to the current DataRow")]\r
- public UpdateRowSource UpdatedRowSource { \r
- [MonoTODO]\r
- get {\r
- throw new NotImplementedException ();\r
- }\r
- [MonoTODO]\r
- set {\r
- throw new NotImplementedException ();\r
- }\r
- }\r
-\r
- IDbConnection IDbCommand.Connection {\r
- get {\r
- return Connection;\r
- }\r
- set {\r
- Connection = (OdbcConnection) value;\r
- }\r
- }\r
-\r
- IDataParameterCollection IDbCommand.Parameters {\r
- get {\r
- return Parameters;\r
- }\r
- }\r
-\r
- IDbTransaction IDbCommand.Transaction {\r
- get {\r
- return (IDbTransaction) Transaction;\r
- }\r
- set {\r
- if (value is OdbcTransaction)
- {
- Transaction = (OdbcTransaction)value;
+
+using System;
+using System.ComponentModel;
+using System.Data;
+using System.Data.Common;
+using System.Collections;
+using System.Runtime.InteropServices;
+
+namespace System.Data.Odbc
+{
+ /// <summary>
+ /// Represents an SQL statement or stored procedure to execute against a data source.
+ /// </summary>
+ [DesignerAttribute ("Microsoft.VSDesigner.Data.VS.OdbcCommandDesigner, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.ComponentModel.Design.IDesigner")]
+ [ToolboxItemAttribute ("System.Drawing.Design.ToolboxItem, "+ Consts.AssemblySystem_Drawing)]
+#if NET_2_0
+ [DefaultEvent ("RecordsAffected")]
+ public sealed class OdbcCommand : DbCommand, ICloneable
+#else
+ public sealed class OdbcCommand : Component, ICloneable, IDbCommand
+#endif //NET_2_0
+ {
+ #region Fields
+
+ const int DEFAULT_COMMAND_TIMEOUT = 30;
+
+ string commandText;
+ int timeout;
+ CommandType commandType;
+ UpdateRowSource updateRowSource;
+
+ OdbcConnection connection;
+ OdbcTransaction transaction;
+ OdbcParameterCollection _parameters;
+
+ bool designTimeVisible;
+ bool prepared;
+ IntPtr hstmt = IntPtr.Zero;
+
+ bool disposed;
+
+ #endregion // Fields
+
+ #region Constructors
+
+ public OdbcCommand ()
+ {
+ timeout = DEFAULT_COMMAND_TIMEOUT;
+ commandType = CommandType.Text;
+ _parameters = new OdbcParameterCollection ();
+ designTimeVisible = true;
+ updateRowSource = UpdateRowSource.Both;
+ }
+
+ public OdbcCommand (string cmdText) : this ()
+ {
+ commandText = cmdText;
+ }
+
+ public OdbcCommand (string cmdText, OdbcConnection connection)
+ : this (cmdText)
+ {
+ Connection = connection;
+ }
+
+ public OdbcCommand (string cmdText, OdbcConnection connection,
+ OdbcTransaction transaction) : this (cmdText, connection)
+ {
+ this.Transaction = transaction;
+ }
+
+ #endregion // Constructors
+
+ #region Properties
+
+ internal IntPtr hStmt {
+ get { return hstmt; }
+ }
+
+
+ [OdbcCategory ("Data")]
+ [DefaultValue ("")]
+ [OdbcDescriptionAttribute ("Command text to execute")]
+ [EditorAttribute ("Microsoft.VSDesigner.Data.Odbc.Design.OdbcCommandTextEditor, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.Drawing.Design.UITypeEditor, "+ Consts.AssemblySystem_Drawing )]
+ [RefreshPropertiesAttribute (RefreshProperties.All)]
+ public
+#if NET_2_0
+ override
+#endif
+ string CommandText {
+ get {
+ if (commandText == null)
+ return string.Empty;
+ return commandText;
+ }
+ set {
+ prepared = false;
+ commandText = value;
+ }
+ }
+
+ [OdbcDescriptionAttribute ("Time to wait for command to execute")]
+#if NET_1_0 || ONLY_1_1
+ [DefaultValue (DEFAULT_COMMAND_TIMEOUT)]
+#endif
+ public
+#if NET_2_0
+ override
+#endif
+ int CommandTimeout {
+ get { return timeout; }
+ set { timeout = value; }
+ }
+
+ [OdbcCategory ("Data")]
+ [DefaultValue ("Text")]
+ [OdbcDescriptionAttribute ("How to interpret the CommandText")]
+ [RefreshPropertiesAttribute (RefreshProperties.All)]
+ public
+#if NET_2_0
+ override
+#endif
+ CommandType CommandType {
+ get { return commandType; }
+ set { commandType = value; }
+ }
+
+#if ONLY_1_1
+ [OdbcCategory ("Behavior")]
+ [OdbcDescriptionAttribute ("Connection used by the command")]
+ [DefaultValue (null)]
+ [EditorAttribute ("Microsoft.VSDesigner.Data.Design.DbConnectionEditor, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.Drawing.Design.UITypeEditor, "+ Consts.AssemblySystem_Drawing )]
+ public OdbcConnection Connection {
+ get {
+ return connection;
+ }
+ set {
+ connection = value;
+ }
+ }
+#endif // ONLY_1_1
+
+#if NET_2_0
+ [DefaultValue (null)]
+ [EditorAttribute ("Microsoft.VSDesigner.Data.Design.DbConnectionEditor, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.Drawing.Design.UITypeEditor, "+ Consts.AssemblySystem_Drawing )]
+ public new OdbcConnection Connection {
+ get { return DbConnection as OdbcConnection; }
+ set { DbConnection = value; }
+ }
+#endif // NET_2_0
+
+ [BrowsableAttribute (false)]
+ [DesignOnlyAttribute (true)]
+ [DefaultValue (true)]
+#if NET_2_0
+ [EditorBrowsable (EditorBrowsableState.Never)]
+#endif
+ public
+#if NET_2_0
+ override
+#endif
+ bool DesignTimeVisible {
+ get {
+ return designTimeVisible;
+ }
+ set {
+ designTimeVisible = value;
+ }
+ }
+
+
+ [OdbcCategory ("Data")]
+ [OdbcDescriptionAttribute ("The parameters collection")]
+ [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
+ public
+#if NET_2_0
+ new
+#endif // NET_2_0
+ OdbcParameterCollection Parameters {
+ get {
+#if ONLY_1_1
+ return _parameters;
+#else
+ return base.Parameters as OdbcParameterCollection;
+#endif // ONLY_1_1
+ }
+ }
+
+ [BrowsableAttribute (false)]
+ [OdbcDescriptionAttribute ("The transaction used by the command")]
+ [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+ public
+#if NET_2_0
+ new
+#endif // NET_2_0
+ OdbcTransaction Transaction {
+ get {
+ return transaction;
+ }
+ set {
+ transaction = value;
+ }
+ }
+
+ [OdbcCategory ("Behavior")]
+ [DefaultValue (UpdateRowSource.Both)]
+ [OdbcDescriptionAttribute ("When used by a DataAdapter.Update, how command results are applied to the current DataRow")]
+ public
+#if NET_2_0
+ override
+#endif
+ UpdateRowSource UpdatedRowSource {
+ get {
+ return updateRowSource;
}
- else
- {
+ set {
+ updateRowSource = value;
+ }
+ }
+
+#if NET_2_0
+ protected override DbConnection DbConnection {
+ get { return connection; }
+ set { connection = (OdbcConnection) value;}
+ }
+
+#endif // NET_2_0
+
+#if ONLY_1_1
+ IDbConnection IDbCommand.Connection {
+ get {
+ return Connection;
+ }
+ set {
+ Connection = (OdbcConnection) value;
+ }
+ }
+
+ IDataParameterCollection IDbCommand.Parameters {
+ get {
+ return Parameters;
+ }
+ }
+#else
+ protected override DbParameterCollection DbParameterCollection {
+ get { return _parameters as DbParameterCollection;}
+ }
+#endif // NET_2_0
+
+#if ONLY_1_1
+ IDbTransaction IDbCommand.Transaction {
+ get {
+ return (IDbTransaction) Transaction;
+ }
+ set {
+ if (value is OdbcTransaction) {
+ Transaction = (OdbcTransaction) value;
+ } else {
throw new ArgumentException ();
}
- }\r
- }\r
-\r
- #endregion // Properties\r
-\r
- #region Methods\r
-\r
- public void Cancel () \r
- {\r
- if (hstmt!=IntPtr.Zero)\r
- {\r
- OdbcReturn Ret=libodbc.SQLCancel(hstmt);\r
- if ((Ret!=OdbcReturn.Success) && (Ret!=OdbcReturn.SuccessWithInfo)) \r
- throw new OdbcException(new OdbcError("SQLCancel",OdbcHandleType.Stmt,hstmt));\r
- }\r
- else\r
- throw new InvalidOperationException();\r
- }\r
-\r
- public OdbcParameter CreateParameter ()\r
- {\r
- return new OdbcParameter ();\r
- }\r
-\r
- IDbDataParameter IDbCommand.CreateParameter ()\r
- {\r
- return CreateParameter ();\r
- }\r
- \r
- [MonoTODO]\r
- protected override void Dispose (bool disposing)\r
- {\r
- }\r
- \r
- private void ExecSQL(string sql)\r
- {\r
- OdbcReturn ret;\r
-\r
- if ((parameters.Count>0) && !prepared)\r
- Prepare();\r
- \r
- if (prepared)\r
- {\r
- ret=libodbc.SQLExecute(hstmt);\r
- if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo)) \r
- throw new OdbcException(new OdbcError("SQLExecute",OdbcHandleType.Stmt,hstmt));\r
- }\r
- else\r
- {\r
- ret=libodbc.SQLAllocHandle(OdbcHandleType.Stmt, Connection.hDbc, ref hstmt);\r
- if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo)) \r
- throw new OdbcException(new OdbcError("SQLAllocHandle",OdbcHandleType.Dbc,Connection.hDbc));\r
-\r
- ret=libodbc.SQLExecDirect(hstmt, sql, sql.Length);\r
- if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo)) \r
- throw new OdbcException(new OdbcError("SQLExecDirect",OdbcHandleType.Stmt,hstmt));\r
- }\r
- }\r
-\r
- public int ExecuteNonQuery ()\r
- {\r
- if (connection == null)\r
- throw new InvalidOperationException ();\r
- if (connection.State == ConnectionState.Closed)\r
- throw new InvalidOperationException ();\r
- // FIXME: a third check is mentioned in .NET docs\r
-\r
- ExecSQL(CommandText);\r
-\r
-// if (!prepared)\r
-// libodbc.SQLFreeHandle( (ushort) OdbcHandleType.Stmt, hstmt);\r
- return 0;\r
- }\r
-\r
- public void Prepare()\r
- {\r
- OdbcReturn ret=libodbc.SQLAllocHandle(OdbcHandleType.Stmt, Connection.hDbc, ref hstmt);\r
- if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo)) \r
- throw new OdbcException(new OdbcError("SQLAllocHandle",OdbcHandleType.Dbc,Connection.hDbc));\r
-\r
- ret=libodbc.SQLPrepare(hstmt, CommandText, CommandText.Length);\r
- if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo)) \r
- throw new OdbcException(new OdbcError("SQLPrepare",OdbcHandleType.Stmt,hstmt));\r
-\r
- int i=1;\r
- foreach (OdbcParameter p in parameters)\r
- {\r
- p.Bind(hstmt, i);\r
- i++;\r
- }\r
-\r
- prepared=true;\r
- }\r
-\r
- public OdbcDataReader ExecuteReader ()\r
- {\r
- return ExecuteReader (CommandBehavior.Default);\r
- }\r
-\r
- IDataReader IDbCommand.ExecuteReader ()\r
- {\r
- return ExecuteReader ();\r
- }\r
-\r
- public OdbcDataReader ExecuteReader (CommandBehavior behavior)\r
- {\r
- ExecuteNonQuery();\r
- dataReader=new OdbcDataReader(this,behavior);\r
- return dataReader;\r
- }\r
-\r
- IDataReader IDbCommand.ExecuteReader (CommandBehavior behavior)\r
- {\r
- return ExecuteReader (behavior);\r
- }\r
- \r
- public object ExecuteScalar ()\r
- {\r
- object val = null;\r
- OdbcDataReader reader=ExecuteReader();\r
- try\r
- {\r
- if (reader.Read ())\r
- val=reader[0];\r
- }\r
- finally\r
- {\r
- reader.Close();\r
- }\r
- return val;\r
- }\r
-\r
- [MonoTODO]\r
- object ICloneable.Clone ()\r
- {\r
- throw new NotImplementedException (); \r
- }\r
-\r
- public void ResetCommandTimeout ()\r
- {\r
- timeout = 30;\r
- }\r
-\r
- #endregion\r
- }\r
-}\r
+ }
+ }
+ #else
+ protected override DbTransaction DbTransaction {
+ get { return transaction; }
+ set { transaction = (OdbcTransaction) value; }
+ }
+#endif // ONLY_1_1
+
+ #endregion // Properties
+
+ #region Methods
+
+ public
+#if NET_2_0
+ override
+#endif // NET_2_0
+ void Cancel ()
+ {
+ if (hstmt != IntPtr.Zero) {
+ OdbcReturn Ret = libodbc.SQLCancel (hstmt);
+ if (Ret != OdbcReturn.Success && Ret != OdbcReturn.SuccessWithInfo)
+ throw connection.CreateOdbcException (OdbcHandleType.Stmt, hstmt);
+ } else
+ throw new InvalidOperationException ();
+ }
+
+#if ONLY_1_1
+ IDbDataParameter IDbCommand.CreateParameter ()
+ {
+ return CreateParameter ();
+ }
+
+#else
+ protected override DbParameter CreateDbParameter ()
+ {
+ return CreateParameter ();
+ }
+#endif // ONLY_1_1
+
+ public new OdbcParameter CreateParameter ()
+ {
+ return new OdbcParameter ();
+ }
+
+ protected override void Dispose (bool disposing)
+ {
+ if (disposed)
+ return;
+
+ FreeStatement (); // free handles
+ Connection = null;
+ Transaction = null;
+ disposed = true;
+ }
+
+ private IntPtr ReAllocStatment ()
+ {
+ OdbcReturn ret;
+
+ if (hstmt != IntPtr.Zero)
+ FreeStatement ();
+
+ ret = libodbc.SQLAllocHandle (OdbcHandleType.Stmt, Connection.hDbc, ref hstmt);
+ if (ret != OdbcReturn.Success && ret != OdbcReturn.SuccessWithInfo)
+ throw connection.CreateOdbcException (OdbcHandleType.Dbc, Connection.hDbc);
+ disposed = false;
+ return hstmt;
+ }
+
+ private void FreeStatement ()
+ {
+ if (hstmt == IntPtr.Zero)
+ return;
+
+ // free previously allocated handle.
+ OdbcReturn ret = libodbc.SQLFreeStmt (hstmt, libodbc.SQLFreeStmtOptions.Close);
+ if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
+ throw connection.CreateOdbcException (OdbcHandleType.Stmt, hstmt);
+
+ ret = libodbc.SQLFreeHandle ((ushort) OdbcHandleType.Stmt, hstmt);
+ if (ret != OdbcReturn.Success && ret != OdbcReturn.SuccessWithInfo)
+ throw connection.CreateOdbcException (OdbcHandleType.Stmt, hstmt);
+ hstmt = IntPtr.Zero;
+ }
+
+ private void ExecSQL (string sql)
+ {
+ OdbcReturn ret;
+ if (! prepared && Parameters.Count <= 0) {
+
+ ReAllocStatment ();
+
+ ret = libodbc.SQLExecDirect (hstmt, sql, libodbc.SQL_NTS);
+ if ((ret != OdbcReturn.Success) && (ret != OdbcReturn.SuccessWithInfo) &&
+ (ret != OdbcReturn.NoData))
+ throw connection.CreateOdbcException (OdbcHandleType.Stmt, hstmt);
+ return;
+ }
+
+ if (!prepared)
+ Prepare();
+
+ BindParameters ();
+ ret = libodbc.SQLExecute (hstmt);
+ if (ret != OdbcReturn.Success && ret != OdbcReturn.SuccessWithInfo)
+ throw connection.CreateOdbcException (OdbcHandleType.Stmt, hstmt);
+ }
+
+ internal void FreeIfNotPrepared ()
+ {
+ if (! prepared)
+ FreeStatement ();
+ }
+
+ public
+#if NET_2_0
+ override
+#endif // NET_2_0
+ int ExecuteNonQuery ()
+ {
+ return ExecuteNonQuery (true);
+ }
+
+ private int ExecuteNonQuery (bool freeHandle)
+ {
+ int records = 0;
+ if (Connection == null)
+ throw new InvalidOperationException ("No open connection");
+ if (Connection.State == ConnectionState.Closed)
+ throw new InvalidOperationException ("Connection state is closed");
+ // FIXME: a third check is mentioned in .NET docs
+
+ ExecSQL(CommandText);
+
+ // .NET documentation says that except for INSERT, UPDATE and
+ // DELETE where the return value is the number of rows affected
+ // for the rest of the commands the return value is -1.
+ if ((CommandText.ToUpper().IndexOf("UPDATE")!=-1) ||
+ (CommandText.ToUpper().IndexOf("INSERT")!=-1) ||
+ (CommandText.ToUpper().IndexOf("DELETE")!=-1)) {
+ int numrows = 0;
+ OdbcReturn ret = libodbc.SQLRowCount (hstmt, ref numrows);
+ records = numrows;
+ } else
+ records = -1;
+
+ if (freeHandle && !prepared)
+ FreeStatement ();
+
+ return records;
+ }
+
+ public
+#if NET_2_0
+ override
+#endif // NET_2_0
+ void Prepare()
+ {
+ ReAllocStatment ();
+
+ OdbcReturn ret;
+ ret = libodbc.SQLPrepare(hstmt, CommandText, CommandText.Length);
+ if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
+ throw connection.CreateOdbcException (OdbcHandleType.Stmt, hstmt);
+ prepared = true;
+ }
+
+ private void BindParameters ()
+ {
+ int i = 1;
+ foreach (OdbcParameter p in Parameters) {
+ p.Bind (this, hstmt, i);
+ p.CopyValue ();
+ i++;
+ }
+ }
+
+ public
+#if NET_2_0
+ new
+#endif // NET_2_0
+ OdbcDataReader ExecuteReader ()
+ {
+ return ExecuteReader (CommandBehavior.Default);
+ }
+
+#if ONLY_1_1
+ IDataReader IDbCommand.ExecuteReader ()
+ {
+ return ExecuteReader ();
+ }
+#else
+ protected override DbDataReader ExecuteDbDataReader (CommandBehavior behavior)
+ {
+ return ExecuteReader (behavior);
+ }
+#endif // ONLY_1_1
+
+ public
+#if NET_2_0
+ new
+#endif // NET_2_0
+ OdbcDataReader ExecuteReader (CommandBehavior behavior)
+ {
+ int recordsAffected = ExecuteNonQuery(false);
+ OdbcDataReader dataReader = new OdbcDataReader (this, behavior, recordsAffected);
+ return dataReader;
+ }
+
+#if ONLY_1_1
+ IDataReader IDbCommand.ExecuteReader (CommandBehavior behavior)
+ {
+ return ExecuteReader (behavior);
+ }
+#endif // ONLY_1_1
+
+ public
+#if NET_2_0
+ override
+#endif
+ object ExecuteScalar ()
+ {
+ object val = null;
+ OdbcDataReader reader = ExecuteReader();
+ try {
+ if (reader.Read ())
+ val = reader [0];
+ } finally {
+ reader.Close ();
+ }
+ return val;
+ }
+
+ object ICloneable.Clone ()
+ {
+ OdbcCommand command = new OdbcCommand ();
+ command.CommandText = this.CommandText;
+ command.CommandTimeout = this.CommandTimeout;
+ command.CommandType = this.CommandType;
+ command.Connection = this.Connection;
+ command.DesignTimeVisible = this.DesignTimeVisible;
+ foreach (OdbcParameter parameter in this.Parameters)
+ command.Parameters.Add (parameter);
+ command.Transaction = this.Transaction;
+ return command;
+ }
+
+ public void ResetCommandTimeout ()
+ {
+ CommandTimeout = DEFAULT_COMMAND_TIMEOUT;
+ }
+
+ #endregion
+ }
+}