Index: System.Data.SQLite/SQLiteCommand.cs
==================================================================
--- System.Data.SQLite/SQLiteCommand.cs
+++ System.Data.SQLite/SQLiteCommand.cs
@@ -40,11 +40,11 @@
///
private SQLiteConnection _cnn;
///
/// The version of the connection the command is associated with
///
- private long _version;
+ private int _version;
///
/// Indicates whether or not a DataReader is active on the command.
///
private WeakReference _activeReader;
///
Index: System.Data.SQLite/SQLiteConnection.cs
==================================================================
--- System.Data.SQLite/SQLiteConnection.cs
+++ System.Data.SQLite/SQLiteConnection.cs
@@ -518,11 +518,11 @@
///
private bool _parseViaFramework;
internal bool _binaryGuid;
- internal long _version;
+ internal int _version;
private event SQLiteAuthorizerEventHandler _authorizerHandler;
private event SQLiteUpdateEventHandler _updateHandler;
private event SQLiteCommitHandler _commitHandler;
private event SQLiteTraceEventHandler _traceHandler;
Index: System.Data.SQLite/SQLiteDataReader.cs
==================================================================
--- System.Data.SQLite/SQLiteDataReader.cs
+++ System.Data.SQLite/SQLiteDataReader.cs
@@ -86,11 +86,11 @@
private SQLiteKeyReader _keyInfo;
///
/// Matches the version of the connection.
///
- internal long _version;
+ internal int _version;
///
/// The "stub" (i.e. placeholder) base schema name to use when returning
/// column schema information. Matches the base schema name used by the
/// associated connection.
@@ -267,11 +267,13 @@
throw new InvalidOperationException("DataReader has been closed");
if (_version == 0)
throw new SQLiteException("Execution was aborted by the user");
- if (_command.Connection.State != ConnectionState.Open || _command.Connection._version != _version)
+ SQLiteConnection connection = _command.Connection;
+
+ if (connection._version != _version || connection.State != ConnectionState.Open)
throw new InvalidOperationException("Connection was closed, statement was terminated");
}
///
/// Throw an error if a row is not loaded
@@ -344,10 +346,15 @@
CheckClosed();
return _stepCount;
}
}
+
+ private int PrivateVisibleFieldCount
+ {
+ get { return _fieldCount; }
+ }
///
/// Returns the number of visible fields in the current resultset
///
public override int VisibleFieldCount
@@ -354,13 +361,22 @@
{
get
{
CheckDisposed();
CheckClosed();
- return _fieldCount;
+ return PrivateVisibleFieldCount;
}
}
+
+ ///
+ /// This method is used to make sure the result set is open and a row is currently available.
+ ///
+ private void VerifyForGet()
+ {
+ CheckClosed();
+ CheckValidRow();
+ }
///
/// SQLite is inherently un-typed. All datatypes in SQLite are natively strings. The definition of the columns of a table
/// and the affinity of returned types are all we have to go on to type-restrict data in the reader.
///
@@ -373,81 +389,80 @@
///
/// The index of the column to type-check
/// The type we want to get out of the column
private TypeAffinity VerifyType(int i, DbType typ)
{
- CheckClosed();
- CheckValidRow();
-
- TypeAffinity affinity = GetSQLiteType(_flags, i).Affinity;
-
- switch (affinity)
- {
- case TypeAffinity.Int64:
- if (typ == DbType.Int16) return affinity;
- if (typ == DbType.Int32) return affinity;
- if (typ == DbType.Int64) return affinity;
- if (typ == DbType.Boolean) return affinity;
- if (typ == DbType.SByte) return affinity;
- if (typ == DbType.Byte) return affinity;
- if (typ == DbType.DateTime) return affinity;
- if (typ == DbType.Single) return affinity;
- if (typ == DbType.Double) return affinity;
- if (typ == DbType.Decimal) return affinity;
- break;
- case TypeAffinity.Double:
- if (typ == DbType.Single) return affinity;
- if (typ == DbType.Double) return affinity;
- if (typ == DbType.Decimal) return affinity;
- if (typ == DbType.DateTime) return affinity;
- break;
- case TypeAffinity.Text:
- if (typ == DbType.String) return affinity;
- if (typ == DbType.Guid) return affinity;
- if (typ == DbType.DateTime) return affinity;
- if (typ == DbType.Decimal) return affinity;
- break;
- case TypeAffinity.Blob:
- if (typ == DbType.Guid) return affinity;
- if (typ == DbType.String) return affinity;
- if (typ == DbType.Binary) return affinity;
- break;
- }
-
- throw new InvalidCastException();
+ TypeAffinity affinity = GetSQLiteType(_flags, i).Affinity;
+
+ switch (affinity)
+ {
+ case TypeAffinity.Int64:
+ if (typ == DbType.Int64) return affinity;
+ if (typ == DbType.Int32) return affinity;
+ if (typ == DbType.Int16) return affinity;
+ if (typ == DbType.Byte) return affinity;
+ if (typ == DbType.SByte) return affinity;
+ if (typ == DbType.Boolean) return affinity;
+ if (typ == DbType.DateTime) return affinity;
+ if (typ == DbType.Double) return affinity;
+ if (typ == DbType.Single) return affinity;
+ if (typ == DbType.Decimal) return affinity;
+ break;
+ case TypeAffinity.Double:
+ if (typ == DbType.Double) return affinity;
+ if (typ == DbType.Single) return affinity;
+ if (typ == DbType.Decimal) return affinity;
+ if (typ == DbType.DateTime) return affinity;
+ break;
+ case TypeAffinity.Text:
+ if (typ == DbType.String) return affinity;
+ if (typ == DbType.Guid) return affinity;
+ if (typ == DbType.DateTime) return affinity;
+ if (typ == DbType.Decimal) return affinity;
+ break;
+ case TypeAffinity.Blob:
+ if (typ == DbType.Guid) return affinity;
+ if (typ == DbType.Binary) return affinity;
+ if (typ == DbType.String) return affinity;
+ break;
+ }
+
+ throw new InvalidCastException();
}
///
/// Retrieves the column as a boolean value
///
/// The index of the column to retrieve
/// bool
public override bool GetBoolean(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetBoolean(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetBoolean(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Boolean);
- return Convert.ToBoolean(GetValue(i), CultureInfo.CurrentCulture);
+ VerifyType(i, DbType.Boolean);
+ return Convert.ToBoolean(GetValue(i), CultureInfo.CurrentCulture);
}
///
/// Retrieves the column as a single byte value
///
/// The index of the column to retrieve
/// byte
public override byte GetByte(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetByte(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetByte(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Byte);
- return Convert.ToByte(_activeStatement._sql.GetInt32(_activeStatement, i));
+ VerifyType(i, DbType.Byte);
+ return Convert.ToByte(_activeStatement._sql.GetInt32(_activeStatement, i));
}
///
/// Retrieves a column as an array of bytes (blob)
///
@@ -460,33 +475,35 @@
///
/// To determine the number of bytes in the column, pass a null value for the buffer. The total length will be returned.
///
public override long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetBytes(i - VisibleFieldCount, fieldOffset, buffer, bufferoffset, length);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetBytes(i - PrivateVisibleFieldCount, fieldOffset, buffer, bufferoffset, length);
- VerifyType(i, DbType.Binary);
- return _activeStatement._sql.GetBytes(_activeStatement, i, (int)fieldOffset, buffer, bufferoffset, length);
+ VerifyType(i, DbType.Binary);
+ return _activeStatement._sql.GetBytes(_activeStatement, i, (int)fieldOffset, buffer, bufferoffset, length);
}
///
/// Returns the column as a single character
///
/// The index of the column to retrieve
/// char
public override char GetChar(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetChar(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetChar(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.SByte);
- return Convert.ToChar(_activeStatement._sql.GetInt32(_activeStatement, i));
+ VerifyType(i, DbType.SByte);
+ return Convert.ToChar(_activeStatement._sql.GetInt32(_activeStatement, i));
}
///
/// Retrieves a column as an array of chars (blob)
///
@@ -499,199 +516,209 @@
///
/// To determine the number of characters in the column, pass a null value for the buffer. The total length will be returned.
///
public override long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetChars(i - VisibleFieldCount, fieldoffset, buffer, bufferoffset, length);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetChars(i - PrivateVisibleFieldCount, fieldoffset, buffer, bufferoffset, length);
- VerifyType(i, DbType.String);
- return _activeStatement._sql.GetChars(_activeStatement, i, (int)fieldoffset, buffer, bufferoffset, length);
+ VerifyType(i, DbType.String);
+ return _activeStatement._sql.GetChars(_activeStatement, i, (int)fieldoffset, buffer, bufferoffset, length);
}
///
/// Retrieves the name of the back-end datatype of the column
///
/// The index of the column to retrieve
/// string
public override string GetDataTypeName(int i)
{
- CheckDisposed();
-
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetDataTypeName(i - VisibleFieldCount);
-
- SQLiteType typ = GetSQLiteType(_flags, i);
- if (typ.Type == DbType.Object) return SQLiteConvert.SQLiteTypeToType(typ).Name;
- return _activeStatement._sql.ColumnType(_activeStatement, i, out typ.Affinity);
+ CheckDisposed();
+ VerifyForGet();
+
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetDataTypeName(i - PrivateVisibleFieldCount);
+
+ SQLiteType typ = GetSQLiteType(_flags, i);
+ if (typ.Type == DbType.Object) return SQLiteConvert.SQLiteTypeToType(typ).Name;
+ return _activeStatement._sql.ColumnType(_activeStatement, i, out typ.Affinity);
}
///
/// Retrieve the column as a date/time value
///
/// The index of the column to retrieve
/// DateTime
public override DateTime GetDateTime(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetDateTime(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetDateTime(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.DateTime);
- return _activeStatement._sql.GetDateTime(_activeStatement, i);
+ VerifyType(i, DbType.DateTime);
+ return _activeStatement._sql.GetDateTime(_activeStatement, i);
}
///
/// Retrieve the column as a decimal value
///
/// The index of the column to retrieve
/// decimal
public override decimal GetDecimal(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetDecimal(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetDecimal(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Decimal);
- return Decimal.Parse(_activeStatement._sql.GetText(_activeStatement, i), NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture);
+ VerifyType(i, DbType.Decimal);
+ return Decimal.Parse(_activeStatement._sql.GetText(_activeStatement, i), NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture);
}
///
/// Returns the column as a double
///
/// The index of the column to retrieve
/// double
public override double GetDouble(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetDouble(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetDouble(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Double);
- return _activeStatement._sql.GetDouble(_activeStatement, i);
+ VerifyType(i, DbType.Double);
+ return _activeStatement._sql.GetDouble(_activeStatement, i);
}
///
/// Returns the .NET type of a given column
///
/// The index of the column to retrieve
/// Type
public override Type GetFieldType(int i)
{
- CheckDisposed();
+ CheckDisposed();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetFieldType(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetFieldType(i - PrivateVisibleFieldCount);
- return SQLiteConvert.SQLiteTypeToType(GetSQLiteType(_flags, i));
+ return SQLiteConvert.SQLiteTypeToType(GetSQLiteType(_flags, i));
}
///
/// Returns a column as a float value
///
/// The index of the column to retrieve
/// float
public override float GetFloat(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetFloat(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetFloat(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Single);
- return Convert.ToSingle(_activeStatement._sql.GetDouble(_activeStatement, i));
+ VerifyType(i, DbType.Single);
+ return Convert.ToSingle(_activeStatement._sql.GetDouble(_activeStatement, i));
}
///
/// Returns the column as a Guid
///
/// The index of the column to retrieve
/// Guid
public override Guid GetGuid(int i)
{
- CheckDisposed();
-
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetGuid(i - VisibleFieldCount);
-
- TypeAffinity affinity = VerifyType(i, DbType.Guid);
- if (affinity == TypeAffinity.Blob)
- {
- byte[] buffer = new byte[16];
- _activeStatement._sql.GetBytes(_activeStatement, i, 0, buffer, 0, 16);
- return new Guid(buffer);
- }
- else
- return new Guid(_activeStatement._sql.GetText(_activeStatement, i));
+ CheckDisposed();
+ VerifyForGet();
+
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetGuid(i - PrivateVisibleFieldCount);
+
+ TypeAffinity affinity = VerifyType(i, DbType.Guid);
+ if (affinity == TypeAffinity.Blob)
+ {
+ byte[] buffer = new byte[16];
+ _activeStatement._sql.GetBytes(_activeStatement, i, 0, buffer, 0, 16);
+ return new Guid(buffer);
+ }
+ else
+ return new Guid(_activeStatement._sql.GetText(_activeStatement, i));
}
///
/// Returns the column as a short
///
/// The index of the column to retrieve
/// Int16
public override Int16 GetInt16(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetInt16(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetInt16(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Int16);
- return Convert.ToInt16(_activeStatement._sql.GetInt32(_activeStatement, i));
+ VerifyType(i, DbType.Int16);
+ return Convert.ToInt16(_activeStatement._sql.GetInt32(_activeStatement, i));
}
///
/// Retrieves the column as an int
///
/// The index of the column to retrieve
/// Int32
public override Int32 GetInt32(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetInt32(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetInt32(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Int32);
- return _activeStatement._sql.GetInt32(_activeStatement, i);
+ VerifyType(i, DbType.Int32);
+ return _activeStatement._sql.GetInt32(_activeStatement, i);
}
///
/// Retrieves the column as a long
///
/// The index of the column to retrieve
/// Int64
public override Int64 GetInt64(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetInt64(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetInt64(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.Int64);
- return _activeStatement._sql.GetInt64(_activeStatement, i);
+ VerifyType(i, DbType.Int64);
+ return _activeStatement._sql.GetInt64(_activeStatement, i);
}
///
/// Retrieves the name of the column
///
/// The index of the column to retrieve
/// string
public override string GetName(int i)
{
- CheckDisposed();
+ CheckDisposed();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetName(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetName(i - PrivateVisibleFieldCount);
- return _activeStatement._sql.ColumnName(_activeStatement, i);
+ return _activeStatement._sql.ColumnName(_activeStatement, i);
}
///
/// Retrieves the i of a column, given its name
///
@@ -698,11 +725,12 @@
/// The name of the column to retrieve
/// The int i of the column
public override int GetOrdinal(string name)
{
CheckDisposed();
- CheckClosed();
+ VerifyForGet();
+
if (_throwOnDisposed) SQLiteCommand.Check(_command);
//
// NOTE: First, check if the column name cache has been initialized yet.
// If not, do it now.
@@ -725,11 +753,11 @@
r = _activeStatement._sql.ColumnIndex(_activeStatement, name);
if (r == -1 && _keyInfo != null)
{
r = _keyInfo.GetOrdinal(name);
- if (r > -1) r += VisibleFieldCount;
+ if (r > -1) r += PrivateVisibleFieldCount;
}
_fieldIndexes.Add(name, r);
}
@@ -1123,48 +1151,49 @@
///
/// The index of the column to retrieve
/// string
public override string GetString(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetString(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetString(i - PrivateVisibleFieldCount);
- VerifyType(i, DbType.String);
- return _activeStatement._sql.GetText(_activeStatement, i);
+ VerifyType(i, DbType.String);
+ return _activeStatement._sql.GetText(_activeStatement, i);
}
///
/// Retrieves the column as an object corresponding to the underlying datatype of the column
///
/// The index of the column to retrieve
/// object
public override object GetValue(int i)
{
- CheckDisposed();
- CheckValidRow();
-
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.GetValue(i - VisibleFieldCount);
-
- SQLiteType typ = GetSQLiteType(_flags, i);
-
- if (((_flags & SQLiteConnectionFlags.DetectTextAffinity) == SQLiteConnectionFlags.DetectTextAffinity) &&
- ((typ == null) || (typ.Affinity == TypeAffinity.Text)))
- {
- typ = GetSQLiteType(
- typ, _activeStatement._sql.GetText(_activeStatement, i));
- }
- else if (((_flags & SQLiteConnectionFlags.DetectStringType) == SQLiteConnectionFlags.DetectStringType) &&
- ((typ == null) || SQLiteConvert.IsStringDbType(typ.Type)))
- {
- typ = GetSQLiteType(
- typ, _activeStatement._sql.GetText(_activeStatement, i));
- }
-
- return _activeStatement._sql.GetValue(_activeStatement, _flags, i, typ);
+ CheckDisposed();
+ VerifyForGet();
+
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.GetValue(i - PrivateVisibleFieldCount);
+
+ SQLiteType typ = GetSQLiteType(_flags, i);
+
+ if (((_flags & SQLiteConnectionFlags.DetectTextAffinity) == SQLiteConnectionFlags.DetectTextAffinity) &&
+ ((typ == null) || (typ.Affinity == TypeAffinity.Text)))
+ {
+ typ = GetSQLiteType(
+ typ, _activeStatement._sql.GetText(_activeStatement, i));
+ }
+ else if (((_flags & SQLiteConnectionFlags.DetectStringType) == SQLiteConnectionFlags.DetectStringType) &&
+ ((typ == null) || SQLiteConvert.IsStringDbType(typ.Type)))
+ {
+ typ = GetSQLiteType(
+ typ, _activeStatement._sql.GetText(_activeStatement, i));
+ }
+
+ return _activeStatement._sql.GetValue(_activeStatement, _flags, i, typ);
}
///
/// Retreives the values of multiple columns, up to the size of the supplied array
///
@@ -1200,11 +1229,11 @@
CheckDisposed();
if ((_activeStatement == null) || (_activeStatement._sql == null))
throw new InvalidOperationException();
- int nMax = VisibleFieldCount;
+ int nMax = PrivateVisibleFieldCount;
NameValueCollection result = new NameValueCollection(nMax);
for (int n = 0; n < nMax; n++)
{
string name = _activeStatement._sql.ColumnName(_activeStatement, n);
@@ -1260,16 +1289,17 @@
///
/// The index of the column to retrieve
/// True or False
public override bool IsDBNull(int i)
{
- CheckDisposed();
+ CheckDisposed();
+ VerifyForGet();
- if (i >= VisibleFieldCount && _keyInfo != null)
- return _keyInfo.IsDBNull(i - VisibleFieldCount);
+ if (i >= PrivateVisibleFieldCount && _keyInfo != null)
+ return _keyInfo.IsDBNull(i - PrivateVisibleFieldCount);
- return _activeStatement._sql.IsNull(_activeStatement, i);
+ return _activeStatement._sql.IsNull(_activeStatement, i);
}
///
/// Moves to the next resultset in multiple row-returning SQL command.
///
@@ -1358,12 +1388,12 @@
}
// Ahh, we found a row-returning resultset eligible to be returned!
_activeStatement = stmt;
_fieldCount = fieldCount;
- _fieldIndexes = null;
- _fieldTypeArray = null;
+ _fieldIndexes = new Dictionary(StringComparer.OrdinalIgnoreCase);
+ _fieldTypeArray = new SQLiteType[PrivateVisibleFieldCount];
if ((_commandBehavior & CommandBehavior.KeyInfo) != 0)
LoadKeyInfo();
return true;
@@ -1446,29 +1476,33 @@
/// The flags associated with the parent connection object.
/// The index of the column to retrieve
/// A SQLiteType structure
private SQLiteType GetSQLiteType(SQLiteConnectionFlags flags, int i)
{
- SQLiteType typ;
-
- // Initialize the field types array if not already initialized
- if (_fieldTypeArray == null)
- _fieldTypeArray = new SQLiteType[VisibleFieldCount];
-
- // Initialize this column's field type instance
- if (_fieldTypeArray[i] == null) _fieldTypeArray[i] = new SQLiteType();
-
- typ = _fieldTypeArray[i];
-
- // If not initialized, then fetch the declared column datatype and attempt to convert it
- // to a known DbType.
- if (typ.Affinity == TypeAffinity.Uninitialized)
- typ.Type = SQLiteConvert.TypeNameToDbType(GetConnection(this), _activeStatement._sql.ColumnType(_activeStatement, i, out typ.Affinity), flags);
- else
- typ.Affinity = _activeStatement._sql.ColumnAffinity(_activeStatement, i);
-
- return typ;
+ SQLiteType typ = _fieldTypeArray[i];
+
+ if (typ == null)
+ {
+ // Initialize this column's field type instance
+ typ = _fieldTypeArray[i] = new SQLiteType();
+ }
+
+ // If not initialized, then fetch the declared column datatype and attempt to convert it
+ // to a known DbType.
+ if (typ.Affinity == TypeAffinity.Uninitialized)
+ {
+ typ.Type = SQLiteConvert.TypeNameToDbType(
+ GetConnection(this), _activeStatement._sql.ColumnType(
+ _activeStatement, i, out typ.Affinity), flags);
+ }
+ else
+ {
+ typ.Affinity = _activeStatement._sql.ColumnAffinity(
+ _activeStatement, i);
+ }
+
+ return typ;
}
///
/// Reads the next row from the resultset
///
Index: System.Data.SQLite/SQLiteTransaction.cs
==================================================================
--- System.Data.SQLite/SQLiteTransaction.cs
+++ System.Data.SQLite/SQLiteTransaction.cs
@@ -19,11 +19,11 @@
{
///
/// The connection to which this transaction is bound
///
internal SQLiteConnection _cnn;
- internal long _version; // Matches the version of the connection
+ internal int _version; // Matches the version of the connection
private IsolationLevel _level;
///
/// Constructs the transaction object, binding it to the supplied connection
///