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:
Diffstat (limited to 'mcs/class/System.Data/System.Data.Odbc')
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/ChangeLog44
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs51
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs28
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs59
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs3
-rw-r--r--mcs/class/System.Data/System.Data.Odbc/OdbcType.cs2
6 files changed, 142 insertions, 45 deletions
diff --git a/mcs/class/System.Data/System.Data.Odbc/ChangeLog b/mcs/class/System.Data/System.Data.Odbc/ChangeLog
index d8581c1975b..e633dabdd9d 100644
--- a/mcs/class/System.Data/System.Data.Odbc/ChangeLog
+++ b/mcs/class/System.Data/System.Data.Odbc/ChangeLog
@@ -1,3 +1,47 @@
+2004-08-31 Umadevi S (sumadevi@novell.com)
+ * OdbcDataReader.cs - Fixed Decimal parsing
+
+
+2004-08-30 Umadevi S (sumadevi@novell.com)
+ * OdbcType.cs - removed inheritance from short.
+
+2004-08-27 Sureshkumar T (tsureshkumar@novell.com)
+ * OdbcDataReader.cs - fixed bug #63539 - TINYINT ODBC datatype is converted into System.Byte
+
+2004-08-26 Sureshkumar T (tsureshkumar@novell.com)
+ * OdbcDataReader.cs - Date & DateTime GetValue fixed.
+ GetBytes ordinal parameter passing fixed for BINARY in GetValue.
+
+2004-08-20 Sureshkumar T (tsureshkumar@novell.com)
+ * OdbcConnection.cs - correct handles are passed to OdbcError exception to trap the correct error
+
+2004-08-04 Umadevi S (sumadevi@novell.com)
+ * OdbcDataReader.cs - Fixed bug 61832 - Column names were not filled, due to which name based lookup of columns failed.
+
+2004-08-04 Umadevi S (sumadevi@novell.com)
+ * OdbcDataReader.cs - Fixed bug 61405 - Handling smallint column type.
+
+2004-07-30 Sureshkumar T (tsureshkumar@novell.com)
+ * OdbcCommand.cs: ExecuteNonQuery Closed statement handle to fix memory leak
+ * OdbcDataReader.cs: Closed statement handle to fix memory leak
+ Removed SQLState login in GetBytes coz OdbcError provides the same.
+
+2004-07-29 Umadevi S (sumadevi@novell.com)
+ * OdbcCommand.cs - Fixed bug 62046. ExecuteNonQuery implemented correctly
+
+2004-07-28 Umadevi S (sumadevi@novell.com)
+ * OdbcParameter.cs - fixed bug 61968. String values passed with quotes
+
+2004-07-07 Umadevi S (sumadevi@novell.com)
+ * OdbcConnection.cs - Allowed Close to be called multiple times
+ - Implementation of Dispose method
+
+2004-07-07 Umadevi S (sumadevi@novell.com)
+ * OdbcCommand.cs : fixed set method for Transaction
+
+2004-07-01 Sureshkumar T (tsureshkumar@novell.com)
+ * OdbcCommand.cs : fixed reader problem with ExecuteScalar
+
2004-06-23 Sureshkumar T (tsureshkumar@novell.com)
* OdbcConnection.cs: Fix: Moved env allocation to Open method.
Disconnection & freeing handles are done in Close
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs
index fe242f3bf8f..64c4fcfe661 100644
--- a/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/OdbcCommand.cs
@@ -223,7 +223,14 @@ namespace System.Data.Odbc
return (IDbTransaction) Transaction;
}
set {
- throw new NotImplementedException ();
+ if (value is OdbcTransaction)
+ {
+ Transaction = (OdbcTransaction)value;
+ }
+ else
+ {
+ throw new ArgumentException ();
+ }
}
}
@@ -285,6 +292,12 @@ namespace System.Data.Odbc
public int ExecuteNonQuery ()
{
+ return ExecuteNonQuery (true);
+ }
+
+ private int ExecuteNonQuery (bool freeHandle)
+ {
+ int records = 0;
if (connection == null)
throw new InvalidOperationException ();
if (connection.State == ConnectionState.Closed)
@@ -292,12 +305,29 @@ namespace System.Data.Odbc
// FIXME: a third check is mentioned in .NET docs
ExecSQL(CommandText);
-
-// if (!prepared)
-// libodbc.SQLFreeHandle( (ushort) OdbcHandleType.Stmt, hstmt);
- return 0;
- }
-
+
+ // .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) {
+ OdbcReturn ret = libodbc.SQLFreeHandle( (ushort) OdbcHandleType.Stmt, hstmt);
+ if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
+ throw new OdbcException(new OdbcError("SQLFreeHandle",OdbcHandleType.Stmt,hstmt));
+ }
+ return records;
+ }
+
public void Prepare()
{
OdbcReturn ret=libodbc.SQLAllocHandle(OdbcHandleType.Stmt, Connection.hDbc, ref hstmt);
@@ -330,7 +360,7 @@ namespace System.Data.Odbc
public OdbcDataReader ExecuteReader (CommandBehavior behavior)
{
- ExecuteNonQuery();
+ ExecuteNonQuery(false);
dataReader=new OdbcDataReader(this,behavior);
return dataReader;
}
@@ -342,11 +372,12 @@ namespace System.Data.Odbc
public object ExecuteScalar ()
{
- object val;
+ object val = null;
OdbcDataReader reader=ExecuteReader();
try
{
- val=reader[0];
+ if (reader.Read ())
+ val=reader[0];
}
finally
{
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs
index e6bd6ff0441..b40eb86c8d2 100644
--- a/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs
@@ -46,6 +46,7 @@ namespace System.Data.Odbc
int connectionTimeout;
internal OdbcTransaction transaction;
IntPtr henv=IntPtr.Zero, hdbc=IntPtr.Zero;
+ bool disposed = false;
#endregion
@@ -197,27 +198,25 @@ namespace System.Data.Odbc
// disconnect
ret = libodbc.SQLDisconnect (hdbc);
if ( (ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
- throw new OdbcException (new OdbcError ("SQLConnect", OdbcHandleType.Dbc,hdbc));
+ throw new OdbcException (new OdbcError ("SQLDisconnect", OdbcHandleType.Dbc,hdbc));
// free handles
if (hdbc != IntPtr.Zero) {
ret = libodbc.SQLFreeHandle ( (ushort) OdbcHandleType.Dbc, hdbc);
if ( (ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
- throw new OdbcException (new OdbcError ("SQLConnect", OdbcHandleType.Dbc,hdbc));
+ throw new OdbcException (new OdbcError ("SQLFreeHandle", OdbcHandleType.Dbc,hdbc));
}
hdbc = IntPtr.Zero;
if (henv != IntPtr.Zero) {
ret = libodbc.SQLFreeHandle ( (ushort) OdbcHandleType.Env, henv);
if ( (ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
- throw new OdbcException (new OdbcError ("SQLConnect", OdbcHandleType.Dbc,hdbc));
+ throw new OdbcException (new OdbcError ("SQLFreeHandle", OdbcHandleType.Env,henv));
}
henv = IntPtr.Zero;
transaction = null;
}
- else
- throw new InvalidOperationException ();
}
public OdbcCommand CreateCommand ()
@@ -231,10 +230,23 @@ namespace System.Data.Odbc
throw new NotImplementedException ();
}
- [MonoTODO]
protected override void Dispose (bool disposing)
- {
- }
+ {
+ if (!this.disposed) {
+ try
+ {
+ // release the native unmananged resources
+ this.Close();
+ this.disposed = true;
+ }
+ finally
+ {
+ // call Dispose on the base class
+ base.Dispose(disposing);
+ }
+ }
+ }
+
[MonoTODO]
object ICloneable.Clone ()
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
index 394963734f0..61b49d55481 100644
--- a/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/OdbcDataReader.cs
@@ -167,25 +167,8 @@ namespace System.Data.Odbc
return cols[ordinal];
}
- private string GetSQLState (IntPtr hstmt, ushort recNo)
- {
- OdbcReturn ret = OdbcReturn.Error;
- short bufLength=256, txtLength=0;
- int nativeError = 1;
- string sqlState = "", sqlMsg = "";
- byte [] msgtxtBuffer = new byte [bufLength];
- byte [] sqlStateBuffer = new byte [bufLength];
- ret = libodbc.SQLGetDiagRec (OdbcHandleType.Stmt, hstmt, recNo,
- sqlStateBuffer, ref nativeError, msgtxtBuffer,
- bufLength, ref txtLength);
- sqlState = Encoding.Default.GetString (sqlStateBuffer).Replace (
- (char) 0, ' ').Trim ();
- return sqlState;
- }
-
public void Close ()
{
- // libodbc.SQLFreeHandle((ushort) OdbcHandleType.Stmt, hstmt);
OdbcReturn ret=libodbc.SQLCloseCursor(hstmt);
if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
@@ -196,6 +179,9 @@ namespace System.Data.Odbc
if ((behavior & CommandBehavior.CloseConnection)==CommandBehavior.CloseConnection)
this.command.Connection.Close();
+ ret = libodbc.SQLFreeHandle( (ushort) OdbcHandleType.Stmt, hstmt);
+ if ((ret!=OdbcReturn.Success) && (ret!=OdbcReturn.SuccessWithInfo))
+ throw new OdbcException(new OdbcError("SQLFreeHandle",OdbcHandleType.Stmt,hstmt));
}
~OdbcDataReader ()
@@ -231,6 +217,10 @@ namespace System.Data.Odbc
if ( (ret != OdbcReturn.Success) && (ret != OdbcReturn.SuccessWithInfo))
throw new OdbcException (new OdbcError ("SQLGetData", OdbcHandleType.Stmt, hstmt));
+ OdbcError odbcErr = null;
+ if ( (ret == OdbcReturn.SuccessWithInfo))
+ odbcErr = new OdbcError ("SQLGetData", OdbcHandleType.Stmt, hstmt);
+
if (buffer == null)
return outsize; //if buffer is null,return length of the field
@@ -241,11 +231,10 @@ namespace System.Data.Odbc
copyBuffer = false;
returnVal = -1;
} else {
- string sqlstate = GetSQLState (hstmt, 1);
+ string sqlstate = odbcErr.SQLState;
//SQLState: String Data, Right truncated
if (sqlstate != libodbc.SQLSTATE_RIGHT_TRUNC)
- throw new OdbcException (new OdbcError ("SQLGetData",
- OdbcHandleType.Stmt, hstmt));
+ throw new OdbcException ( odbcErr);
copyBuffer = true;
}
} else {
@@ -400,7 +389,6 @@ namespace System.Data.Odbc
for (int i = 0; i < cols.Length; i += 1 )
{
OdbcColumn col=GetColumn(i);
- //Console.WriteLine("{0}:{1}:{2}",col.ColumnName,col.DataType,col.OdbcType);
schemaRow = dataTableSchema.NewRow ();
dataTableSchema.Rows.Add (schemaRow);
@@ -485,14 +473,23 @@ namespace System.Data.Odbc
bufsize=50;
buffer=new byte[bufsize]; // According to sqlext.h, use SQL_CHAR for decimal
ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.Char, buffer, bufsize, ref outsize);
+ byte[] temp = new byte[outsize];
+ for (int i=0;i<outsize;i++)
+ temp[i]=buffer[i];
+
if (outsize!=-1)
- DataValue=Decimal.Parse(System.Text.Encoding.Default.GetString(buffer));
+ DataValue=Decimal.Parse(System.Text.Encoding.Default.GetString(temp));
break;
case OdbcType.TinyInt:
short short_data=0;
ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.TinyInt, ref short_data, 0, ref outsize);
- DataValue=short_data;
+ DataValue = System.Convert.ToByte (short_data);
break;
+ case OdbcType.SmallInt:
+ short sint_data=0;
+ ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.SmallInt, ref sint_data, 0, ref outsize);
+ DataValue=sint_data;
+ break;
case OdbcType.Int:
int int_data=0;
ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.Int, ref int_data, 0, ref outsize);
@@ -524,8 +521,17 @@ namespace System.Data.Odbc
break;
case OdbcType.Timestamp:
case OdbcType.DateTime:
+ case OdbcType.Date:
+ case OdbcType.Time:
OdbcTimestamp ts_data=new OdbcTimestamp();
- ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.DateTime, ref ts_data, 0, ref outsize);
+ if (col.OdbcType == OdbcType.Timestamp)
+ ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.Timestamp, ref ts_data, 0, ref outsize);
+ else if (col.OdbcType == OdbcType.DateTime)
+ ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.DateTime, ref ts_data, 0, ref outsize);
+ else if (col.OdbcType == OdbcType.Date)
+ ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.Date, ref ts_data, 0, ref outsize);
+ else // FIXME: how to get TIME datatype ??
+ ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.DateTime, ref ts_data, 0, ref outsize);
if (outsize!=-1) // This means SQL_NULL_DATA
DataValue=new DateTime(ts_data.year,ts_data.month,ts_data.day,ts_data.hour,
ts_data.minute,ts_data.second,Convert.ToInt32(ts_data.fraction));
@@ -534,12 +540,11 @@ namespace System.Data.Odbc
case OdbcType.Image :
bufsize = col.MaxLength + 1;
buffer = new byte [bufsize];
- long read = GetBytes (ColIndex, 0, buffer, 0, bufsize);
+ long read = GetBytes (ordinal, 0, buffer, 0, bufsize);
ret = OdbcReturn.Success;
DataValue = buffer;
break;
default:
- //Console.WriteLine("Fetching unsupported data type as string: "+col.OdbcType.ToString());
bufsize=255;
buffer=new byte[bufsize];
ret=libodbc.SQLGetData(hstmt, ColIndex, OdbcType.Char, buffer, bufsize, ref outsize);
@@ -612,6 +617,8 @@ namespace System.Data.Odbc
currentRow=-1;
else
currentRow++;
+ GetSchemaTable();
+
// Clear cached values from last record
foreach (OdbcColumn col in cols)
{
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs
index 51df821d86f..11153197ca7 100644
--- a/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/OdbcParameter.cs
@@ -261,6 +261,9 @@ namespace System.Data.Odbc
string paramValueString = ParamValue.ToString();
// Treat everything else as a string
// Init string buffer
+ if (ParamValue is String)
+ paramValueString = "\'"+paramValueString+"\'";
+
if (buffer == null || buffer.Length < ((size > 20) ? size : 20))
buffer = new byte[(size > 20) ? size : 20];
else
diff --git a/mcs/class/System.Data/System.Data.Odbc/OdbcType.cs b/mcs/class/System.Data/System.Data.Odbc/OdbcType.cs
index fed8035a7e6..6e7c3169bee 100644
--- a/mcs/class/System.Data/System.Data.Odbc/OdbcType.cs
+++ b/mcs/class/System.Data/System.Data.Odbc/OdbcType.cs
@@ -51,7 +51,7 @@ namespace System.Data.Odbc
//#define SQL_INTERVAL 10
// could map to SmallDateTime?
- public enum OdbcType : short
+ public enum OdbcType
{
BigInt=-5, // SQL_BIGINT
Binary=-2, // SQL_BINARY