* 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>.
-
-
-* 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:
+** Data Access in Mono
- <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>
+ <li>Today, our goal is to be compatible with .NET 1.1 and .NET 1.0. We also would like
+ to extend data access beyond what is included with .NET 1.0 and .NET 1.1,
+ such as, include access to more databases, such as, PostgreSQL and MySQL,
+ but also provide classes that help in creating data source-agnostic code, such as,
+ Mono.Data.ProviderFactory.</li>
+
+ <li>In the future, we would like to be compatible with .NET 1.2. This includes features
+ like <a href="http://longhorn.msdn.microsoft.com/lhsdk/ndp/daconworkingwithobjectspacesarchitecture.aspx">ObjectSpaces</a></li>
- <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>
+</ul>
- <b>Step 5:</b> Other System.Data providers:
+** Bugs and Feature Requests
- <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.
+<ul>
- <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>
+ <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>
-* Current Status
+ <li>Any requests for new features or missing functionality
+ can entered as a bug in Bugzilla too</li>
- <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.
-
- <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.
+</ul>
- <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.
+** ADO.NET Data Providers
- <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
-
- 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
- }
-
-</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;
-
- 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>A lot of functionality in System.Data is missing, but the
- infrastructure is starting to come together.
-
- <p>A lot of Exceptions need to be thrown for various exceptions.
-
- <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:
-
-<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);
+<p>Mono has many ADO.NET Data Providers to get you connected:
- if (dataSet != null) {
- foreach (DataRow row in dataSet.Tables["Table"].Rows)
- Console.WriteLine("tablename: " + row["tablename"]);
- }
-</pre>
-
- <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>Need to add XML support in System.Data. This involves working on
- the classes: DataSet and XmlDataDocument and the ExecuteXmlReader() in SqlCommand.
-
- <p>The System.Data.dll gets built with the rest of the class library.
- To compile the System.Data.dll assembly separately, you need:
-
- <b>On Unix</b>
-
+<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">Older Microsoft SQL Server and Sybase databases</a></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>sqlsharp.exe
+ <ul>
+ <li>SQL# is a command line query tool included with Mono to enter and execute SQL statements</li>
+ </ul>
+ </li>
+ <li>xsd.exe
+ <ul>
+ <li>XML Schema Definition tool</li>
+ <ul>
+ <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>\r
+ </ul>\r
+ </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.
+
+** Database Access from ASP.NET
<ul>
- * update your mono sources. Be sure you have latest mcs.exe
- and .dll's, since there have been many fixes needed for
- compilation on Linux.
-
- * compile System.Data.dll:
-<pre>
- cd mcs/class/System.Data<br>
- mcs --target library -o System.Data.dll @list
-</pre>
+ <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:
+ "ByteFX.Data"</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:
+ "ByteFX.Data.MySqlConnection"</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>
- <b>On Windows</b>
-
- <ul>
- * update your mono sources. Be sure you have latest mcs.exe
- and .dll's. You can use the same method as Linux,
- or you can use NAnt.
-
- * To use NAnt:
-
-<pre>
- cd mcs/class/System.Data
- ../../nant/NAnt.exe
-</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>
- 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>
- cd mcs/class/System.Data
- ../../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>
-
- * 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
+ <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> (Npgsql)</td>
+ <td>Npgsql /</br> Npgsql</td>
+ <td>*.cs at</br> Npgsql/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/Test</td>
+ </tr>
+
+ <tr>
+ <td>ODBC</br> (Mono)</td>
+ <td>System.Data.Odbc /</br> System.Data</td>
+ <td>OdbcTest.cs (to connect to MS SQL Server)at</br> System.Data/Test</td>
+ </tr>
+
+ </table>
+
+
+ <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>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>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.
-
- <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:
+</ul>
-<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