[Mono-devel-list] Data Adapter problem

Daniel Morgan danielmorgan at verizon.net
Wed Jul 13 21:36:43 EDT 2005


I have a problem with the data adapter on Mono 1.1.8 on Windows.  Has 
this been fixed in svn?

Notice my test case does not use column nor table mappings.

Results on Dot Net 1.1:

E:\projects\DotNet\C#\TestSqlClientAdapter\bin\Debug>TestSqlClientAdapter.exe
Apapter Test Begin...
Insert...
Value 0: 3
Value 0: Value inserted
Rows retrieved: 1
Update...
Value 0: 3
Value 0: Value updated
Rows retrieved: 1
Delete...
Rows retrieved: 0
Done.

Results on Mono 1.1.8 on Windows:

E:\projects\DotNet\C#\TestSqlClientAdapter\bin\Debug>mono 
TestSqlClientAdapter.e
xe
Apapter Test Begin...
Insert...

Unhandled Exception: System.IndexOutOfRangeException: 
DataColumnMappingCollectio
n doesn't contain DataColumnMapping with SourceColumn 'num_value'.
in <0x000cd> System.Data.Common.DataColumnMappingCollection:get_Item 
(System.Str
ing sourceColumn)
in (wrapper remoting-invoke-with-check) 
System.Data.Common.DataColumnMappingColl
ection:get_Item (string)
in <0x001eb> System.Data.SqlClient.SqlCommandBuilder:CreateInsertCommand 
(System
.Data.DataRow row, System.Data.Common.DataTableMapping tableMapping)
in (wrapper remoting-invoke-with-check) 
System.Data.SqlClient.SqlCommandBuilder:
CreateInsertCommand 
(System.Data.DataRow,System.Data.Common.DataTableMapping)
in <0x00197> System.Data.SqlClient.SqlCommandBuilder:RowUpdatingHandler 
(System.
Object sender, System.Data.SqlClient.SqlRowUpdatingEventArgs e)


Here is the test case:

using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;

namespace TestSqlClientAdapter {
    public class Test {
        static SqlConnection con;
        static SqlTransaction trans;

        public static void Main (string[] args)
        {
            Console.WriteLine("Apapter Test Begin...");
            con = new SqlConnection("server=localhost;database=pubs;user 
id=sa;password=mypass");
            con.Open();
           
            Setup();

            trans = con.BeginTransaction();
            Insert();
            trans.Commit();

            trans = con.BeginTransaction();
            Update();
            trans.Commit();

            trans = con.BeginTransaction();
            Delete();
            trans.Commit();

            con.Close();
            Console.WriteLine("Done.");
        }

        static void Setup()
        {
            SqlCommand cmd = con.CreateCommand();
            cmd.Transaction = trans;
            cmd.CommandText = "DROP TABLE MONO_TEST_ADAPTER1";

            try { cmd.ExecuteNonQuery();
            } catch(SqlException e) { }

            cmd.CommandText =
                "CREATE TABLE MONO_TEST_ADAPTER1 (" +
                " num_value int primary key," +
                " txt_value varchar(64))";
            cmd.ExecuteNonQuery();

            cmd.Dispose();
            cmd = null;
        }

        static void Insert()
        {
            Console.WriteLine("Insert...");

            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM 
MONO_TEST_ADAPTER1", con);
            adapter.SelectCommand.Transaction = trans;
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
           
            DataSet ds = new DataSet();
            adapter.Fill(ds,"MONO_TEST_ADAPTER1");
           
            DataRow row = ds.Tables["MONO_TEST_ADAPTER1"].NewRow();
            row["num_value"] = 3;
            row["txt_value"] = "Value inserted";

            ds.Tables["MONO_TEST_ADAPTER1"].Rows.Add(row);

            adapter.Update(ds, "MONO_TEST_ADAPTER1");

            row = null;
            builder = null;
            adapter = null;
            ds = null;
           
            ReadData(con, "SELECT * FROM MONO_TEST_ADAPTER1");
        }

        static void Update()
        {
            Console.WriteLine("Update...");

            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM 
MONO_TEST_ADAPTER1", con);
            adapter.SelectCommand.Transaction = trans;
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
           
            DataSet ds = new DataSet();
            adapter.Fill(ds,"MONO_TEST_ADAPTER1");
           
            DataRow row = ds.Tables["MONO_TEST_ADAPTER1"].Rows[0];
            row["txt_value"] = "Value updated";

            adapter.Update(ds, "MONO_TEST_ADAPTER1");

            row = null;
            builder = null;
            adapter = null;
            ds = null;

            ReadData(con, "SELECT * FROM MONO_TEST_ADAPTER1");

        }

        static void Delete()
        {
            Console.WriteLine("Delete...");

            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM 
MONO_TEST_ADAPTER1", con);
            adapter.SelectCommand.Transaction = trans;
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
           
            DataSet ds = new DataSet();
            adapter.Fill(ds,"MONO_TEST_ADAPTER1");
           
            ds.Tables["MONO_TEST_ADAPTER1"].Rows[0].Delete();

            adapter.Update(ds, "MONO_TEST_ADAPTER1");

            builder = null;
            adapter = null;
            ds = null;

            ReadData(con, "SELECT * FROM MONO_TEST_ADAPTER1");

        }

        private static void ReadData(IDbConnection con, string sql)
        {
            IDbCommand cmd = con.CreateCommand();
            cmd.Transaction = trans;
            cmd.CommandText = sql;
            IDataReader reader = cmd.ExecuteReader();
            int rows = 0;
            while(reader.Read()) {
                Console.WriteLine("Value 0: {0}", reader[0]);
                Console.WriteLine("Value 0: {0}", reader[1]);
                rows++;
            }
            Console.WriteLine("Rows retrieved: {0}", rows);
            reader.Close();
            reader = null;
            cmd.Dispose();
            cmd = null;
        }
    }
}






More information about the Mono-devel-list mailing list