Update faq
[mono.git] / web / ado-net
index 61f6edb7b2062c1365b13017bec10535897a4317..cd6ea65cfe42786a88044795167c06f4ab24123f 100644 (file)
 * ADO.NET
 
-       The coordinator for the ADO.NET implementation is <a
-       href="mailto:rodrigo@ximian.com">Rodrigo Moya</a>, with
-       the collaboration of <a href="mailto:danmorg@sc.rr.com">Daniel
-       Morgan</a> and <a href="mailto:tim@timcoleman.com">Tim Coleman</a>.
+<p>Mono's ADO.NET Developers:
+
+<table border=1>
+
+<tr>
+       <td><b>Developer</b></td>
+       <td><b>Email</b></td>
+       <td><b>Contribution</b></td>
+</tr>
+
+<tr>
+       <td>Rodrigo Moya</td>
+       <td>rodrigo -AT-<br> ximian.comNOSPAM</td>
+       <td>ADO.NET coordinator,<br> OLE DB provider,<br> and tests</td>
+</tr>
+
+<tr>
+       <td>Daniel Morgan</td>
+    <td>danmorg -AT-<br> sc.rr.comNOSPAM</td>
+    <td>MySQL, PostgreSQL, <br>Oracle providers,<br> and tests</td>
+</tr>
+
+<tr>
+       <td>Tim Coleman</td>
+       <td>tim -AT- <br>timcoleman.comNOSPAM</td>
+       <td>Microsoft SQL Server, <br>Sybase, <br>TDS providers,<br> Oracle, 
+               <br>and tests.<br>
+               He has
+           contributed <br>to other parts <br>of Mono too, <br>such as, 
+           <br>EnterpriseServices,
+           XML, <br>and WebServices.</td>
+</tr>
+
+<tr>
+       <td>Brian Ritchie</td>
+       <td>brianlritchie -AT-<br> hotmail.comNOSPAM</td>
+       <td>ODBC provider <br>and the ProviderFactory <br>in Mono.Data</td>
+</tr>
+
+<tr>
+       <td>Vladimir Vukicevic</td> 
+       <td>vladimir -AT-<br> pobox.comNOSPAM</td>
+       <td>SQL Lite provider. <br> He has contributed to GTK# <br>and mPhoto too.</td>
+</tr>
+
+<tr>
+       <td>Christopher Bockner</td>
+       <td>cleared -AT-<br> rogers.comNOSPAM</td>
+       <td>IBM DB2 Universal <br>Database provider</td>
+</tr>
+
+<tr>
+       <td>Ville Palo</td>
+       <td>vi64pa -AT-<br> koti.soon.fiNOSPAM</td>
+       <td>XML stuff <br>in System.Data <br>including DataSet <br>
+          and XmlDataDocument, <br>and tests</td>
+</tr>
+
+<tr>
+       <td>Gonzalo Paniagua Javier</td>
+       <td>gonzalo -AT-<br> ximian.comNOSPAM</td>
+       <td>Integration between <br>System.Web and <br>System.Data</td>
+</tr>
+
+<tr>
+       <td>Gaurav Vaish</td>
+       <td>gvaish -AT-<br> iitk.ac.inNOSPAM</td>
+       <td>Web controls</td>
+</tr>
+
+<tr>
+       <td>Phillip Jerkins</td>
+       <td>Phillip.Jerkins -AT-<br> morgankeegan.comNOSPAM</td>
+       <td>Named Instance support <br>in System.Data.SqlClient</td>
+</tr>
+
+</table>
+
+** Bugs and Feature Requests
+
+<ul>
+
+       <li>Bugs with Mono or any data provider in Mono should be reported 
+           in Mono's Bugzilla <a href="http://bugzilla.ximian.com/">here</a>.  If you
+           do not have a Bugzilla user account, it is free 
+           and easy to create 
+           one <a href="http://bugzilla.ximian.com/createaccount.cgi">here</a>.</li>
        
+       <li>Any RFE (Request For Enhancement) for features missing or new functionality
+           should be entered as a bug in Bugzilla too</li>
 
-* Action plan
-
-       The current plan to implement ADO.NET is as follows:
-
-       <b>Step 1:</b> Initial <a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdatasqlclient.asp?frame=true">System.Data.SqlClient</a> Provider:
-
-       <ul>
-               * Initial implementation of System.Data.SqlClient is based on
-                 the <a href="http://www.postgresql.org/idocs/">PostgreSQL C API</a> which is a
-                 client API to the PostgreSQL DBMS.  PostgreSQL was chosen so we could quickly
-                 create and test the System.Data classes.
-                 
-               * Once the <a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdatasqlclient.asp?frame=true">System.Data.SqlClient</a>
-                 code is functional and is usable by other people, we willl move it to
-                 Mono.Data.PostgreSQL, and will convert the existing
-                 System.Data.SqlClient to be just a wrapper around
-                 Mono.Data.PostgreSQL.  
-
-       </ul>
-
-       <b>Step 2:</b> <a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOleDb.asp?frame=true">System.Data.OleDb</a> Provider:
-               
-       <ul>
-               * <p>On Unix systems: System.Data.OleDb will use the
-               <a href="http://www.gnome-db.org/">LibGDA</a>
-                engine. 
-
-                 <p>LibGDA is a data access engine like ADO/OLE-DB, but for Unix.  The 
-                 GDA in libGDA stands for GNU/GNOME Data Access, but it does not require GNOME.
-                 It only requires glib2 and libxml2.  LibGDA is used by 
-                 libgnomedb, GNOME-DB, and gaSQL.  
-                 
-                 <p>There is work under way to get libgda working under 
-                 Windows using Cygwin by the GNOME-DB developers.
-                 
-                 <p>LibGDA has providers for MySQL, PostgreSQL, XML, ODBC,
-                 and MDB Tools (MS Access support).
-
-               * On Windows systems: System.Data.OleDb will use OLE-DB as
-                 its engine.  It may have the option of using libgda too.
-       </ul>
-
-       <b>Step 3:</b> <a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdatasqlclient.asp?frame=true">System.Data.SqlClient</a> Provider:
-
-       <ul>
-               * <p>System.Data.SqlClient will then become a managed
-                 provider for Microsoft SQL Server, both on Windows and
-                 Linux, to be compatible with applications written
-                 for the Microsoft .NET Development Framework.
-                 
-                 <p>Once Step 1 has been completed and the PostgreSQL
-                 provider support has been moved to its own place at 
-                 System.Data.PostgreSQL, we will use 
-                 <a href="http://www.freetds.org/">FreeTDS</a> as the basis
-                 for providing access to Microsoft SQL Server databases.
-                 
-                 <P>FreeTDS is a C API for Unix and Windows that implements 
-                 the TDS (Tabular Data Stream) protocol used in accessing 
-                 Microsoft SQL Server and Sybase databases.  A .NET Data Provider could be
-                 created for Sybase databases as well, but this would be put in Mono.Data.Sybase.
-       </ul>
-
-       <b>Step 4:</b> <a href="http://msdn.microsoft.com/downloads/sample.asp?url=/MSDN-FILES/027/001/668/msdncompositedoc.xml&frame=true">System.Data.Odbc</a> Provider:
-       
-       <ul>
-               * We will create a .NET Managaed Provider for ODBC
-                 in System.Data.Odbc for those using ODBC.
-                 On Unix and Windows, <a href="http://www.unixodbc.org/">unixODBC</a> mabye used.
-                 iODBC is an alternative to using unixODBC.
-                 
-                 <p>unixODBC works on Unix and Windows.  Well, I have not actually 
-                 used it on Cygwin, but it does build and install without problems.  
-                 
-                 <p>unixODBC has providers for:
-                 Oracle, Microsoft SQL Server and Sybase via FreeTDS, 
-                 MySQL, PostgreSQL, Informix, IBM DB2 (Universal Database), 
-                 Interbase, miniSQL (mSQL), AdabasD, Empress, YARD SQL, and others.
-                 
-       </ul>
-
-       <b>Step 5:</b> Other System.Data providers:
-
-       <ul>
-               * <p>The idea in Microsoft .NET System.Data is to have
-                 a managed provider for each supported DBMS.  System.Data.SqlClient
-                 for Microsoft SQL Server.  
-                 System.Data.OracleClient for Oracle 8i and 9i.
-
-                 <p>We will need to have Mono.Data.MySQL, Mono.Data.PostgreSQL,
-                 Mono.Data.DB2, and Mono.Data.miniSQL. Others,
-                 of course, are welcomed.
-                                 
-                 <p>System.Data has been designed so 
-                 non-database providers can be created too.              
-       </ul>
-       
-* Current Status
-
-       <p>We are still working on Step 1, but we are planning the other steps.
-       If you have any ideas, let us know.
-       
-       <p>We are able to do simple CREATE TABLE, DROP TABLE, UPDATE, INSERT, and
-       DELETE SQL commands using the ExecuteNonQuery method in SqlCommand.  
+</ul>
        
-       <p>We can execute multiple queries and do a NextResult() in SqlDataReader()
-       to get the next result set.  
+** ADO.NET Data Providers
        
-       <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) {
+<p>List of ADO.NET Data Providers working in Mono:
+                       
+<ul>
+       <li><a href="http://www.go-mono.com/ibmdb2.html">IBM DB2 Universal Database</a></li>
+       <li><a href="http://www.go-mono.com/mysql.html">MySQL</a></li>
+       <li><a href="http://www.go-mono.com/odbc.html">ODBC</a></li>
+       <li><a href="http://www.go-mono.com/oracle.html">Oracle</a></li>
+       <li><a href="http://www.go-mono.com/oledb.html">OLE DB</a></li>
+       <li><a href="http://www.go-mono.com/postgresql.html">PostgreSQL</a></li>
+       <li><a href="http://www.go-mono.com/sqlclient.html">Microsoft SQL Server</a></li>
+       <li><a href="http://www.go-mono.com/sqlite.html">SQL Lite</a></li>
+       <li><a href="http://www.go-mono.com/sybase.html">Sybase</a></li>
+       <li><a href="http://www.go-mono.com/tdsclient.html">TDS Generic</a></li>
+</ul>
+
+<p>Providers which we do not have, but we would like to have.  Currently,
+       some of these databases are supported via the ODBC or OLE DB providers.
+
+<ul>
+       <li><a href="http://msdn.microsoft.com/library/en-us/dnsql2k/html/sqlxml_intromanagedclasses.asp?frame=true">Managed Classes for SqlXml</a> which is
+               a .NET data provider for retrieving XML data from a Microsoft SQL Server 2000 database.  The System.Data.SqlClient provider
+               in Mono can be used as a starting point at mcs/class/System.Data/System.Data.SqlClient.</li>
+       <li><a href="http://www.hughes.com.au/">miniSQL</a></li>
+       <li><a href="http://www.sleepycat.com/">BerkeleyDB (Sleepycat)</a></li>
+       <li><a href="http://www.sapdb.org/">SapDB</a></li>
+       <li><a href="http://www-3.ibm.com/software/data/informix/">Informix</a></li>    
+       <li><a href="http://msdn.microsoft.com/vfoxpro/">Foxpro</a></li>        
+       <li>Microsoft Access - could be done by creating C# bindings to <a href="http://mdbtools.sourceforge.net">MDB Tools</a></li>
+       <li>dbase or xbase type database files</li>
+       <li>Others are welcome</li>
+</ul>
+
+<p>External Projects that have created ADO.NET Providers that work on Mono:
+
+<ul>
+
+       <li><a href="http://www.go-mono.com/firebird.html">Firebird Interbase</a></li> is a
+          Firebird SQL Managed data provider. It can be used with Interbase databases too.  It
+          is written in 100%C# and does not require a client library. Works on .NET and Mono.</a>
+       <li><a href="http://gborg.postgresql.org/project/npgsql/projdisplay.php">Npgsql</a> is a 
+          PostgreSQL Managed data provider written 
+          in 100% C#, does not require a client library, and works on .NET and Mono</li>
+       <li><a href="http://sourceforge.net/projects/mysqlnet/">MySQLNet</a> is a 
+          MySQL Managed data provider written in 100% C#, does not
+          require a client library, and works on .NET and Mono</li>
+</ul>
+
+** Tools
+
+<p>Some tools that can be used for ADO.NET and other technologies (ASP.NET, XML, etc).
+
+<ul>   
+               <li><b>SQL# CLI</b> - a SQL query tool with a command-line interface.
+                   It can be used to enter and execute SQL statements or 
+                   execute a batch of SQL commands from a file.   It can
+                 be used to test connection strings, connect to various ADO.NET
+                 providers, save output to text, html, or xml.  It is a work-in-progress.
+                 The SQL# CLI is distributed with the
+                 Mono runtime and class libraries as an executable assembly sqlsharp.exe.
+                 The source to SQL# CLI can be found in the mcs source at
+                 mcs/tools/SqlSharp/SqlSharpCli.cs
+                 </li>
+                 
+               <li><p><b>SQL# GUI - a graphical SQL query tool</b> allows a user
+                 to enter SQL commands in a top panel which is a text editor.  It
+                 has a toolbar and menu for various tasks, such as, executing
+                 SQL commands one-at-a-time or in a batch.  The results would appear
+                 in a bottom panel in a grid or could be saved to a file (xml, html, csv).
+                 Also, the bottom panel would allow logging of SQL command executed.
+                 Currently, there is a <a href="http://go-mono.com/images/sqlsharp.png">SQL# For GTK#</a> which
+                 provides a GUI interface using the <a href="http://gtk-sharp.sourceforge.net">Gtk#</a> toolkit.  SQL# For GTK#
+                 is a work-in-progress and can be found in the mcs source at 
+                 mcs/tools/SqlSharp/gui/gtk-sharp</li>  
+</ul>
+
+<p>Tools we would like to have, but they have not been created yet:
+
+<ul>
+               <li><b>XML Schema Definition tool</b> <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpconxmlschemadefinitiontoolxsdexe.asp">xsd.exe</a> needs 
+                       to be created.  Maybe this TODO item should be at the System.XML web page instead.
+                       
+                       <ul>
+                               <li>This tool
+                                       would work like the xsd.exe tool included with 
+                                       the .NET Framework.  The Xsd.exe tools has the\r
+                                       following uses:\r
+                                       <ul>\r
+                                       <li><b>XDR to XSD</b> - used to generate an XML schema from an XDR (XML Data Reduced schema) file. \r
+                                               XDR was used by Microsoft prior to XSD becoming a W3C recommendation.  So, this needs\r
+                                               to be supported for legacy reasons</li>\r
+                                       <li><b>XML to XSD</b> - used to generate an XML schema from an XML file</li> \r
+                                       <li><b>XSD to DataSet</b> - used to generate DataSet classes from an XSD schema file.  The\r
+                                               DataSet classes created can then be used with XML data</li>\r
+                                       <li><b>XSD to Classes</b> - used to generate classes from an XSD schema file. The \r
+                                           classes created can be used with System.XML.Serialization.XMLSerializer \r
+                                           to read and write XML code that follows the schema</li>\r
+                                       <li><b>Classes to XSD</b> - used to generate an XML schema \r
+                                               from type(s) in a assembly file. The \r
+                                               XML schema created by the tool defines the XML format used \r
+                                               by System.XML.Serialization.XMLSerializer</li>\r
+                                       </ul>\r
+                               <li>Xsd.exe is used to manipulate XML schemas that \r
+                                       follow the http://www.w3.org/XML/Schema">XML Schema Definition (XSD)</a> language \r
+                                       recommended     by the <a href="http://w3.org/">World Wide Web Consortium (W3C)</a></li>\r
+                                       \r
+                               <li>How this tool could be created:\r
+                                       <ul>\r
+                                               <li>Write xsd.exe in C# and run on Mono</li>\r
+                                               <li>Make sure we have XML Schema support in System.Xml.Schema.  Currently,\r
+                                               it is wrapped around libxlst</li>\r
+                                               <li>XML serialization support in System.Data classes</li>\r
+                                               <li>Create the TypedDataSetGenerator class in System.Data</li>\r
+                                               <li>Using CodeDOM or Reflection.Emit to create code</li>\r
+                                               <li>Make sure DataSet, XmlDataDocument, and related classes \r
+                                               are implemented fully</li>\r
+                                       </ul>\r
+                               </li>   \r
+                               
+                       </li>
+                       </ul>
+               </li>
+               
+               <li><b>Application XML Configuration File Editor</b> - a tool
+               to create and edit an application configuration file, such as,
+               we have a .net application named Accouting.exe, the tool could edit
+               the application configuration file Accounting.exe.config so a user could
+               connect to the database used by the program.  This tool has not
+               been created.</li>
+               
+               <li><b>Configuration Command-Line and GUI Tools for ADO.NET</b>.  
+                 These tools have not been started.  The tools would be written in
+                 C# and run on Mono. The
+                 configuration tool can be used to do the following:
+                 <ul> 
+                       <li>bebased on the Application XML Configuration File Editor</li>
+                       <li>setup DSNs for the ODBC and OLE-DB
+                               providers and configurations for 
+                               their underlying libraries (unixODBC and libgda)</li>
+                   <li>setup configurations for the Mono.Data.ProviderFactory
+                               that Brian Ritchie created</li>
+                   <li>setup native database client library configurations too, such as,
+                               freetds.conf for Microsoft SQL Server and Sybase</li>
+                 </ul>
+               </li>
+
+</ul>
+
+** Extra Classes in Mono ADO.NET
+
+ <p>An ADO.NET <a href="http://www.go-mono.com/provider-factory.html">Provider Factory</a> 
+    was created by Brian Ritchie.  The 
+       Provider Factory is a way to dynamically create
+       connections, commands, parameters, and data adapters based on configuration 
+       information.
        
-       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
-
-       reader = selectCommand.ExecuteReader ();
-
-       do {\r
-               results++;\r
-               Console.WriteLine("Result Set " + results + "...");\r
-\r
-               // get the DataTable that holds\r
-               // the schema\r
-               DataTable dt = reader.GetSchemaTable();\r
-                                               \r
-               // number of columns in the table\r
-               Console.WriteLine("   Total Columns: " +\r
-                               dt.Columns.Count);\r
-\r
-               // display the schema\r
-               for(c = 0; c < dt.Columns.Count; c++) {\r
-                       Console.WriteLine("   Column Name: " + \r
-                                               dt.Columns[c].ColumnName);\r
-                       Console.WriteLine("          MaxLength: " +\r
-                                               dt.Columns[c].MaxLength);\r
-                       Console.WriteLine("          Type: " +\r
-                                               dt.Columns[c].DataType);\r
-               }\r
-               int nRows = 0;\r
-\r
-               // Read and display the rows\r
-               while(rdr.Read()) {\r
-                       Console.WriteLine("   Row " + nRows + ": ");\r
-\r
-                       for(c = 0; c < rdr.FieldCount; c++) {\r
-                               if(reader.IsDBNull(c) == true)\r
-                                       Console.WriteLine("      " + \r
-                                                       reader.GetName(c) + " is DBNull");\r
-                               else\r
-                                       Console.WriteLine("      " + \r
-                                                       reader.GetName(c) + ": " +\r
-                                                       reader[c].ToString());\r
-                       }\r
-                       nRows++;\r
-               }\r
-               Console.WriteLine("   Total Rows: " + \r
-                                       nRows);\r
-               } while(reader.NextResult());\r
-       Console.WriteLine("Total Result sets: " + results);\r
-                       \r
-       reader.Close();\r
- }
+** Current Status
 
-</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>Various ADO.NET Providers have been created at various stages of 
+       development including: 
+       Firebird/Interbase, IBM DB2 Universal Database, MySQL, ODBC, OLE DB, Oracle,
+       PostgreSQL, SQL Lite, Sybase, Microsoft SQL Server, and TDS Generic.  
+       See their respective web page for more information.
        
-       <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><b>Data Relations</b> via DataRelation, DataRelationCollection, and
+       other classes have not been implemented
        
-       <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><b>Constraints</b> need lots of work
        
-       <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;
-
-       cmd.CommandType = CommandType.StoredProcedure;
-       cmd.CommandText = "version";
-                                                       
-       data = (string) cmd.ExecuteScalar ();
-
-       return data;
- }
-</pre>
-                       
-       <p>Parameters have not been tested and most likely do not work.
+       <p><b>XML Schema Definition tool</b> xsd.exe that is included
+       in the .NET Framework has not been created for Mono
        
-       <p>A lot of functionality in System.Data is missing, but the 
-       infrastructure is starting to come together.
+       <p><b>TypeDataSetGenerator</b> needs to be stubbed and implemented.
+               
+       <p><b>DataSet, DataAdaptor, DataTable, DataRelation, DataRow, DataColumn,
+       DataColumnCollection, DataRowCollection, and others</b> need more work.  There are
+       many classes that are just stubs and need to be implemented.  Ville Palo has been
+       doing much testing here.
+
+       <p><b>XML support in System.Data</b> needs work.  This involves working on
+       the classes: DataSet, XmlDataDocument, and the method ExecuteXmlReader() that
+       exists in a provider's class that implements IDbCommand, and others.
+       Stuart Caborn has started the XML support in a DataSet.  Tim Coleman started
+       XML support in the ExecuteXmlReader() in a SqlCommand.  Ville Palo has been
+       heavily modifying DataSet, XmlDataDocument, and other classes for reading
+       and writing XML.  XML Serialization support in DataSet needs to be implemented.
+               
+       <p><b>Integration with ASP.NET</b> has been created.  Data binding of
+       a DataTable in a DataSet to a System.Web.UI.WebControls.DataGrid works.  Data binding
+       of other types works too.
        
-       <p>A lot of Exceptions need to be thrown for various exceptions.
+       <p><b>Database Access from ASP.NET</b>:
+       <ul>
+               <li>Take a look at xsp in cvs and look at the examples in test: dbpage1.aspx
+               and dbpage2.aspx:
+                       <ul>
+                               <li>Notice that the namespace System.Data is imported via <b>import</b></li>
+                               <li>A NameValueCollection is gotten using ConfigurationSettings.AppSetings. These
+                               settings are gotten from the file server.exe.config which is a XML file.   The XML
+                               file has a section appSettings.  In the appSettings section, you have keys 
+                               for DBProviderAssembly, DBConnectionType, and DBConnectionString.
+                               <ul>
+                                       <li><b>DBProviderAssembly</b> is the assembly of the ADO.NET provider.  
+                                             For example: 
+                                             "Mono.Data.PostgreSqlClient"</li>
+                                       <li><b>DBConnectionType</b> is the System.Type of the class that 
+                                             implements System.Data.IDbConnection that is found
+                                         in the DBProviderAssembly.  
+                                         For example: 
+                                         "Mono.Data.PostgreSqlClient.PgConnection"</li> 
+                                   <li><b>DBConnectionString</b> is the ConnectionString to set to the
+                                         IDbConnection object to use in opening a connection to a data source.
+                                         For Example: 
+                                         "hostaddr=127.0.0.1;user=monotest;password=monotest;dbname=monotest"</li>
+                               </ul>
+                               <li>The function GetConnectionData() gets the database provider assembly, connection type,
+                               and connection string parameters if they exist; otherwise, it uses default values.  This is
+                               done during the loading of the web page.</li>
+                               <li>With the connection parameters, the assembly is loaded, the connection type is verified that
+                               it implements IDbConnection and an instance of the class can be created, creates a instance
+                               of the class, sets the connection string, and opens the connection.</li>
+                       </ul>
+               </li>
+       </ul>
        
-       <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:
+       <p><b>Integration with Windows.Forms</b> has not been started, such as, data binding 
+       to a System.Windows.Forms.DataGrid.  This may involve implementing many classes
+       in System.Windows.Forms and System.Data.
        
-<pre>
- string connectionString;
- string sqlQuery;
- SqlDataAdapter adapter;
- DataSet dataSet = null;
-
- connectionString =
-       "host=localhost;" +
-       "dbname=test;" +
-       "user=postgres";
-                                               
- sqlQuery = "select * from pg_tables";
-
- adapter = new SqlDataAdapter (sqlQuery, 
-                       connectionString);
-
- adapter.SelectCommand.Connection.Open ();
-                               
- dataSet = new DataSet ();
-
- adapter.Fill (dataSet);
-                       
- if (dataSet != null) {
-       foreach (DataRow row in dataSet.Tables["Table"].Rows)
-               Console.WriteLine("tablename: " + row["tablename"]);
- }
-</pre> 
+       <p><b>Integration with <a href="http://gtk-sharp.sourceforge.net/">GTK#</a></b> 
+       has not been started, such as, data binding
+       to a GtkTreeView.  This may involve creating new classes
+       to go between the glist data model and the ADO.NET data model.
+       Mike Kestner or Rachel Hestilov would be the best people to ask for help on GTK#.
        
-       <p>We do need help on the DataSet/DataAdaptor/DataTable/DataRelation/XML 
-       functionality so we     can integrate with 
-       the ASP.NET controls and Windows.Forms controls by allowing the controls to bind 
-       to a data source.
+       <p><b>Integration with QT#</b> has not been started.  Any information on 
+       how this can be done is appreciated.  Adam Treat would be the best 
+       person to ask about QT#.
        
-       <P>Need to add XML support in System.Data.  This involves working on
-       the classes: DataSet and XmlDataDocument and the ExecuteXmlReader() in SqlCommand.
+       <p><b>Building System.Data</b>
        
        <p>The System.Data.dll gets built with the rest of the class library.
        To compile the System.Data.dll assembly separately, you need:
                * compile System.Data.dll:
 <pre>
  cd mcs/class/System.Data<br>
- mcs --target library -o System.Data.dll @list
+ mcs --target library -o \
+    System.Data.dll @list
 </pre>
        </ul>
 
  ../../nant/NAnt.exe
 </pre>
                        
-                       This will automatically copy the System.Data.dll to Test.
-                       If you need to do a clean for the System.Data.dll assembly,<br><br>
+               * This will automatically copy the System.Data.dll to Test.
+                 If you need to do a clean for the System.Data.dll assembly,<br><br>
 
-<pre>                  
+<pre>
  cd mcs/class/System.Data
- ../../nant/NAnt.exe clean
+ ../../nant/NAnt.exe clean 
 </pre>
        </ul>
 
-* Testing
-
-       <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.
-               
-       <p>Why?  Because it is open source, 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.
-               
-       <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).
-       
-       <p>The System.Data tests use this connection string to connect
-       to the PostgreSQL database named "test" at host "localhost" as
-       user "postgres".
-
-<pre>
-"host=localhost;dbname=test;user=postgres"
-</pre>
-               
-       <p>Installation instructions for PostgreSQL DBMS:
-
-       <b>On Unix</b>
-
-       <ul>
-               * Read the PostgreSQL Installation Instructions 
-               at \usr\doc\postgresql-x.x.x\html\installation.html
-               
-               * Depending on your Unix system, 
-               PostgreSQL maybe already installed, a database user 'postgres' created, 
-               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
- psql test
-</pre>
+** Testing
+
+<ul>
+       <li>Testing connection-oriented classes are done 
+       via the provider specific tests
+       found in the mcs source at mcs/class</br>
+               <table border=1>        
+                       <tr>
+                               <td><b>Name</b></td>
+                               <td><b>Assembly /</br> Namespace</b></td>
+                               <td><b>Test</b></td>    
+                       </tr>           
+                       
+                       <tr>
+                               <td>Microsoft</br> SQL</br> Server</br></td>
+                               <td>System.Data /</br> System.Data.SqlClient</td>
+                               <td>SqlTest.cs at</br> System.Data/Test</td>
+                       </tr>
+                       
+                       <tr>
+                               <td>PostgreSQL</br> (Mono)</td>
+                               <td>Mono.Data.PostgreSqlClient /</br> Mono.Data.PostgreSqlClient</td>
+                               <td>PostgresTest.cs at</br> System.Data/Test</td>
+                       </tr>
+
+                       <tr>
+                               <td>MySQL</br> (Mono)</td>
+                               <td>Mono.Data.MySql /</br> Mono.Data.MySql</td>
+                               <td>MySqlTest.cs at</br> Mono.Data.MySql/Test</td>
+                       </tr>
+
+                       <tr>
+                               <td>Oracle</br> (Mono)</td>
+                               <td>System.Data.OracleClient /</br> System.Data.OracleClient</td>
+                               <td>TestOracleClient.cs at</br> System.Data.OracleClient</td>
+                       </tr>
+
+                       <tr>
+                               <td>ODBC</br> (Mono)</td>
+                               <td>System.Data.OracleClient /</br> System.Data.OracleClient</td>
+                               <td>TestOracleClient.cs at</br> System.Data.OracleClient</td>
+                       </tr>
+                       
+               </table>
        
-               * Make sure you have a database user named postgres.  It is best to install
-               the PostgreSQL DBMS under linux user postgres.  When you run the postmaster,
-               run it under the user postgres as well.  If this was not done, then you
-               will need to create a user named postgres for the System.Data tests.
 
-               * If you already installed PostgeSQL and you do not have a database
-               user named postgres, then you can create user postgres using psql:
-               
-<pre>          
-psql test
-create user postgres with password 'fun2db';
-</pre>
-                               
-               * The postmaster must be run with -i option.
-               
-               * In the /usr/local/pgsql/data/pg_hba.conf file, you need
-               to have the AUTH_TYPE set to md5.  You can read more on this at
-               /usr/doc/postgresql-7.2.1/html/client-authentication.html 
-               or wherever your
-               PostgreSQL html docs are located.  See the 2nd line below,
-               host 127.0.0.1 has an AUTH_TYPE md5 in pg_hba.conf.
-               
-<pre>
- # TYPE     DATABASE    IP_ADDRESS    MASK               AUTH_TYPE
-
- local      all                                          trust
- host       all         127.0.0.1     255.255.255.255    md5
-</pre>
-
-       * If you can not find your PostgreSQL documentation locally or you 
-       did not install it, then you 
-       can get it <a href="http://www.postgresql.org/idocs/">here</a>.
-
-       </ul>
-
-       <b>On Windows</b>
-
-       <ul>
-               * Use the <a href="http://www.cygwin.com/">Cygwin</a> installer to 
-                 install the PostgreSQL DBMS.  It is
-                 found in the database category.
-                 
-               * <p>Read the file postgres-x.x.README at /usr/doc/Cygwin and read 
-                 the requirements to install PostgreSQL.  Those requirements
-                 are included with cygwin except cygipc.  A default installtion
-                 of cygwin does not install everything you will need, so on the 
-                 safe side, just include everything when installing cygwin.
-               
-               * <p>The -x.x in postgres-x.x is the version of your PostgreSQL DBMS.
-               
-               * <p>Once Cygwin has installed the PostgreSQL DBMS on your computer,
-                 read the file FAQ_MSWIN which is available 
-                 in /usr/doc/postgres-x.x 
-                                 
-               * <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>The cygipc package contains the ipc-daemon you will need 
-                               to run before you can
-                               run the PostgreSQL DBMS Server daemon (postmaster) or run
-                               initdb which initializes the PostgreSQL database.
-                         
-                               <p><b>3.</b>  The Cygwin bin directory has to be placed in 
-                               the path before the Windows program directories, 
-                               for example, C:\cygwin\bin 
-                         
-                               <p><b>My own note.</b>  In the Windows control panel, I set
-                               the environment variables PATH to my cygwin /usr/local/bin,
-                               /usr/bin, and /bin.  I also set my LD_LIBRARY_PATH to 
-                               /usr/local/lib and /usr/lib.  For example:
-                         
-                               <p>
-<pre>
-PATH=c:\cygwin\usr\local\bin;c:\cygwin\usr\bin;c:\cygwin\bin;
-LD_LIBRARY_PATH=c:\cygwin\usr\local\lib;c:\cygwin\usr\lib;
-</pre>
-                                                         
-                               <p><b>4.</b> Start the ipc-daemon that came with the cygipc 
-                               package.  There
-                               are two ways to do this: run it from the command line as:
-                         
-                               <p>
-<pre>
-ipc-daemon &
-</pre>                           
-                               <p>or you can set it up as a Windows service.  See the 
-                               file cygrunsrv.README at /usr/doc/Cygwin on how to do this
-                               for ipc-daemon and postmaster.  Note the
-                               troubleshooting section at the end of 
-                               the cygrunsrv.README file.
-                         
-                               <p>To install ipc-daemon as a service, 
-                               you just have to run
-                         
-                               <p>
-<pre>
-ipc-daemon --install-as-service' (--remove-as-service) 
-</pre>
-                         
-                               <p>and then run
-                         
-<pre>
-net start ipc-daemon
-</pre>
-                       </ul>
-                         
-                       <p>Read the installation.html file 
-                       at /usr/doc/postgresql-x.x/html/installation.html
+       <li><a href="http://www.go-mono.com/testing.html">Testing non-connection classes</a> are 
+       done via mono's modified version of NUnit.
+               <ul>
+                       <li>To run all the NUnit tests for Mono, you need the mcs source.  cd to the root
+                       of the mcs source.  To run it:
+                               <ul>
+                                       <li>On Linux: make -f makefile test</li>
+                                       <li>On Windows: make test</li>
+                               </ul>
+                       </li>
+                       <li>If you just want to run the NUnit tests for System.Data, you would cd into
+                       the mcs source at class/System.Data/Test and run it:
+                               <ul>
+                                       <li>On Linux: make -f makefile test</li>
+                                       <li>On Windows: make test</li>
+                               </ul>
+                       </li>
+               </ul>
+       </li>
                
-                       <p>You will see in this file that you will need to 
-                       run the following commands:
-                 
-                       <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
-psql test              
-</pre>
-                 
-                       <p>When you need to connect to the database, 
-                       you will need ipc-daemon and postmaster running.  Start ipc-daemon
-                       before any of the command above.  If you restart your computer, you
-                       need to start ipc-daemon and postmaster either manually or as a 
-                       service.
-                 
-                       <p>psql is a command-line PostgreSQL client tool to 
-                       enter and run SQL commands and queries.
-                 
-                       <p>If there is no database user named postgres, create a user named
-                       postgres with the following SQL command in the client tool psql:
-                 
-                       <p>
-<pre>
-psql test
-create user postgres with password 'fun2db';
-</pre>
-                       <p>The only reason I say this is so you can easily use the System.Data tests
-                       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.
+</ul>  
 
-       <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>You should get something like:
-
-<p>
-<pre>   
- 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:  \r
- table "mono_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
-                 Get Schema.\r
- dt.Columns.Count: 28\r
- * Column Name: boolean_value\r
-          MaxLength: 1\r
-          Type: System.Boolean\r
- * Column Name: int2_value\r
-          MaxLength: 2\r
-          Type: System.Int16\r
- * Column Name: int4_value\r
-          MaxLength: 4\r
-          Type: System.Int32\r
- * Column Name: bigint_value\r
-          MaxLength: 8\r
-          Type: System.Int64\r
- * Column Name: float_value\r
-          MaxLength: 4\r
-          Type: System.Single\r
- * Column Name: double_value\r
-          MaxLength: 8\r
-          Type: System.Double\r
- * Column Name: numeric_value\r
-          MaxLength: -1\r
-          Type: System.Decimal\r
- * Column Name: char_value\r
-          MaxLength: -1\r
-          Type: System.String\r
- * Column Name: varchar_value\r
-          MaxLength: -1\r
-          Type: System.String\r
- * Column Name: text_value\r
-          MaxLength: -1\r
-          Type: System.String\r
- * Column Name: point_value\r
-          MaxLength: 16\r
-          Type: System.String\r
- * Column Name: time_value\r
-          MaxLength: 8\r
-          Type: System.DateTime\r
- * Column Name: date_value\r
-          MaxLength: 4\r
-          Type: System.DateTime\r
- * Column Name: timestamp_value\r
-          MaxLength: 8\r
-          Type: System.DateTime\r
- * Column Name: null_boolean_value\r
-          MaxLength: 1\r
-          Type: System.Boolean\r
- * Column Name: null_int2_value\r
-          MaxLength: 2\r
-          Type: System.Int16\r
- * Column Name: null_int4_value\r
-          MaxLength: 4\r
-          Type: System.Int32\r
- * Column Name: null_bigint_value\r
-          MaxLength: 8\r
-          Type: System.Int64\r
- * Column Name: null_float_value\r
-          MaxLength: 4\r
-          Type: System.Single\r
- * Column Name: null_double_value\r
-          MaxLength: 8\r
-          Type: System.Double\r
- * Column Name: null_numeric_value\r
-          MaxLength: -1\r
-          Type: System.Decimal\r
- * Column Name: null_char_value\r
-          MaxLength: -1\r
-          Type: System.String\r
- * Column Name: null_varchar_value\r
-          MaxLength: -1\r
-          Type: System.String\r
- * Column Name: null_text_value\r
-          MaxLength: -1\r
-          Type: System.String\r
- * Column Name: null_point_value\r
-          MaxLength: 16\r
-          Type: System.String\r
- * Column Name: null_time_value\r
-          MaxLength: 8\r
-          Type: System.DateTime\r
- * Column Name: null_date_value\r
-          MaxLength: 4\r
-          Type: System.DateTime\r
- * Column Name: null_timestamp_value\r
-          MaxLength: 8\r
-          Type: System.DateTime\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.141593\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: Monday, 01 January 1 21:13:14\r
-    Col 12: date_value: Tuesday, 29 February 2000 00:00:00\r
-    Col 13: timestamp_value: Sunday, 29 February 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.141593\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: Monday, 01 January 1 21:13:14\r
-    Col 12: date_value: Tuesday, 29 February 2000 00:00:00\r
-    Col 13: timestamp_value: Sunday, 29 February 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
- Rows: 2\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