merge -r 58060:58217
[mono.git] / web / postgresql
index 9c857baa15ea6ba9425ebf5f7638c788363f34bd..90c3f4f600919ed27de349cb8aaf62154bf9841c 100644 (file)
-* Status of the PostgreSQL ADO.NET Provider\r
-\r
-       <p> Still exists in System.Data.SqlClient and needs to be moved to Mono.Data.PostgreSQL.\r
-\r
-       <p>What follows below is Status information for the PostgreSQL ADO.NET provider.
-               
-       <p>We are able to do simple CREATE TABLE, DROP TABLE, UPDATE, INSERT, and
-       DELETE SQL commands using the ExecuteNonQuery method in SqlCommand.  
-       
-       <p>We can execute multiple queries and do a NextResult() in SqlDataReader()
-       to get the next result set.  
-       
-       <p>We are also able to do simple aggregate functions, 
-       ie, count(), sum(), min(), and max() 
-       in a simple SELECT SQL query using the ExecuteScalar() now.  
-       
-       <p>We are also able to retrieve data with a simple SELECT SQL query 
-       using ExecuteReader() which returns a SqlDataReader.  We are able to
-       use GetSchemaTable() to get the meta data about the table columns.  
-       We are able     to Read() to get each row from the result set.  
-       
-       <p>Here is a sample of code that is based on PostgresTest.cs and
-       TestSqlDataReader.cs tests:
-<pre>
- static void SelectData (IDbConnection cnc) {
-       
-       IDbCommand selectCommand = cnc.CreateCommand();
-       IDataReader reader;
-
-       selectCommand.CommandType = CommandType.Text;
-       selectCommand.CommandText = 
-               "select * from pg_user;" + \r
-               "select * from pg_tables;" + \r
-               "select * from pg_database";\r
+* PostgreSQL and Mono
 
-       reader = selectCommand.ExecuteReader ();
+  When it comes to Mono and PostgreSQL, there are many ways
+  you can access your data.
 
-       do {\r
-               // get the DataTable that holds\r
-               // the schema\r
-               DataTable dt = rdr.GetSchemaTable();\r
-\r
-               if(rdr.RecordsAffected != -1) {\r
-                       // Results for \r
-                       // SQL INSERT, UPDATE, DELETE Commands \r
-                       // have RecordsAffected >= 0\r
-                       Console.WriteLine("Result is from a SQL Command (INSERT,UPDATE,DELETE).  Records Affected: " + rdr.RecordsAffected);\r
-               }\r
-               else if (dt == null)\r
-                               Console.WriteLine("Result is from a SQL Command not (INSERT,UPDATE,DELETE).   Records Affected: " + rdr.RecordsAffected);\r
-               else {\r
-                       // Results for\r
-                       // SQL not INSERT, UPDATE, nor DELETE\r
-                       // have RecordsAffected = -1\r
-                       Console.WriteLine("Result is from a SQL SELECT Query.  Records Affected: " + rdr.RecordsAffected);\r
-               \r
-                       // Results for a SQL Command (CREATE TABLE, SET, etc)\r
-                       // will have a null reference returned from GetSchemaTable()\r
-                       // \r
-                       // Results for a SQL SELECT Query\r
-                       // will have a DataTable returned from GetSchemaTable()\r
-\r
-                       results++;\r
-                       Console.WriteLine("Result Set " + results + "...");\r
-                                               \r
-                       // number of columns in the table\r
-                       Console.WriteLine("   Total Columns: " +\r
-                               dt.Columns.Count);\r
-\r
-                       // display the schema\r
-                       foreach (DataRow schemaRow in dt.Rows) {\r
-                               foreach (DataColumn schemaCol in dt.Columns)\r
-                                       Console.WriteLine(schemaCol.ColumnName + \r
-                                               " = " + \r
-                                               schemaRow[schemaCol]);\r
-                               Console.WriteLine();\r
-                       }\r
-\r
-                       int nRows = 0;\r
-                       string output, metadataValue, dataValue;\r
-                       // Read and display the rows\r
-                       Console.WriteLine("Gonna do a Read() now...");\r
-                       while(rdr.Read()) {\r
-                               Console.WriteLine("   Row " + nRows + ": ");\r
-                                       \r
-                               for(c = 0; c < rdr.FieldCount; c++) {\r
-                                       // column meta data \r
-                                       DataRow dr = dt.Rows[c];\r
-                                       metadataValue = \r
-                                               "    Col " + \r
-                                               c + ": " + \r
-                                               dr["ColumnName"];\r
-                                               \r
-                                       // column data\r
-                                       if(rdr.IsDBNull(c) == true)\r
-                                               dataValue = " is NULL";\r
-                                       else\r
-                                               dataValue = \r
-                                                       ": " + \r
-                                                       rdr.GetValue(c);\r
-                               \r
-                                       // display column meta data and data\r
-                                       output = metadataValue + dataValue;                                     \r
-                                       Console.WriteLine(output);\r
-                               }\r
-                               nRows++;\r
-                       }\r
-                       Console.WriteLine("   Total Rows: " + \r
-                               nRows);\r
-               }       \r
-       } while(rdr.NextResult());\r
-       Console.WriteLine("Total Result sets: " + results);\r
-                       \r
-       rdr.Close();\r
- }
+* Data Providers
 
-</pre>
-       
-       <p>We are able to get 
-       String data (char, character, text, varchar), Int16 (smallint),
-       Int32 (integer), Int64 (bigint), DateTime (time, date, timestamp),
-       Boolean (boolean), Single (float), and Double (double).
-       More data types will come later.  Note, the types that do work still 
-       need thorough testing.
-       
-       <p>Rows that are returned which contain columns that are NULL are handled now. 
-       The SqlDataReader method IsDBNull() needs to be called to determine 
-       if a field IS NULL before trying to read data from that field.
-       
-       <p>Calling PostgreSQL stored procedures works.  It does not work perfectly.  It may not
-       even work to specification - yet.  If you want to test it yourself, look at
-       TestSqlDataReader.cs or PostgresTest.cs in
-       mcs/class/System.Data/Test.  
-       
-       <p>Below, I have some sample code you can
-       use to call a PostgreSQL stored procedure named "version".  This stored
-       procedure returns a string containing the PostgreSQL server version.  Notice
-       the CommandType is StoredProcedure and the method ExecuteScalar() is called.
-       
-       <p>ExecuteScalar() is a lightweight method in class SqlCommand that only returns
-       one row and one column as one object - even if there is more than row or column.
-       
-<pre>
- static string GetDatabaseServerVersion (SqlConnection cnc) 
- {                      
-       SqlCommand cmd = cnc.CreateCommand ();
-       string data;
+ There are many ADO.NET data providers for <a href="http://www.postgresql.org/">PostgreSQL</a>:
+ There are two providers created specifically for PostgreSQL included with Mono:
 
-       cmd.CommandType = CommandType.StoredProcedure;
-       cmd.CommandText = "version";
-                                                       
-       data = (string) cmd.ExecuteScalar ();
+<ul>
 
-       return data;
- }
-</pre>
+       <li><a href="http://gborg.postgresql.org/project/npgsql/projdisplay.php">Npgsql</a>
+               <ul>
+                       <li>included with Mono</li>
+                       
+                       <li>a .NET Managed Data Provider for PostgreSQL</li>
+                       
+                       <li>Written in 100% C#</li>
+                       
+                       <li>does not require a client library</li>
+                       
+                       <li>works on Mono and Microsoft .NET</li>
+                       
+                       <li>created by Francisco Figueiredo jr. and has many developers working on it
+                       
+                       <li>works in the SQL# (command-line and GTK# GUI versions)</li>
                        
-       <p>We have the beginnings of Parameters support PostgreSQL.  Only
-       Input Parameters are currently supported.  Output, Input/Output,
-       and Return parameters still need to be done.
+                       <li>in namespace Npgsql and assembly Npgsql and is found in mcs
+                       at mcs/class/Npgsql</li>
+               </ul>
+       </li>
        
-       <p>A lot of functionality in System.Data is missing, but the 
-       infrastructure is starting to come together.
+       <li>Mono.Data.PostgreSqlClient (DEPRECATED)
+               <ul>
        
-       <p>A lot of Exceptions need to be thrown for various exceptions.  However,
-       SqlException, SqlErrorCollection, and SqlError have been partially
-       implemented.
+                       <li>Deprecated in favor of Npgsql.  No longer included in a release of Mono.</li>
+                       
+               </ul>
+       </li>
        
-       <p>Tim Coleman and Rodrigo Moya got the beginnings of the
-       SqlDataAdapter/DataSet/DataTable/DataRow to work.  Currently, 
-       the SqlDataAdapter can Fill() relational data into a DataTable in a DataSet.
-       See the test mcs/class/System.Data/Test/TestSqlDataAdapter.cs to see it in action.
-       Below, I show a snippets from the test:
+       <li><a href="http://sourceforge.net/projects/mysqlnet/">ByteFX.Data</a> has a provider for PostgreSQL too, but I do not know how well it works with Mono.</li>
        
-<pre>
- string connectionString;
- string sqlQuery;
- SqlDataAdapter adapter;
- DataSet dataSet = null;
+       <li>There is another .NET data provider for PostgreSQL named <a href="http://sourceforge.net/projects/pgsqlclient/">PgSqlClient</a>, but I do not know if it works with Mono.</li>
+       
+       <li>If none of the above providers meet your needs.  There is the ODBC and OLEDB providers included with Mono.</li>
+                       
+       <li>Bugs with Mono or the data provider should be reported 
+       in Mono's Bugzilla <a href="http://bugzilla.ximian.com/">here</a>.  If you
+       do not have Bugzilla user account, it is free 
+       and easy to 
+       create one <a href="http://bugzilla.ximian.com/createaccount.cgi">here</a>.</li>
 
- connectionString =
-       "host=localhost;" +
-       "dbname=test;" +
-       "user=postgres";
-                                               
- sqlQuery = "select * from pg_tables";
 
- adapter = new SqlDataAdapter (sqlQuery, 
-                       connectionString);
-                               
- dataSet = new DataSet ();
+</ul>
 
- adapter.Fill (dataSet);
-                       
- if (dataSet != null) {
-       foreach (DataRow row in dataSet.Tables["Table"].Rows)
-               Console.WriteLine("tablename: " + row["tablename"]);
- }
-</pre> 
+** Current Status
 
-* Testing the PostgreSQL ADO.NET Provider
+<ul>
+       <li>Npgsql
+               <ul>
+                       <li>Builds and Runs on both Microsoft .NET and Mono.</li>
+                       <li>Works using SQL# (command-line and GTK# versions)</li>
+                       <li>You can send insert, update, delete queries \r
+                               through NpgsqlCommand.ExecuteNonQuery() method.</li>\r
+                       <li>You can send queries like, select count(*) from table, select version()\r
+                               with NpgsqlCommand.ExecuteScalar() method.</li>\r
+                       <li>There is logging support. (Thanks Dave Page)\r
+                               To use it, place code like that in your program:</li>\r
+\r
+<pre>      \r
+      // Enable logging.\r
+         NpgsqlEventLog.Level = LogLevel.Debug;            // LogLevel.\r
+         NpgsqlEventLog.LogName = "NpgsqlTests.LogFile";   // LogFile.\r
+</pre>\r
+    \r
+                       <li>You can use Npgsql with Mono (Thanks Kristis Makris). It is not working perfectly.</li>\r
+                       <li>There is a winforms test suite (Thanks Dave Page).</li>\r
+                       <li>Clearer code in NpgsqlConnection removing *magic* numbers and constants. (Thanks Kristis Makris)</li>\r
+                       <li>Better support of ODBC-like ConnectionString in NpgsqlConnection (Thanks Dave Page)</li>\r
+                       <li>Thanks Ulrich Sprick for all discussion and ideas.</li>\r
+
+               </ul>
+       </li>
+</ul>
 
-       <p>In order to test System.Data.SqlClient, you will need to have
-       access to a remote PostgreSQL DBMS, or you will have to install 
-       one locally.  PostgreSQL is the DBMS used for the initial 
-       implementation of System.Data.SqlClient.
+** Action Plan
+       <ul>
+               <li>More testing and fixing bugs</li>
+               
+               <li>Better error handling</li>
                
-       <p>Why?  Because it is free software, has a client 
-       library that is easy to use, PostgreSQL is easy to install on
-       Unix and Windows (using the Cygwin install program), not difficult to setup after
-       installation, and it runs under: Linux, 
-       Windows (via cygwin and ipc-daemon), Unix, and
-       others.  This allowed us to create the
-       System.Data functionality in Mono much quicker.
+               <li>More Data Types to use</li>
                
-       <p>If you plan on using a remote PostgreSQL DBMS Server,
-       than you will need to have the PostgreSQL client software on your
-       local computer that includes libpq.so (pq.dll on Windows).
+               <li>Any features for Npgsql should be implemented in Npgsql's main cvs repository at
+               gborg.postgresql.org.  Most bugs should be fixed in gborg.postgresql.org's cvs.
+               Only bugs neccessary for building and running of Npgsql on Mono can be done in Mono cvs, 
+               but once applied they should be sent to Npgsql's mailing list
+               at gborg.postgresql.org for inclusion into cvs there.  Whenever there is 
+               a release of Npgsql (determined by Francisco Figueiredo jr. or a release
+               of Mono (determined by Miguel de Icaza), then the Npgsql source 
+               in gborg.postgresql.org's cvs will be used to update the Npgsql source in
+               Mono's cvs. 
+               </li>
        
-       <p>The System.Data tests use this connection string to connect
-       to the PostgreSQL database named "test" at host "localhost" as
-       user "postgres".
+               <li>Add any missing functionality to Npgsql. If this funtionality works on
+               .NET but not on Mono, implement the missing features or fix the bugs in Mono</li>
 
+               <li>Npgsql has been replaced Mono.Data.PostgreSqlClient as the provider of
+               choice to use.  Mono.Data.PostgreSqlClient is deprecated and is no longer included in
+               Mono releases.  Please use Npgsql for PostgreSQL data access.</li>
+               
+               <li>Implement new features of PostgreSQL.</li>
+       </ul>
+
+</ul>
+
+** Testing Npgsql
+
+<ul>
+       <li>Have a working mono and mcs</li>
+               
+       <li>Get <a href="http://gborg.postgresql.org/project/npgsql/projdisplay.php">Npgsql</a>
+       and make sure the binary assembly Npgsql.dll is installed in the same place that the
+       mono class libraries are located.
+       
+       <li>C# Example for Npgsql:
 <pre>
-"host=localhost;dbname=test;user=postgres"
+ using System;
+ using System.Data;
+ using Npgsql;
+ public class Test 
+ {
+    public static void Main(string[] args)
+    {
+       string connectionString = 
+          "Server=localhost;" +
+          "Database=test;" +
+          "User ID=postgres;" +
+          "Password=fun2db;";
+       IDbConnection dbcon;
+       dbcon = new NpgsqlConnection(connectionString);
+       dbcon.Open();
+       IDbCommand dbcmd = dbcon.CreateCommand();
+       // requires a table to be created named employee
+       // with columns firstname and lastname
+       // such as,
+       //        CREATE TABLE employee (
+       //           firstname varchar(32),
+       //           lastname varchar(32));
+       string sql = 
+           "SELECT firstname, lastname " +
+           "FROM employee";
+       dbcmd.CommandText = sql;
+       IDataReader reader = dbcmd.ExecuteReader();
+       while(reader.Read()) {
+            string FirstName = (string) reader["firstname"];
+            string LastName = (string) reader["lastname"];
+            Console.WriteLine("Name: " + 
+                 FirstName + " " + LastName);
+       }
+       // clean up
+       reader.Close();
+       reader = null;
+       dbcmd.Dispose();
+       dbcmd = null;
+       dbcon.Close();
+       dbcon = null;
+    }
+ }
 </pre>
-               
-       <p>Installation instructions for PostgreSQL DBMS:
+       </li>
+       <li>Building C# Example:
+       <ul>
+               <li>Save the example to a file, such as, TestExample.cs</li>
+<pre>
+       mcs TestExample.cs -r System.Data.dll \
+           -r Npgsql.dll
+</pre>
+       </ul>
+       </li>
+       <li>Running the Example:
+<pre>
+mono TestExample.exe
+</pre>
+</li>
+</ul>
 
-       <b>On Unix</b>
+               
+** Installation instructions for PostgreSQL DBMS:
+       <p><b>On Unix</b>
 
        <ul>
                * Read the PostgreSQL Installation Instructions 
                a linux user 'postgres' created and initdb ran.  Or maybe not.
 
 <pre>
- su\r
- adduser postgres\r
- mkdir /usr/local/pgsql/data\r
- chown postgres /usr/local/pgsql/data\r
- su - postgres\r
- initdb -D /usr/local/pgsql/data\r
- postmaster -i -D /usr/local/pgsql/data\r
- createdb test\r
+ su
+ adduser postgres
+ mkdir /usr/local/pgsql/data
+ chown postgres /usr/local/pgsql/data
+ su - postgres
+ initdb -D /usr/local/pgsql/data
+ postmaster -i -D /usr/local/pgsql/data
+ createdb test
  psql test
 </pre>
        
@@ -307,9 +269,15 @@ create user postgres with password 'fun2db';
                * <p>Important notes from this file are:
                  
                  <ul>
-                               <p><b>2.</b> - Install the latest <a href="http://www.neuro.gatech.edu/users/cwilson/cygutils/OBSOLETE/V1.1/cygipc/index.html">CygIPC</a> package.
+                               <p><b>2.</b> - Install the latest <a href="http://www.neuro.gatech.edu/users/cwilson/cygutils/cygipc/index.html">CygIPC</a> package.
+                               Cygwin includes a utility bunzip2 which can be used to unzip it.  Now, change to 
+                               the root directory by 
+                               typing "cd /" then 
+                               you can use "tar xvf cygipc.xxx.tar" to untar it 
+                               in the root directory in cygwin.
                                                  
-                               <p>The cygipc package contains the ipc-daemon you will need 
+                               <p>The cygipc package contains the support to run ipc-daemon 
+                               that you will need 
                                to run before you can
                                run the PostgreSQL DBMS Server daemon (postmaster) or run
                                initdb which initializes the PostgreSQL database.
@@ -366,10 +334,10 @@ net start ipc-daemon
                  
                        <p>
 <pre>
-mkdir /usr/local/pgsql/data\r
-initdb -D /usr/local/pgsql/data\r
-postmaster -D /usr/local/pgsql/data\r
-createdb test\r
+mkdir /usr/local/pgsql/data
+initdb -D /usr/local/pgsql/data
+postmaster -D /usr/local/pgsql/data
+createdb test
 psql test              
 </pre>
                  
@@ -394,223 +362,4 @@ create user postgres with password 'fun2db';
                        without having to change the database, userid, etc.
        </ul>
        
-       <p>In the path mcs/class/System.Data/Test
-       there is a PostgreSQL test program named
-       PostgreTest.cs.  Thanks goes to Gonzalo for creating the original
-       PostgreSQL test.
-       
-       <p>To use it to test System.Data, you
-       modify the file to your PostgreSQL database
-       connection requirements:
 
-       <p>
-       <ul>
-               <li><b>dbname</b> database, ie., test</li>
-               <li><b>host</b> hostname of the PostgreSQL DBMS Server to connect to, ie., localhost</li>
-               <li><b>user</b> username, ie., someuser</li>
-               <li><b>password</b> password, ie., mypass1234</li>
-       </ul>
-       
-       <p>The connection string is in OLE-DB connection string format.  Internally,
-       SqlConnection converts this to the PostgreSQL connection string format.
-       
-       <p>
-<pre>
-    OLE-DB: "host=localhost;dbname=test;user=joe;password=smoe"
-PostgreSQL: "host=localhost dbname=test user=joe password=smoe"
-</pre>
-
-       <p>
-       Note that OLE-DB includes the semicolons while PostgreSQL's connection
-       string does not.
-
-       <p>
-    To compile the PostgresTest.cs program, do:
-    
-    <p>
-<pre>
-mcs PostgresTest.cs -r System.Data.dll
-</pre>
-    
-    <p>
-    To run using mint, do:
-    
-    <p>
-<pre>
-mint PostgresTest.exe
-</pre>
-    
-    <p>
-    To run using mono, do:
-<pre>
-mono PostgresTest.exe
-</pre>
-    
-    <p>Below, I show how the output from PostgresTest.  I have omitted a lot
-    of the meta data for the columns except two columns.  The classes
-    used were from System.Data.SqlClient and were used to connect to a
-    PostgreSQL database and retrieve data.
-
-<p>
-<pre>   
-\r
-danmorg@DANPC ~/mono/mcs/class/System.Data/Test\r
-$ mcs PostgresTest.cs -r System.Data.dll\r
-\r
-danmorg@DANPC ~/mono/mcs/class/System.Data/Test\r
-$ mono PostgresTest.exe\r
-        Postgres provider specific tests...\r
-\r
-                Drop table:\r
-Error (don't worry about this one)SqlError:PGRES_FATAL_ERROR ERROR:  table "mono\r
-_postgres_test" does not exist\r
- <Stack Trace>\r
-\r
-                Create table with all supported types:\r
-OK\r
-                Insert values for all known types:\r
-OK\r
-                Update values:\r
-OK\r
-                Insert values for all known types:\r
-OK\r
-Aggregate: count(*)\r
-Agg Result: 2\r
-Aggregate: min(text_value)\r
-Agg Result: This is a text\r
-Aggregate: max(int4_value)\r
-Agg Result: 1048000\r
-Aggregate: sum(int4_value)\r
-Agg Result: 1048003\r
-                Select values from the database:\r
-Result is from a SELECT SQL Query.  Records Affected: -1\r
-Result Set 1...\r
-   Total Columns: 28\r
-ColumnName = boolean_value\r
-ColumnOrdinal = 1\r
-ColumnSize = 1\r
-NumericPrecision = 0\r
-NumericScale = 0\r
-IsUnique = False\r
-IsKey =\r
-BaseCatalogName =\r
-BaseColumnName = boolean_value\r
-BaseSchemaName =\r
-BaseTableName =\r
-DataType = System.Boolean\r
-AllowDBNull = False\r
-ProviderType = 16\r
-IsAliased = False\r
-IsExpression = False\r
-IsIdentity = False\r
-IsAutoIncrement = False\r
-IsRowVersion = False\r
-IsHidden = False\r
-IsLong = False\r
-IsReadOnly = False\r
-\r
- ...\r
-\r
- ColumnName = null_timestamp_value\r
- ColumnOrdinal = 28\r
- ColumnSize = 8\r
- NumericPrecision = 0\r
- NumericScale = 0\r
- IsUnique = False\r
- IsKey =\r
- BaseCatalogName =\r
- BaseColumnName = null_timestamp_value\r
- BaseSchemaName =\r
- BaseTableName =\r
- DataType = System.DateTime\r
- AllowDBNull = False\r
- ProviderType = 1184\r
- IsAliased = False\r
- IsExpression = False\r
- IsIdentity = False\r
- IsAutoIncrement = False\r
- IsRowVersion = False\r
- IsHidden = False\r
- IsLong = False\r
- IsReadOnly = False\r
-\r
- Gonna do a Read() now...\r
-   Row 0:\r
-    Col 0: boolean_value: False\r
-    Col 1: int2_value: 5\r
-    Col 2: int4_value: 3\r
-    Col 3: bigint_value: 9\r
-    Col 4: float_value: 3.141590\r
-    Col 5: double_value: 3.14159\r
-    Col 6: numeric_value: 123456789012.345\r
-    Col 7: char_value: Mono.Data!\r
-    Col 8: varchar_value: It was not me!\r
-    Col 9: text_value: We got data!\r
-    Col 10: point_value: (1,0)\r
-    Col 11: time_value: 01/01/1 21:13:14\r
-    Col 12: date_value: 02/29/2000 00:00:00\r
-    Col 13: timestamp_value: 02/29/2004 14:00:11\r
-    Col 14: null_boolean_value is NULL\r
-    Col 15: null_int2_value is NULL\r
-    Col 16: null_int4_value is NULL\r
-    Col 17: null_bigint_value is NULL\r
-    Col 18: null_float_value is NULL\r
-    Col 19: null_double_value is NULL\r
-    Col 20: null_numeric_value is NULL\r
-    Col 21: null_char_value is NULL\r
-    Col 22: null_varchar_value is NULL\r
-    Col 23: null_text_value is NULL\r
-    Col 24: null_point_value is NULL\r
-    Col 25: null_time_value is NULL\r
-    Col 26: null_date_value is NULL\r
-    Col 27: null_timestamp_value is NULL\r
-   Row 1:\r
-    Col 0: boolean_value: True\r
-    Col 1: int2_value: -22\r
-    Col 2: int4_value: 1048000\r
-    Col 3: bigint_value: 123456789012345\r
-    Col 4: float_value: 3.141590\r
-    Col 5: double_value: 3.14159\r
-    Col 6: numeric_value: 123456789012.345\r
-    Col 7: char_value: This is a char\r
-    Col 8: varchar_value: This is a varchar\r
-    Col 9: text_value: This is a text\r
-    Col 10: point_value: (1,0)\r
-    Col 11: time_value: 01/01/1 21:13:14\r
-    Col 12: date_value: 02/29/2000 00:00:00\r
-    Col 13: timestamp_value: 02/29/2004 14:00:11\r
-    Col 14: null_boolean_value is NULL\r
-    Col 15: null_int2_value is NULL\r
-    Col 16: null_int4_value is NULL\r
-    Col 17: null_bigint_value is NULL\r
-    Col 18: null_float_value is NULL\r
-    Col 19: null_double_value is NULL\r
-    Col 20: null_numeric_value is NULL\r
-    Col 21: null_char_value is NULL\r
-    Col 22: null_varchar_value is NULL\r
-    Col 23: null_text_value is NULL\r
-    Col 24: null_point_value is NULL\r
-    Col 25: null_time_value is NULL\r
-    Col 26: null_date_value is NULL\r
-    Col 27: null_timestamp_value is NULL\r
-   Total Rows Retrieved: 2\r
- Total Result sets: 1\r
-                Call ExecuteReader with a SQL Command. (Not INSERT,UPDATE,DELETE\r
- ).\r
- Result is from a SQL Command not (INSERT,UPDATE,DELETE).   Records Affected: -1\r
- Total Result sets: 0\r
-                Call ExecuteReader with a SQL Command. (Is INSERT,UPDATE,DELETE)\r
- .\r
- Result is from a SQL Command (INSERT,UPDATE,DELETE).  Records Affected: 1\r
- Total Result sets: 0\r
-                Calling stored procedure version()\r
- Result: PostgreSQL 7.2.1 on i686-pc-cygwin, compiled by GCC 2.95.3-5\r
- Database Server Version: PostgreSQL 7.2.1 on i686-pc-cygwin, compiled by GCC 2.9\r
- 5.3-5\r
- Clean up...\r
-                Drop table...\r
- OK\r
- RESULT: 0\r
-\r
-</pre>\r
-\r