SQLite DB Engine Best techniques for SQLite COM usage

As you may have already noticed the SQLite COM can be configured to act in different ways. For instance the AutoType and the TypeInfoLevel properties together with the numeric types list allow you to configure it to do some conversions automatically, to return column type information in different with the results of query(ies) execution. However these operations require additional system resources and while this consideration is not important when the database and the results extracted from it are small it may be of importance when huge amount of data is fetched. Thus the object defaults are set to minimize the resources needed and still provide most of the functionality

In simple applications written manually where a few simple pages or a simple script is written for a few minutes to test something or transfer something for example you may not need type information nor automatic type conversions based on the column types. In such case it may been enough just to interact with the database and receive all the columns as strings. In contrast in a more complex application which you plan to distribute you must be sure any numbers, dates and other types are retrieved as values of appropriate type. See SQLite types for examples on how the things may go wrong when  the locale settings on certain machines require "," to be used for decimals separator. 

Depending on what you are going to do you should pay attention to the properties mentioned above and to the numeric types list. It is recommended to make the object configuration adjustments immediately after creating it. For example:

Set db = Server.CreateObject("newObjects.sqlite.dbutf8")
db.AutoType = True
db.TypeInfoLevel = 4

Is the most recommended configuration for applications that will target other users on machines with configurations you know little about..Also you should check the numeric types list to see if it contains all the types you want to treat as numeric values, but the defaults should be ok in the most cases and especially if you are designing the application from the beginning.

So if you want to have the full functionality turned on the 3 lines above should be the first thing you do. In ASP applications it may be convenient to create the SQLite COM object in the global.asa file and use it from the pages. This will save you the need to include a file or insert database connection code in each page. However note that this may be inappropriate for some applications (especially under IIS) if you want to be able to close the DB when it is not used. A sample global.asa file may look like this:

<OBJECT RUNAT=SERVER ID="db" PROGID="newObjects.sqlite.dbutf8" SCOPE="Application"></OBJECT>
<OBJECT RUNAT=SERVER ID="su" PROGID="newObjects.utilctls.StringUtilities" SCOPE="Application"></OBJECT>
Sub Session_OnStart
 ' Nothing important here - put session init code if you need such
End Sub
Sub Application_OnStart
  ' Configure the database for convenient usage in the application
  db.AutoType = True
  db.TypeInfoLevel = 4
  ' Open the application's database
  db.Open Server.MapPath("/db/mydb.db")
End Sub

This way in any ASP page in the application you will be able to refer to the db variable without need to create the object or open the database - this is already done when the application has been started. As the database is closed when the object is disposed there is no need to handle the Application_OnEnd event - the database will automatically close when the application is unloaded.

Note the other object created in the global.asa. Its ID is su (short for StringUtilities). When working with SQLite COM you will need it frequently. It is strongly recommended when you create queries (see SQLite types for some additional samples). In general you will need the Sprintf SAprintf and the SCprintf methods from the StringUtilities object to format the queries in a single line of code. For example:

Set r = db.Execute(su.Sprintf("INSERT INTO SomeTable (Field1,Field2,Field3) VALUES (%d,%q,%a)",v1,v2,v3)

Will generate an insert query where the variables are formatted automatically as specified - v1 as integer, v2 as string enclosed in quotes and any internal quotes escaped, v3 automatically.

This way you have safe query string that can be executed over the database. Note that the StringUtilities support customization and many advanced features. For example the auto formatting may be adjusted to apply the formats in certain order (try integer, try date then try text etc. for example). Also the SCprintf method allows you to extract the arguments from a collection by name which may prove extremely convenient when creating a query over the results from another:

Set r = db.Execute(su.Sprintf("SELECT * FROM Table1 WHERE ID=%d",curID))
Set r2 = db.Execute(su.SCprintf("INSERT INTO Table2 (F1,F2) VALUES (%[name]q,%[family]q);",r(1))

In the above we create a record in another table filled with some fields (name and family) from the results of another query.

With SQLite COM the enumeration of the result is like enumerating/indexing a collection. Instead of using a recordset and While .. Wend cycle for example you use For ... Next cycle to access the rows (see Execute for examples). To restrict the result you use the optional Execute parameters and you can create paged results with very little effort. As the SQL language is designed initially for direct usage (from an SQL console for example) this technique requires much less code than the recordset oriented database interfaces. It has certain limitations (for instance it is not convenient for binary data blocks stored in the database), but for the most of the database related activities it is simpler to understand and simpler to implement.

While Sprintf and the other similar methods have been proposed as helpers for query generation they can be used also to format user readable output as well. Very often the locale settings are inconvenient. For instance the date formats for many countries are real trouble even in such products like Microsoft Office (what you get printed out is not accepted back - parsed correctly). The StringUtilities object allows you configure the formatting as you want in spite of the locale settings. If you want to deal with this on your own and avoid the OS supplied routines (for example FormatDateTime in VBScript uses the locale information and this is so for all the formatting functions in it) you can create a separate instance of it and configure it to meet your needs.


newObjects Copyright 2001-2006 newObjects [ ]