[Mono-list] DbDataAdapter in ADO.NET Provider Factory
Brian Ritchie
brianlritchie@hotmail.com
Tue, 12 Nov 2002 00:03:41 -0500
Daniel,
Thanks for reminding me about the DataAdapter...we wouldn't want Tim's hard
work to go to waste. :-)
I've jacked in data adapter support. I'm using the app.config to supply the
type names (instead of hard coding it in the factory).
Here's the syntax:
// Create Connection
IDbConnection conn =
ProviderFactory.CreateConnectionFromConfig("TdsPubsConnStr");
// Select command
IDbCommand cmd=conn.CreateCommand();
cmd.Text="select * from author";
// Data Adapter
DataSet ds=new DataSet();
IDbDataAdapter adapter=ProviderFactory.CreateDataAdapter(cmd);
adapter.Fill(ds, "Table1");
-- or for the lazy among us :) --
// Create Connection
IDbConnection conn =
ProviderFactory.CreateConnectionFromConfig("TdsPubsConnStr");
// Data Adapter
DataSet ds=new DataSet();
IDbDataAdapter adapter=ProviderFactory.CreateAdapter(conn, "select * from
author");
adapter.Fill(ds, "Table1");
--- or for the super lazy among us (like me) ---
// Create Connection
IDbConnection conn =
ProviderFactory.CreateConnectionFromConfig("TdsPubsConnStr");
// Data Adapter
DataSet ds=DataTools.FillDataSet(conn, "select * from author");
Let me know if this will work for you. I'm should have the code committed
this evening. (I hope).
Brian
>From: "Daniel Morgan" <danmorg@sc.rr.com>
>To: "Tim Coleman" <tim@timcoleman.com>, <rodrigo@ximian.com>, "Brian
>Ritchie" <brianlritchie@hotmail.com>
>CC: <mono-list@ximian.com>
>Subject: [Mono-list] DbDataAdapter in ADO.NET Provider Factory
>Date: Mon, 11 Nov 2002 14:14:52 -0500
>
>Brian,
>
>Can you add the ability to dynamically create a DbDataAdapter for a given
>connection class generically?
>
>I would l like to use the adapter in provider generic code. I've also
>provided sample code that could create the DbDataAdapter for an ADO.NET
>data
>provider.
>
>What do you think?
>
> // data provider generic code
> IDbConnection conn =
>ProviderFactory.CreateConnectionFromConfig("TdsPubsConnStr");
> CreateXmlFileFromSqlQuery("select * from employee", "employee.xml",
> conn, "Mono.Data.TdsClient");
>
> public void CreateXmlFileFromSqlQuery (string sql, string filename,
> IDbConnection conn, string providerAssembly) {
>
> IDbCommand cmd = conn.CreateCommand();
>
> // set command properties
> cmd.CommandType = CommandType.Text;
> cmd.CommandText = sql;
> cmd.Connection = conn;
>
> DataSet dataSet = new DataSet ();
> DataAdapter adapter = CreateNewDataAdapter (cmd, conn);
> adapter.Fill (dataSet, "Table1");
> dataSet.WriteXml (filename);
> }
>
> // sample code to create new data adapter generically
> public DataAdapter CreateNewDataAdapter (string provider,
> string providerAssembly,
> IDbConnection connection, IDbCommand command) {
>
> DataAdapter adapter = null;
>
> switch(provider) {
> case "ODBC":
> adapter = (DataAdapter) new OdbcDataAdapter ();
> break;
> case "OLEDB":
> adapter = (DataAdapter) new OleDataAdapter ();
> break;
> case "SQLCLIENT":
> adapter = (DataAdapter) new SqlDataAdapter ();
> break;
> case "LOADEXTPROVIDER":
> adapter = CreateExternalDataAdapter ();
> if (adapter == null)
> return;
> break;
> default:
> Console.WriteLine("Error: Data Adapter not found in provider.");
> return;
> }
> IDbDataAdapter dbAdapter = (IDbDataAdapter) adapter;
> dbAdapter.SelectCommand = command;
>
> return adapter;
> }
>
> // sample code for loading the concrete subclass of DbDataAdapter
> // Thanks to Gonzalo for helping me with this
> public DataAdapter CreateExternalDataAdapter (string providerAssembly) {
>
> Assembly ass = Assembly.Load (providerAssembly);
> Type [] types = ass.GetTypes ();
> foreach (Type t in types) {
> if (t.IsSubClassOf ("System.Data.DbDataAdapter") == false)
> continue;
> }
> if (t.IsSubClassOf ("System.Data.DbDataAdapter") == false)
> return null; // adapter class not found
>
> adapter = (DataAdapter) Activator.CreateInstance (t);
>
> return adapter;
> }
>
>-----Original Message-----
>From: mono-list-admin@ximian.com [mailto:mono-list-admin@ximian.com]On
>Behalf Of Brian Ritchieo u
>Sent: Saturday, November 09, 2002 11:59 AM
>To: rodrigo@ximian.com
>Cc: mono-list@ximian.com
>Subject: Re: [Mono-list] ADO.NET Provider Factory
>
>
>Rodrigo,
>
>Thanks for the review. I guess great minds think alike...I actually
>already
>had a CreateConnectionFromConfig. :)
>
>Here's the syntax for it:
>
>IDbConnection
>conn=ProviderFactory.CreateConnectionFromConfig("PubsConnStr");
>
><appSettings>
> <add key="PubsConnStr" value="factory=System.Data.SqlClient;
>server=speedy;database=pubs;uid=sa;pwd=" />
></appSettings>
>
>The factory attribute specifies which provider to use. I parse out the
>factory attribute, crete the object, and then pass the rest of the
>connection string into the provider. The providers are definited in the
>app.config (or machine.config).
>
>I'll get the code commited sometime today.
>
>Brian
>
>
> >From: Rodrigo Moya <rodrigo@ximian.com>
> >To: Brian Ritchie <brianlritchie@hotmail.com>
> >CC: Mono List <mono-list@ximian.com>
> >Subject: Re: [Mono-list] ADO.NET Provider Factory
> >Date: 09 Nov 2002 12:15:52 +0100
> >
> >On Mon, 2002-11-04 at 06:37, Brian Ritchie wrote:
> > > I've started work on the set of objects known as... "ADO.NET
> > > Multiplexor Provider" in... http://www.go-mono.com/ado-net.html
> > >
> > > I'd appreciate the ADO.NET team to review this (and attached files)
> > > before I commit things to CVS. I'm planning to put them under
> > > /mcs/class/Mono.Data. Please note: connection strings will in attached
> > > files will need to be updated to match your configuration. I've done
> > > some basic testing of the code under MS.NET & Mono on Windows.
> > >
> >it looks ok to me. I would also add one thing though, which is a way to
> >activate a given provider/connection string without having to know the
> >provider to be used. That is, something like the ODBC (or libgda) data
> >sources, on which you store, under a unique name, all parameteres needed
> >for the connection to be established. Something like:
> >
> >IDbConnection cnc = ProviderFactory.CreateConnectionFromConfig
> >("my_data_source");
> >
> >and then have, in the config file, an entry called "my_data_source"
> >which contains the info for the provider and connection string to be
> >used to open this given connection.
> >
> >Apart from that, it looks ok to me, so please commit as soon as you can.
> >
> >and sorry for the delay in answering, but I've been really busy these
> >last weeks.
> >
> >cheers
> >--
> >Rodrigo Moya <rodrigo@ximian.com>
>
>
>_________________________________________________________________
>Help STOP SPAM with the new MSN 8 and get 2 months FREE*
>http://join.msn.com/?page=features/junkmail
>
>
>_______________________________________________
>Mono-list maillist - Mono-list@ximian.com
>http://lists.ximian.com/mailman/listinfo/mono-list
>
>
>_______________________________________________
>Mono-list maillist - Mono-list@ximian.com
>http://lists.ximian.com/mailman/listinfo/mono-list
_________________________________________________________________
Help STOP SPAM with the new MSN 8 and get 2 months FREE*
http://join.msn.com/?page=features/junkmail