[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