System.Data.SQLite

Login
This project makes use of Eagle, provided by Mistachkin Systems.
Eagle: Secure Software Automation

Artifact be1d878db4a0a13e649734d27b8dc374ad47a9e5:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
  <body>
    ADO.NET 2.0 SQLite Data Provider<br>
    Version 1.0.49.0 May 28, 2008<br>
    Using SQLite 3.5.9<br>
    Written by Robert Simpson (<a href="mailto:robert@blackcastlesoft.com">robert@blackcastlesoft.com</a>)<br>
    Released to the public domain, use at your own risk!<br>
    Official provider website:&nbsp; <a href="http://sqlite.phxsoftware.com">http://sqlite.phxsoftware.com</a><br />
    <br>
    The latest version can be downloaded <a href="http://sourceforge.net/projects/sqlite-dotnet2">
      here</a>
    <br>
    <br>
    <b></b>
    <h2>
      <b>Features:</b><br>
    </h2>
    <UL>
      <LI>
      Written from scratch on VS2008 specifically for ADO.NET 2.0, implementing all the
      base classes and features recently introduced in the framework, including automatic
      transaction enlistment.<li>Supports the Full
        and Compact .NET Framework, as well as native C/C++ development.&nbsp; 100% binary
        compatible with the original sqlite3.dll.</li>
      <LI>
      On the Compact Framework, it is faster than the newly-introduced Sql Server 
      Mobile.  SQLite's installed size is a fraction of Sql Mobile's. It uses less memory at runtime, runs queries faster, and has a smaller database file size as well.
      <li>Encrypted database support.&nbsp; Encrypted databases are fully encrypted and
        support both binary and cleartext password types.</li>
      <LI>
      Visual Studio 2005/2008 Design-Time Support, works with all versions of VS2005/2008,
        including
      all Express Editions of VS2005.&nbsp; You can add a SQLite 
      database to the Servers list, design queries with the Query Designer, 
      drag-and-drop tables onto a Typed DataSet, etc.
      <LI>
      Single file redistributable.&nbsp; The core sqlite3 codebase and the ADO.NET wrapper 
      are combined into one multi-module assembly.
      <LI>
      Binaries included for Itanium, x64, x86 and ARM processors.
      <LI>
      DbProviderFactory support.
      <LI>
        Full support for ATTACH'ed databases.&nbsp; Exposed as <I>Catalogs</I>
      in the schema.&nbsp; When cloning a connection, all attached databases are 
      automatically re-attached to the new connection.
      <LI>
        DbConnection.GetSchema(...) support includes <I>ReservedWords, MetaDataCollections</I>, <I>DataSourceInformation</I>,
        <I>DataTypes, Columns</I>, <I>Tables</I>, <I>Views, ViewColumns, </I><I>Catalogs, </I><I>Indexes, 
          IndexColumns </I>and <EM>ForeignKeys</EM>
      .
      <LI>
      Enhanced DbDataReader.GetSchemaTable() functionality returns catalog, namespace 
      and detailed schema information even for complex queries.
      <LI>
      Named and unnamed parameters.
      <LI>
      Full UTF-8 and UTF-16 support, each with optimized pipelines into the native 
      database core.
      <LI>
      Multiple simultaneous DataReaders (one DataReader per Command however).
      <LI>
      Full support for user-defined scalar and aggregate functions, encapsulated into 
      an easy-to-use base class in which only a couple of overrides are necessary to 
      implement new SQL functions.
      <LI>
      Full support for user-defined collating sequences, every bit as simple to 
      implement as user-defined functions and uses the same base class.
      <LI>
        Full source for the entire engine and wrapper.&nbsp; No copyrights.&nbsp; 
        Public Domain.&nbsp; 100% free for commercial and non-commercial use.&nbsp;</LI></UL>
    <strong></strong>
    <h2>
      <strong>Design-Time Support</strong></h2>
    <P>
      In Windows Explorer, navigate to the <STRONG>SQLite.NET\bin\Designer</STRONG>
        folder and execute the <STRONG>INSTALL.EXE</STRONG>
      file.&nbsp; The program will
      automatically detect what version(s) of Visual Studio 2005/2008 are installed and allow
      you to selectively install and uninstall the designer for each edition.</P>
    <H2><STRONG>DbFactory Support (Non-Compact Framework)</STRONG></H2>
    In order to use the SQLiteFactory and have the SQLite data provider enumerated 
    in the DbProviderFactories methods, you must add the following segment into your application's app.config file:<br>
    <br>
    <pre>&lt;configuration&gt;
  &lt;system.data&gt;
    &lt;DbProviderFactories&gt;
      &lt;remove invariant="System.Data.SQLite"/&gt;
      &lt;add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite"<BR > type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /&gt;
    &lt;/DbProviderFactories&gt;
  &lt;/system.data&gt;
&lt;/configuration&gt;
</pre>
    <p>See the help documentation for further details on implementing both version-specific (GAC enabled) and version independent DBProviderFactories support.
      </p>
    <h3>
      Compiling for the Compact Framework</h3>
    <p>
      Just change the target platform from Win32 to Compact Framework and 
      recompile.&nbsp; <STRONG>The Compact Framework has no support for enumerating 
        attributes in an assembly, therefore all user-defined collating sequences and 
        functions must be explicitly registered.</STRONG>&nbsp; See the <STRONG>testce</STRONG>
      sample application for an example of how to explicitly register user-defined 
      collating sequences and functions.</p>
    <h2>
      <b><A name="redist"></A>Distributing The SQLite Engine and ADO.NET Assembly</b></h2>
    <P>
      Only the <STRONG>System.Data.SQLite.DLL</STRONG> file needs to be distributed with your 
      application(s).&nbsp; This DLL contains both the managed wrapper and the native 
      SQLite3 codebase.</P>
    <H2><B>Development Notes Regarding the SQLite 3 Source Code</B></H2>
    <p>
      The core sqlite engine is compiled directly from the unmodified source code available
      at the sqlite.org website.&nbsp; Several additional pieces are compiled on top of
      it to extend its functionality, but the core engine's source is not changed.</p>
    <p></p>
    <p>
      <b>Version History</b></p>
    <p><b>1.0.49.0 - May 28, 2008</b></p>
    <ul>
      <li>Code merge with SQLite 3.5.9</li>
      <li>Fixed schema problems when querying the TEMP catalog.</li>
      <li>Changed BLOB datatype schema to return IsLong = False instead of True.&nbsp; This
        was preventing DbCommandBuilder from using GUID's and BLOB's as primary keys.</li>
      <li>Fix rollover issue with SQLite3.Reset() using TickCount.</li>
      <li>Fixed SQLiteDataReader to dispose of its command (if called for) before 
        closing the connection (when flagged to do so) instead of the other way around.</li>
      <li>Fixed a DbNull error when retrieving items not backed by a table schema.</li>
      <li>Fixed foreign key constraint parsing bug.</li>
      <li>Added FailIfMissing property to the SQLiteConnectionStringBuilder.</li>
      <li>Converted the source projects to Visual Studio 2008.</li>
    </ul>
    <p><b>1.0.48.0 - December 28, 2007</b></p>
    <ul>
      <li>Code merge with SQLite 3.5.4</li>
      <li>Calling SQLiteDataReader.GetFieldType() on a column with no schema information
        and whos first row is initially NULL now returns type Object instead of type DbNull.</li>
      <li>Added support for a new DateTime type, JulianDay.&nbsp; SQLite uses Julian dates
        internally.</li>
      <li>Added a new connection string parameter "Default Timeout" and a corresponding
        method on the SQLiteConnection object to change the default command timeout.&nbsp;
        This is especially useful for changing the timeout on transactions, which use SQLiteCommand
        objects internally and have no ADO.NET-friendly way to adjust the command timeout
        on those commands.</li>
      <li>FTS1 and FTS2 modules were removed from the codebase.&nbsp; Please upgrade all
        full-text indexes to use the FTS3 module.&nbsp;</li>
    </ul>
    <p><b>1.0.47.2 - December 10, 2007</b></p>
    <ul>
      <li>Fixed yet one more bug when closing a database with unfinalized command objects</li>
      <li>Fixed the DataReader's GetFieldType function when dealing with untyped SQLite affinities</li>
    </ul>
    <p><b>1.0.47.1 - December 5, 2007</b></p>
    <ul>
      <li>Fixed a leftover bug from the codemerge with SQLite 3.5.3 that failed to close a database.</li>
      <li>Fixed the broken Compact Framework distribution binary.</li>
      <li>SQLite 3.5.x changed some internal infrastructure pieces in the encryption interface
        which I didn't catch initially.&nbsp; Fixed.&nbsp;</li>
    </ul>
    <p><b>1.0.47.0 - December 4, 2007</b></p>
    <ul>
      <li>Code merge with SQLite 3.5.3</li>
      <li>Added installer support for Visual Studio 2008.&nbsp; Code is still using the
        VS2005 SDK so one or two bells and whistles are missing, but nothing significant.</li>
      <li>This is the last version that the FTS1 and FTS2 extensions will appear.&nbsp;
        Everyone should rebuild their fulltext indexes using the new FTS3 module.&nbsp;
        FTS1 and FTS2 suffer from a design flaw that could cause database corruption with
        certain vacuum operations.</li>
      <li>Fixed pooled connections so they rollback any outstanding transactions before
        going to the pool.&nbsp; </li>
      <li>Fixed the unintended breaking of the TYPES keyword, and mis-typing of untyped
        or indeterminate column types. </li>
      <li>Assert a FileIOPermission() requirement in the static SQLiteFunction constructor.
      </li>
      <li>The CE-only SQLiteFunction.RegisterFunction() is now available on the desktop
        platform for dynamic registration of functions.&nbsp; You must still close and re-open
        a connection in order for the new function to be seen by a connection.</li>
      <li>Fixed the "database is locked" errors by implementing behavioral changes in the
        interop.c file for SQLite.&nbsp; Closing a database force-finalizes any prepared
        statements on the database to ensure the connection is fully closed.&nbsp; This
        was rather tricky because the GC thread could still be finalizing statements itself.
        &nbsp;</li>
      <li>Modifed the mergebin utility to help circumvent a long-standing strong name verification
        bug in the Compact Framework.</li>
    </ul>
    <p><b>1.0.46.0 - September 30, 2007</b></p>
    <ul>
    <li>Fixed faulty logic in type discovery code when using SQLiteDataReader.GetValue().</li>
      <li>Fixed Connection.Open() bug when dealing with :memory: databases.</li>
      <li>Fixed SQLiteCommand.ExecuteScalar() to return a properly-typed value.</li>
      <li>Added support for SQLiteParameter.ResetDbType().</li>
      <li>Added test cases for rigid and flexible type testing.</li>
    </ul>
    <p><b>1.0.45.0 - September 25, 2007</b></p>
    <ul>
    <li><strong>Breaking change in GetSchema("Indexes") </strong>-- MetaDataCollections
      restrictions and identifier parts counts were wrong for this schema and I was using
      the wrong final parameter as the final restriction.&nbsp; Meaning, if you use the
      Indexes schema and are querying for a specific index the array should now be {catalog,
      null, table, index } instead of {catalog, null, table, null, index}</li>
      <li>Code merge with SQLite 3.4.2</li>
      <li>Fixed some errors in the encryption module, most notably when a non-default page
        size is specified in the connection string. </li>
      <li>Fixed SQLiteDataReader to better handle type-less usage scenarios, which also
        fixes problems with null values and datetimes.</li>
      <li>Fixed the leftover temp files problem on WinCE </li>
      <li>Added connection pooling.&nbsp; The default is disabled for now, but may change
      in the future.&nbsp; Set "Pooling=True" in the connection string to enable it. </li>
      <li>Sped up SQLiteConnection.Open() considerably.</li>
      <li>Added some more robust cleanup code regarding SQLiteFunctions.</li>
      <li>Minor additions to the code to allow for future LINQ integration into the main
        codebase.</li>
      <li>Fixed a long-standing bug in the Open() command of SQLiteConnection which failed
      to honor the documented default behavior of the SQLite.NET provider to open the
      database in "Synchronous=Normal" mode.&nbsp; The default was "Full". </li>
      <li>If Open() fails, it no longer sets the connection state to Broken.&nbsp; It instead
        reverts back to Closed, and cleans up after itself.</li>
      <li>Added several new parameters to the ConnectionString for setting max page count,
        legacy file format, and another called FailIfMissing to raise an error rather than
        create the database file automatically if it does not already exist.</li>
      <li>Fixed some designer toolbox references to the wrong version of the SQLite.Designer</li>
      <li>Fixed a bug in the mergebin utility with regards to COR20 metadata rowsize computations.&nbsp;
      </li>
      <li>Minor documentation corrections &nbsp;&nbsp;</li>
    </ul>
    <p><b>1.0.44.0 - July 21, 2007</b></p>
    <ul>
    <li>Code merge with SQLite 3.4.1</li>
      <li>Fixed a bug in SQLiteConnection.Open() which threw the wrong kind of error in
        the wrong kind of way when a database file could not be opened or created.&nbsp;</li>
      <li>Small enhancements to the TYPES keyword, and added documentation for it in the
        help file.</li>
      <li>Hopefully fixed the occasional SQLITE_BUSY errors that cropped up when starting
        a transaction.&nbsp; Usually occurred in high-contention scenarios, and the underlying
        SQLite engine bypasses the busy handler in this scenario to return immediately.</li>
    </ul>
    <p><b>1.0.43.0 - June 21, 2007</b></p>
    <ul>
    <li>Code merge with SQLite 3.4.0</li>
      <li>Fixed a reuse bug in the SQLiteDataAdapter in conjunction with the SQLiteCommandBuilder.&nbsp;
      It's been there unnoticed for more than a year, so it looks like most folks never
      encountered it. </li>
      <li>Fixed an event handler bug in SQLiteCommandBuilder in which it could fail to unlatch
        from the DataAdapter when reused.&nbsp; Relates to the previous bugfix.</li>
      <li>Fixed a double-dispose bug in SQLiteStatement that triggered a SQLiteException.&nbsp;</li>
    </ul>
    <p><b>1.0.42.0 - June 1, 2007</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.17</li>
      <li>Changed the SQLiteFunction static constructor so it only enumerates loaded modules
        that have referenced the SQLite assembly, which hopefully should cut down dramatically
        the time it takes for that function to execute.&nbsp;</li>
      <li>Added the FTS2 full-text search extension to the project.&nbsp; Look for FTS1
        to disappear within the next couple of revisions.&nbsp;</li>
      <li>Fixed a bug introduced with the finalizers that triggered an error when statements
        ended with a semi-colon or had other non-parsable comments at the end of a statement&nbsp;</li>
      <li>Fixed an intermittent multi-threaded race condition between the garbage collector
        thread and the main application thread which lead to an occasional SQLITE_MISUSE
        error.</li>
      <li>Fixed another issue relating to SQLite's inherent typelessness when dealing with
        aggregate functions which could return Int64 or Double or even String for a given
        row depending on what was aggregated.</li>
      <li>Remembered to recompile the DDEX portion of the engine this time, so Compact Framework
        users can once again use the design-time functionality</li>
    </ul>
    <p><b>1.0.41.0 - April 23, 2007</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.16</li>
      <li>Second go at implementing proper finalizers to cleanup after folks who've forgotten to Dispose() of the SQLite objects</li>
      <li>Enhanced GetSchema(IndexColumns) to provide numeric scale and precision values</li>
      <li>Fixed the column ordinals in GetSchema(IndexColumns) to report the ordinal of the column in the index, not the table</li>
      <li>Fixed a bug whereby parameters named with an empty string (such as String.Empty) were treated like a named parameter instead of an unnamed parameter</li>
    </ul>
    <p><b>1.0.40.0 - January 31, 2007</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.12</li>
      <li>Lots of new code to handle misuse of the library.&nbsp; Implemented finalizers
        where it made sense, fixed numerous garbage collector issues when objects are not
        disposed properly, &nbsp;fixed some object lifetime issues, etc.</li>
      <li>A failed Commit() on a transaction no longer leaves the transaction in an unusable
        state.</li>
    </ul>
    <p><b>1.0.39.1 - January 11, 2007</b></p>
    <ul>
    <li>Fixed a really dumb mistake that for some reason didn't trigger any errors in
      the testcases, whereby commands when associated with a connection were not adding
      or removing themselves from an internal list of commands for that connection --
      causing a "database is locked" error when trying to close the connection.</li>
    </ul>
    <p><b>1.0.39.0 - January 10, 2007</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.10</li>
      <li>Fixed a multi-threaded race condition bug in the garbage collector when commands
        and/or connections are not properly disposed by the user. </li>
      <li>Switched the encryption's internal deallocation code to use sqlite's built-in
        aux functions instead of modifying the pager.c source to free the crypt block.&nbsp;
        This eliminates the last of the code changes the provider makes to the original
        sqlite engine sources.&nbsp; Props to Ralf Junker for pointing that out.</li>
    </ul>
    <p><b>1.0.38.0 - November 22, 2006</b></p>
    <ul>
    <li>Fixed a bug when using CommandBehavior.KeyInfo whereby integer primary key columns may be duplicated in the results. </li>
      <li>Enhanced the CommandBuilder so that update/delete statements are optimized when the affected table contains unique constraints and
      a primary key is present.</li>
      <li>Fixed a bug in the DataReader when used in conjunction with CommandBehavior.CloseConnection.</li></ul>
    <p><b>1.0.37.0 - November 19, 2006</b></p>
    <ul>
    <li>Added support for CommandBehavior.KeyInfo.&nbsp; 
      When specified in a query, additional column(s) will be returned describing the
      key(s) defined for the table(s) selected in the query.&nbsp; This is optimized when
      INTEGER PRIMARY KEY is set for the given tables, but does additional work for other
      kinds of primary keys.</li>
      <li>Removed the default values from SQLiteDataReader.GetTableSchema(), to better follow
        Sql Server's pattern and suppress schema errors when loading the records into a
        dataset/datatable.</li>
      <li>Allow integers to implicitly convert to double/decimal/single.</li></ul>
    <p><b>1.0.36.1 - October 25, 2006</b></p>
    <ul>
    <li>Added support for LONGVARCHAR, SMALLDATE and SMALLDATETIME.  These were actually added in 1.0.36.0 but were undocumented.</li>
    <li>Fixed the embedded helpfile which was accidentally built from old sources. </li>
    <li>Fixed an unfortunate re-entry of a bug in the .36 codebase that caused the provider to "forget" about commands on a connection under certain circumstances.</li>
    </ul>
    <p><b>1.0.36.0 - October 23, 2006</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.8, including support for full-text search via the FTS1
      extension.&nbsp;</li><li>Fixed a bug retrieving data types when UseUtf16Encoding is true.  Side-effect of further merging the common code between the two base classes.</li>
      <li>Fixed a bug with System.Transactions whereby a connection closed/disposed within
        a transaction scope is rolled back and cannot be committed.</li>
      <li>Added more error checking and reporting to transactions to help user's isolate
        the source of transaction failures.</li>
      <li>Implemented a workaround for a Compact Framework issue regarding strong-named
        assemblies containing a PE section with a raw size less than the virtual size.&nbsp;</li>
    </ul>
    <p><b>1.0.35.1 - September 12, 2006</b></p>
    <ul>
    <li>Fixed the TYPES keyword to work when UseUTF16Encoding is true.</li>
    <li>Fix another bug revealed in 1.0.35.0 regarding infinite loops when the 2nd or subsequent statements of a semi-colon separated command cannot be parsed.</li>
      <li>Updated the help documentation.&nbsp;</li>
    </ul>
    <p><b>1.0.35.0 - September 10, 2006</b></p>
    <ul>
    <li>Fixed an infinite loop bug in SQLiteCommand caused when multiple semi-colon separated
      statements in a single command are executed via datareader and one of the statements
      contains a syntax error preventing it from being prepared.&nbsp;</li><li>Added the TYPES preparser keyword to be placed before a SELECT statement to
    aid the wrapper in converting expressions in a subsequent select clause into more
    robust types.&nbsp; Documentation yet to be integrated, but available on the forums.</li>
      <li>Added a new connectionstring parameter "BinaryGUID=true/false" (default is "true").&nbsp;
        When true, guid types are stored in the database as binary blobs to save space.&nbsp;
        Binary has been the default format since 1.0.32.0 but this parameter eases backward
        compatibility.</li>
    </ul>
    <p><b>1.0.34.0 - September 4, 2006</b></p>
    <ul>
    <li>Fixed a bug in SQLiteParameterCollection.RemoveAt(namedparam)</li>
    <li>Fixed a bug in SQLiteDataReader introduced in 1.0.30 that broke DateTimes using the Ticks option in the connection string.</li>
      <li>Fixed a bug in the recent changes to guid behavior wherein using a datareader's
        indexer to fetch a guid from a column containing both binary and text guids would
        sometimes return a byte array instead of a guid.</li>
      <li>Enacted a workaround involving typed datasets in Compact Framework projects in
        which it took an excessive amount of time to open a form and generated a lot of
        temporary files in the user's Local Settings\Application Data\Microsoft\VisualStudio\8.0\Assembly
        References folder.</li>
    </ul>
    <p><b>1.0.33.0 - August 21, 2006</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.7</li>
      <li>Fixed a bug in SQLiteConnection that caused it to "forget" about commands bound
      to it and occasionally throw an error when a database is closed and opened repeatedly.&nbsp;
      </li>
    </ul>
    <p><b>1.0.32.0 - August 6, 2006</b></p>
    <ul>
    <li>Added AllowPartiallyTrustedCallers attribute to the assembly</li><li>Added the missing "nchar" type</li>
      <li>Added support for binary Guid's.&nbsp; Guids are now stored as binary by default
        when using parameterized queries.&nbsp; Text guids are still fully supported.</li>
      <li>Fixed a TransactionScope() error that caused the transaction not to be completed.</li>
      <li>Enhanced parameter names so that if they are added to the Parameters collection
        without their prefix character (@ : or $) they are still properly mapped.&nbsp;</li>
    </ul>
    <p><b>1.0.31.0 - July 16, 2006</b></p>
    <ul>
    <li>Re-applied the view parsing bugfix in 1.0.29.0 that was accidentally reverted
      out of the 30 build.</li><li>Fixed SQLiteCommand.ExecuteScalar() to return null instead of DbNull.Value
    when no rows were returned.</li>
      <li>Design-time installer now installs the package-based designer on full Visual Studio
        versions.&nbsp; Express editions continue to use the packageless designer.</li>
      <li>In Visual Studio (not Express), you can now right-click a SQLite connection in
        the Server Explorer and vacuum the database and change the encryption password.</li>
    </ul>
    <p><b>1.0.30.1 - July 2, 2006</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.6</li>
      <li>Added support for the |DataDirectory| keyword in the Data Source filename string.&nbsp;
      </li>
      <li>Added hook notification support to SQLiteConnection.&nbsp; Specifically, there
      are three new events on the SQLiteConnection object which are raised when an update/insert/delete
      occurs and when transactions are committed and rolled back.</li><li>Changed SQLiteTransaction to default to BEGIN IMMEDIATE instead of just BEGIN,
    which solves a multithreaded race condition.&nbsp;</li>
      <li>Changed SQLiteDataReader to better support SQLite's typelessness.&nbsp; The data
        reader no longer caches column affinity, but re-evaluates it for each column/row.</li>
      <li>Fixed a bug in Prepare() which caused an intermittant fault due to the code accessing
        the memory of an unpinned variable.&nbsp;</li>
      <li>Fixed a multithreaded lock-retry bug in in SQLiteConnection.Open() and in
    SQLiteTransaction, which failed to use a command timeout before giving up.</li>
    </ul>
    <p><b>1.0.29.0 - May 16, 2006</b></p>
    <ul>
    <li>Fixed a bug in the Views schema information which caused multi-line view definition statements not to be parsed</li>
    <li>Fixed a parsing bug in SQLiteDataReader.GetSchemaTable() to account for numeric(x,y) datatypes with specified precision and scale</li>
    <li>Fixed a bug in SQLiteConnection.Open() which tried to automatically enlist in an ambient transaction but had not yet set the state of the database to Opened, thereby causing a transaction fault</li>
    <li>Changed SQLiteException to inherit from DbException on the full framework</li>
    </ul>
    <p><b>1.0.28.0 - April 14, 2006</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.5</li>
      <li>You can now specify a relative path in the Compact Framework's "Data Source" by
        prefixing the file with ".\".&nbsp; i.e. "Data Source=.\\mydb.db3"</li>
      <li>Several more changes and enhancements to schemas for better compatibility.</li>
      <li>Fixed several bugs with the 64-bit builds of the provider.&nbsp; The x64 binary
        is now optimized.</li>
      <li>Design-time installer now tries to install the 64-bit builds into the GAC along
        with the 32-bit build.</li>
      <li>Fixed a bug in the SQLiteDataReader.GetSchemaTable() function when used with tables
        containing apostrophes.</li>
      <li>Fixed an XSD-related bug whereby the XSD utility was unable to locate the provider
        and could not generate typed datasets.</li>
      <li>Added NTEXT and STRING datatypes to the list of recognized keywords (used for
        schema retrieval).</li>
      <li>Due to the XSD bug and other potential problems related to external build utilities,
        changes to the installation of the designer have had to be made.&nbsp; The installer
        used to write the DbProviderFactories XML into the devenv.exe.config file and its
        express cousins, but now has to write instead to the machine.config.</li>
      <li>Installer writes to both the 32-bit machine.config and the 64-bit machine.config
        if it exists.&nbsp;</li>
    </ul>
    <p><b>1.0.27.1 - February 28, 2006</b></p>
    <ul>
    <li>Fixed a bug when doing data binding in Compact Framework projects that prevented
      you from assigning a typed dataset to a bindingsource.&nbsp; It turns out, the CF
      version of the SQLite provider needs to be flagged as retargetable so it'll work
      in the design-time desktop environment.&nbsp; No changes were made to the desktop
      build, but the revision was bumped on all libraries anyway in order to keep them
      sync'd.&nbsp;</li></ul>
    <p><b>1.0.27.0 - February 27, 2006</b></p>
    <ul>
    <li>Many optimizations and a few more minor adjustments to schemas and schema retrieval
      performance.</li>
      <li>Lots of design-time attributes added to the code.&nbsp; The DbDataAdapter, DbCommand,
        and DbConnection objects now have greatly enhanced design-time capabilities when
        added to the toolbox and dropped on a form.</li>
      <li>Lots of Server Explorer enhancements.</li>
      <li>Binaries are now distributed in a setup program for easier administration and
        configuration of the provider.</li>
    </ul>
    <p><b>1.0.26.2 - February 15, 2006</b></p>
    <ul>
    <li>Yet another bugfix to index schemas, which was incorrectly marking most indexes
      as primary key indexes.</li><li>Fixed GetSchema() to accept a null string array.</li><li>Fixed a misspelled export in the core C library that prevented databases opened
    with UTF16Encoding from getting schema information and would likely cause an error
    if attempted.</li></ul>
    <p><b>1.0.26.1 - February 14, 2006</b></p>
    <ul>
    <li>Fixed even more minor schema bugs having to do with indexes.</li><li>Added two missing pieces in the SQLite designer which were preventing it from
    being used from within VS Express editions.&nbsp;</li><li>Several bugfixes to the design-time installer program, including supporting
    64-bit environments.</li></ul>
    <p><b>1.0.26.0 - February 11, 2006</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.4</li><li>Fixed an encryption bug when changing the password of databases over 1gb in
      size.&nbsp;</li><li>Fixed various designer issues related to construction of named parameters.</li>
      <li>Retooled the GetSchema() method of SQLiteDataReader to use the new 3.3.4 API functions,
        and made several enhancements and fixes to schemas.&nbsp;</li>
      <li>Implemented the SourceColumnNullMapping property of SQLiteParameter to fix
    a DbCommandBuilder code generation bug.&nbsp;</li><li>Removed the runtime dependency on MSVCR80.DLL.&nbsp; File size is somewhat
    larger for the varying desktop versions.</li><li>Created an install program to manage installation and uninstallation of the
    SQLite design-time support.</li>
      <li>Designer support now works for all Visual Studio editions, including all Express
        Editions.</li>
      <li>Design-time installer will now remove (if present) the machine.config SQLite entries
        in favor of installing the xml code into the devenv.exe.config file (or any of the
        variations for express editions).&nbsp; The officially-accepted behavior of using
        DbProviderFactories is to add the code to your app.config file, and the machine.config
        file should not be touched.</li>
    </ul>
    <p><b>1.0.25.0 - January 31, 2006</b></p>
    <ul>
    <li>Code merge with SQLite 3.3.3</li><li>Added automatic distributed transaction enlistment and implemented the DbConnection.EnlistTransaction
    method for manual enlistment.</li>
      <li>Nested transactions are now supported.</li>
      <li>Rearranged the timing of SetPassword(), which now must be called before the database
        is opened instead of afterwards.&nbsp; Optionally, the password can be supplied
        in the ConnectionString.</li>
      <li>Fixed a bug in SQLiteFunction that caused a failure when an empty resultset was
        returned and a custom user aggregate function was used in the query.</li>
      <li>The designer has had another round of cleanup applied, in preparation for moving
        to a VS package.</li>
      <li>Added SQLiteMetaDataCollectionNames class.</li>
    </ul>
    <p><b>1.0.24.6 beta - January 23, 2006</b></p>
    <ul>
    <li>This beta is built from sqlite.org's 3.3.2 beta.</li><li>Eliminated the static linking of mscoree from all binaries.&nbsp; Native projects
      can now use the library without any dependencies on the .NET framework, while managed
      projects continue to be able to use the library normally.</li></ul>
    <p><b>1.0.24.5 beta - January 20, 2006</b></p>
    <ul>
    <li>This beta is built from sqlite.org's 3.3.1 alpha and contains development-in-progress code.&nbsp; Therefore no guarantees
      can be made regarding its suitability for production use.</li>
    <li><strong>You no longer need to distribute 2 files on the CompactFramework.&nbsp;
      You can delete SQLite.Interop.DLL entirely.&nbsp; </strong>I wrote a custom tool
      called "mergebin" (available in the source zip file) which combines the two libraries
      and gets around a glaring defect in the VS2005 linker for ARM processors which doesn't
      allow you to link netmodules.</li>
      <li><strong>x64 and ia64 builds now use the same strong name as the x86 build.</strong>&nbsp;
        This means breaking backward compatibility, but it was necessary in order to allow
        you to drop any of those 3 builds onto a PC and have your .NET program run properly.&nbsp;
        Prior to this, you'd get an error if you built your program using the x86 build,
        and then installed the x64 version on a target machine and tried to run your program
        against it.</li>
      <li>The entire source project has been gone over top to bottom.&nbsp; A debug build
        no longer combines the binaries into a single module, which was preventing proper
        debugging.</li></ul>
    <p><b>1.0.24.4 beta - January 16, 2006</b></p>
    <ul>
    <li>This beta is built from sqlite.org's 3.3.1 alpha and contains development-in-progress code.&nbsp; Therefore no guarantees
      can be made regarding its suitability for production use.</li>
    <li>Fixed a bug in the UTF-16 handling code for preparing statements due to a behavioral
      change in SQLite 3.3.0.</li>
      <li>Added pager.c code necessary to cleanup after an encrypted file is closed.</li>
      <li>Fixed an encryption bug that caused a fault when an encrypted file was rolled
        back.</li>
      <li>Modified the testcase code to take advantage of optimizations regarding the use
        of a DbCommandBuilder.&nbsp; DataAdapter insert speed increased dramatically as
        a result.</li>
    </ul>
    <p><b>1.0.24.3 beta - January 10, 2006</b></p>
    <ul>
    <li>This beta is built from sqlite.org's 3.3.0 alpha and contains development-in-progress code.&nbsp; Therefore no guarantees
      can be made regarding its suitability for production use.</li><li>Added support for database encryption at the pager level.&nbsp; Databases
    are encrypted using a 128-bit RC4 stream algorithm.&nbsp; To open an existing encrypted
    database, you may now specify a "Password={password}" text in the ConnectionString,
    or you may call the SQLiteConnection.SetPassword() function to set the password
    on an open connection. &nbsp;To encrypt existing non-encrypted databases or to change
    the password on an encrypted database, you must use the SQLiteConnection.ChangePassword()
    function.&nbsp; If you use SetPassword() instead of specifying a password in the
    connection string, or call ChangePassword() you may use a binary byte array or a
    text string as the password.</li>
      <li>Rewrote the locking implementation for the Compact Framework.&nbsp; It is now
        more robust and incorporates into the SQLite codebase more efficiently than the
        previous CE adaptation.</li>
      <li>Moved some of the embedded schema XML data into a resource file to ease code readability.</li>
      <li>Automated the fixup of the original sqlite codebase's source prior to compiling,
        to ease merging with sqlite.org's source.</li>
      <li>Fixed a memory leak in SQLiteCommand due to it not removing an internal reference
        to itself in SQLiteConnection.&nbsp; </li>
    </ul>
    <p><b>1.0.24.2 - December 30, 2005</b></p>
    <ul>
    <li>Fixed the SQLiteDataReader.HasRows property to return the proper value.</li>
      <li>Implemented the inadvertently neglected RecordsAffected property on SQLiteDataReader.
      </li>
      <li>SQLiteFunction static constructor was changed to pre-filter classes with only the
        SQLiteFunctionAttribute.&nbsp; The code was throwing an exception when certain
        assemblies were referenced in a project. </li>
      <li>Fixed the SQLiteDataAdapter OnRowUpdated event, which was using the wrong variable
        to find the attached event handler and subsequently not raising the event.</li>
      <li>Small optimizations and fixes to SQLiteDataReader.NextResult().&nbsp;</li>
    </ul>
    <p><b>1.0.24.1 - December 19, 2005</b></p>
    <ul>
    <li>Update core SQLite engine to 3.2.8&nbsp;</li></ul>
    <p><b>1.0.24 - December 9, 2005</b></p>
    <ul>
    <li>Fixed the<em> Catalogs</em> schema bug that caused attached databases not to be re-attached to a cloned connection
    </li>
      <li>Enhanced transactions to allow for a deferred or immediate writelock. &nbsp;SQLiteConnection.BeginTransaction()
        now has an additional overload to support it&nbsp;</li><li>Commands are now prepared as they are executed instead of beforehand.&nbsp; This
      fixes a bug whereby a multi-statement command that alters the database and subsequently
      references the altered data would fail during Prepare().</li><li>Tightened up the SQLiteDataReader to prevent reading columns before calling
    the first Read() and to prevent reading columns after the last Read().</li>
      <li>A more descriptive error is thrown if there aren't enough parameters in the command
        to satisfy the parameters required by the statement(s).&nbsp;</li>
    </ul>
    <p><b>1.0.23 - November 21, 2005</b></p>
    <ul>
    <li>Named parameters may now begin with <strong>@</strong> to ease portability of
      the provider. SQLite's named parameters are ordinarily prefixed with a <strong>: </strong>
      or<strong> $</strong>.&nbsp; The designer will still use the <strong>$</strong>
      prefix however, since its more compatible with the default SQLite engine.</li><li>Added several alternate ISO8601 date/time formats to SQLiteConvert.cs to increase
    compatibility.</li>
      <li>Relaxed coersion restrictions to work better with SQLite's inherent typelessness.&nbsp;</li>
    </ul>
    <p><b>1.0.22 - November 11, 2005</b></p>
    <ul>
    <li>Fixed some globalization issues which resulted in incorrect case-insensitive comparisons</li>
      <li>Fixed a bug in the routine that finds all user-defined functions in a loaded assembly.&nbsp;
        It would throw an exception if any of the types in the assembly could not be loaded.&nbsp;
        The exception is now caught and handled appropriately.</li>
    </ul>
    <p><b>1.0.21 - November 4, 2005</b></p>
    <UL>
      <li>Fixed a designer bug when creating typed datasets with parameterized queries.</li>
      <li>The above fix then exposed another bug in the datareader's ability to query schema
        information on parameterized commands, which was also fixed.</li>
      <li>Compiled against the RTM version of VS2005.</li>
      <li>Rewrote the design-time install script to use the XML DOM objects when writing
        to the machine.config and to automatically register the DLL in the GAC.</li><li>Made changes to the app.config descriptions and help file to improve version-independent
        factory support.</li></UL>
    <p><b>1.0.20 - October 19, 2005</b></p>
    <UL>
      <li>
        Fixed a shortcut in SQLiteBase.GetValue which was insufficient for 
        international environments.&nbsp; The shortcut was removed and the "proper" 
        procedure put in.</li></UL>
    <p><b>1.0.19 - October 5, 2005</b></p>
    <UL>
      <li>
      Code merge with SQLite 3.2.7
      <LI>
      Fixed bugs in the CE port code (os_wince.c)&nbsp;which were brought to 
      light&nbsp;by&nbsp;recent changes in the SQLite engine.
      <LI>
        Recompiled and modified to be compatible with the September VS2005 Release 
        Candidate.<br>
        Beta 2 users should continue to use 1.0.18.1</LI></UL>
    <p><b>1.0.18.1 - September 19, 2005</b></p>
    <UL>
      <li>
        Code merge with SQLite 3.2.6</li></UL>
    <p><b>1.0.18 - September 1, 2005</b></p>
    <UL>
      <li>
        Added type-specific method calls when using the various SQLite classes that 
        would've normally returned a a generic Db base class, which aligns the code 
        better with the Microsoft-supplied data providers.</li></UL>
    <p><b>1.0.17 - August 26, 2005</b></p>
    <ul>
      <li>
      Code merge with SQLite 3.2.5
      <li>
      Added Itanium and x64 build settings to the project (needs testing)
      <li>
      Bugfixes and enhancements to several schema types
      <li>
      Additional design-time support to include index and foreign key 
      enumerations.&nbsp; Requires re-registering the designer using 
      INSTALL.CMD.&nbsp; The new designer code now allows the VS query designer and 
      typed datasets to automatically link up foreign keys, use indexes, and 
      automatically generate relationships from the schema.<li>
        Additional static methods on SQLiteConnection to create a database file, 
        encrypt a file using the Encrypted File System (EFS) on NTFS (requires NT 2K or 
        above) and NTFS file compression</li>
    </ul>
    <p><b>1.0.16 - August 24, 2005</b></p>
    <ul>
      <li>
      Code merge with SQLite 3.2.4 with the large delete bugfix in CVS (which will 
      become 3.2.5 soon)
      <li>
        Added new GetSchema() types: IndexColumns, ViewColumns, ForeignKeys</li>
    </ul>
    <p><b>1.0.15 - August 22, 2005</b><br>
    </p>
    <ul>
      <li>
      Code merge with SQLite 3.2.3
      <LI>
        Minor updates for better design-time experience. More design-time code to 
        follow in subsequent releases.</LI>
    </ul>
    <p><b>1.0.14 - August 16, 2005</b><br>
    </p>
    <ul>
      <li>
      Fixed a bug in the SQLiteDataAdapter due to insufficient implementation of the 
      class.&nbsp; The RowUpdating and RowUpdated events are now properly 
      implemented, but unfortunately inserting and updating data in a DataTable or 
      DataSet is now much slower.&nbsp; This is the proper design however, so the 
      changes are here to stay.
      <LI>
      Lots of schema changes to support Visual Studio's Data Designer architecture.<li>Added 
        Designer support for the provider.&nbsp; It's not 100%, but you can design 
        queries, add typed datasets and perform quite a number of tasks all within 
        Visual Studio now.</li></ul>
    <P><B>1.0.13 - August 8, 2005</B><BR>
    </P>
    <DIV>
      <UL>
        <LI>
        Fixed a named parameter bug in the base SQLite_UTF16 class, which of course 
        only showed up when a database connection was opened using the 
        UseUTF16Encoding=True parameter.
        <LI>
          Fixed a performance issue in SQLite_UTF16 involving string marshaling.</LI></UL>
    </DIV>
    <P><B>1.0.12 - August 5, 2005</B><BR>
    </P>
    <DIV>
      <UL>
        <LI>
          Full support for the Compact Framework.&nbsp; Each build (Debug/Release) now 
          has a&nbsp;platform, either Win32 or Compact Framework.&nbsp; The correct 
          projects are built accordingly.&nbsp; See the&nbsp;<A href="#redist">Distributing 
            SQLite</A>
        section for information on what files need to be distributed for each 
        platform.&nbsp;
        <LI>
        Modified SQLite3.Reset() and Step() functions to transparently handle timeouts 
        while waiting on the database to become available (typically when a writer is 
        waiting on a reader to finish, or a reader is waiting on a writer to finish).
        <LI>
        Lots of code cleanup&nbsp;as suggested&nbsp;by the Code Analyzer (FxCop).
        <LI>
        Lots of updates to the helpfile (as you can see).
        <LI>
          Statements&nbsp;were already prepared lazily&nbsp;in a SQLiteCommand, but now 
          its even more lazy.&nbsp; Statements are now only prepared if the statements 
          haven't been previously prepared and a Prepare() function is called (and the 
          command is associated with a connection) or just prior to the command being 
          executed.&nbsp;</LI></UL>
    </DIV>
    <P><B>1.0.11 - August 1, 2005</B><BR>
    </P>
    <UL>
      <LI>
        <STRONG>For everything except the Compact Framework, System.Data.SQLite.DLL is 
          now the <EM>only</EM> DLL required to use this provider!</STRONG>&nbsp; The 
      assembly is now a multi-module assembly, containing both the native SQLite3 
      codebase and the C# classes built on top of it.&nbsp; The Compact Framework 
      version (when completed) will not be able to support this feature, so backwards 
      compatibility with the Compact Framework has been preserved for the future.
      <LI>
        Fixed a bug in SQLiteCommand.ExecuteScalar() that caused it to stop executing 
        commands once it obtained the first column of the first row-returning 
        resultset.&nbsp; Any remaining statements after the row-returning statement was 
        ignored.
      </LI>
    </UL>
    <P><B>1.0.10 - June 10, 2005</B><BR>
    </P>
    <UL>
      <LI>
      Fixed a bug in the SQLite3.cs Prepare() function that created a statement even 
      when the SQLite engine returned a NULL pointer. Typically this occurs when 
      multiple statements are processed and there are trailing comments at the end of 
      the statement.
      <LI>
        Fixed a bug in SQLiteStatement.cs that retrieved parameter names for a 
        parameterized query.&nbsp; SQLite's parameters are 1-based, and the function 
        was starting at 0.&nbsp; This was fine when all parameters were unnamed, but 
        for named parameters it caused the parameters to be out of whack.
      </LI>
    </UL>
    <P><B>1.0.09a - May 25, 2005</B><BR>
    </P>
    <UL>
      <LI>
      Fixed a broken helpfile and corrected some obsolete help remarks in 
      SQLiteFunction.cs
      <LI>
        Added a version resource to the SQLite.Interop.DLL.&nbsp;</LI></UL>
    <P><B>1.0.09 - May 24, 2005</B><BR>
    </P>
    <UL>
      <LI>
      Code merge with the latest 3.21 version of SQLite.
      <LI>
        Removed obsolete methods and properties for Whidbey Beta 2</LI></UL>
    <P><B>1.0.08 Refresh - Mar 24, 2005<BR>
      </B>
    </P>
    <UL>
      <LI>
      Code merge with the latest 3.20 version of SQLite.
      <LI>
        Recompiled the help file to fix a build error in it.
      </LI>
    </UL>
    <P><B>1.0.08 - Mar 11, 2005<BR>
      </B>
    </P>
    <UL>
      <LI>
      Added additional #if statements to support the old beta 1 edition of VS2005.
      <LI>
        Code merged the SQLite 3.14 source.
      </LI>
    </UL>
    <P><B>1.0.07 - Mar 5, 2005</B><BR>
    </P>
    <UL>
      <LI>
      Made more optimizations to frequently-called functions, resulting in 
      significant performance gains in all tests.
      <LI>
        Recompiled the binaries using the latest VS2005 February CTP, resulting in yet 
        more significant speed gains.&nbsp; The 100k insert test used to take 3.5 
        seconds and the insertwithidentity took almost 8 seconds.&nbsp; With the above 
        two changes, those tests are now executing in 1.9 and 4.9 seconds respectively.</LI></UL>
    <P><B>1.0.06 - Mar 1, 2005<BR>
      </B>
    </P>
    <UL>
      <LI>
      Speed-ups to SQLiteDataReader.&nbsp; It was interop'ing unnecessarily every 
      time it tried to fetch a field due to a logic error.
      <LI>
      Changed/Added some code to SQLiteConvert's internal DbType, Type and 
      TypeAffinity functions.
      <LI>
      Fixed the SQLiteDataReader to obey the flags set in the optional 
      CommandBehavior flag from SQLiteCommand.ExecuteReader().
      <LI>
      Changed the default page size to 1024 to reflect the defaults of SQLite.&nbsp; 
      Ignores the "Page Size" connection string option for memory databases, as tests 
      revealed that changing it resulted in memory corruption errors.
      <LI>
        Performance enhancements to the SQLiteCommand and SQLiteStatement classes which 
        reduced the 100,000 row insert execution time as well as the various Function 
        execution times significantly.
      </LI>
    </UL>
    <P><B>1.0.05 - Feb 25, 2005</B>
    </P>
    <UL>
      <LI>
      Fixed the SQLite3 C# class step/reset functions to accomodate schema changes 
      that invalidate a prepared statement.&nbsp; Statements are recompiled 
      transparently.
      <LI>
      Moved all native DLL declarations to an UnsafeNativeMethods class.
      <LI>
      Split several classes into their own modules for readability.
      <LI>
      Renamed many internal variables, reviewed access to variables marked as 
      internal and altered their protection levels accordingly.
      <LI>
      Due to the presence of the altered sqlite3 codebase and so many added interop 
      functions, I decided to rename the sqlite3 C project and the DLL to 
      SQLite.Interop.DLL.&nbsp; This is the same core sqlite3 codebase but designed 
      specifically for this ADO.NET provider.&nbsp; This eliminates any possibility 
      of someone dropping another build of sqlite3.dll into the system and rendering 
      the provider inoperable.&nbsp; In the future if the folks at sqlite.org finally 
      introduce a method of retrieving column usage for an arbitrary prepared 
      statement, I'll retool this library to be a lightweight function call wrapper 
      around the core binary distribution.
      <LI>
      Added [SuppressUnmanagedCodeSecurity] attribute to the UnsafeNativeMethods 
      class which brings VS2005 November CTP execution speeds inline with the 
      December CTP.
      <LI>
        Added a <B>bin</B>
      directory to the project root where pre-compiled binaries can be found.
      <LI>
        Added a <B>doc</B>
      directory where preliminary documentation on the class library can be found.
      <LI>
        Documented a lot more of the classes internally.
      </LI>
    </UL>
    <P><B>1.0.04 - Feb 24, 2005</B>
    </P>
    <UL>
      <LI>
      Removed the SQLiteContext class and revamped the way UserFunctions work to 
      simplify the imlementation.
      <LI>
      Fixed a counting bug in the TestCases class, specifically in the function tests 
      where I wasn't resetting the counter and it was consequently reporting 
      intrinsic and raw select calls as being much much faster than they actually 
      were.&nbsp; The numbers are now much closer to what I expected for performance, 
      with .NET user-functions still being the slowest, but only by a small margin.
      <LI>
      Small performance tweaks to SQLiteDataReader.
      <LI>
      Added PageSize to the SQLiteConnectionStringBuilder and subsequently to the 
      SQLiteConnection
      <LI>
        Added a PRAGMA encoding=XXX execution statement to the SQLiteConnection after 
        opening a connection.
      </LI>
    </UL>
    <P><B>1.0.03 - Feb 23, 2005</B>
    </P>
    <UL>
      <LI>
      Fixed up SQLiteCommandBuilder to correct implementation errors, which resulted 
      in an enormous performance boost in the InsertMany test.&nbsp;&nbsp; 10,000 row 
      insert that executed in 1500ms now executes in 500ms.
      <LI>
      Fixed several errors in the SQLite3_UTF16 class.&nbsp; ToString() was working 
      incorrectly and the Open() method failed to register user defined functions and 
      collations.
      <LI>
      Fixed a bug in SQLiteCommand.ClearCommands() whereby only the first statement 
      was being properly cleaned up.
      <LI>
      Fixed a bug in SQLiteDataReader whereby calling NextResult() would not properly 
      reset the previously-executed command in the sequence.
      <LI>
        Added an InsertManyWithIdentityFetch test, which appends a select clause to 
        populate the ID of the last inserted row into the InsertCommand, demonstrating 
        ADO.NET's ability to auto-fetch identity columns on insert.
      </LI>
    </UL>
    <P><B>1.0.02 - Feb 21, 2005</B></P>
    <UL>
      <LI>
      Tweaks to the xxx_interop functions that return char *'s, so they also return 
      the length.&nbsp; Saves an interop call to get the UTF-8 string length during 
      conversion to a .NET string.
      <LI>
      Reworked the whole interop.c thing into interop.h and reduced the code required 
      to merge the main sqlite3 codebase.
      <LI>
        Added support for user-defined collations.
      </LI>
    </UL>
  </body>
</html>