It is a bit flat, but you could definitely extend it however you needed. Actually, you could just overload DataRead and add a ref parameter to return the IDataReader interface you need. Or another overload for another interface, etc. etc. They're all doing basically the same thing (reading data out of a db), so I'd try to just use the DataRead method.
GetSQLToken is my way of avoiding hard-coding ' and % all over my SQL. It also helps support talking to different DBMS at run time, even reading from one and updating to another. The different delimiters/tokens are represented in this enumeration: public enum FTSQLTokens { deSQLTk_Concat = 1, //Concatenation character; SQL = +, Access = & deSQLTk_DelimQuote = 2, //String delimiter; SQL = ', Access = " deSQLTk_DelimDate = 3, //Date delimiter deSQLTk_DateFmt = 4, //Date format deSQLTk_TimeFmt = 5, //Time format deSQLTk_EmbeddedQuote = 6,//Embedded quote deSQLTk_WildcardDel = 7, //Wildcard used in DELETE statment deSQLTk_WildcardSel = 8, //Wildcard used in SELECT statment deSQLTk_WildcardLike = 9, //Wildcard used by LIKE operator deSQLTk_DateTimeFmt = 10 //Complete DateTime format }; string IFTDBServices.GetSQLToken (IFTDataServices.FTSQLTokens sqt) { //Return the appropriate token for the database back-end specified in the connect string //Only SQL Server in this implementation string strTmp = ""; string strDF = "yyyyMMdd"; //Case-sensitive string strTF = "HHmmss"; //Case-sensitive try { switch (mifcDS.DBType()) //SQL Server { case IFTDataServices.FTDBType.deSQL: switch (sqt) { case IFTDataServices.FTSQLTokens.deSQLTk_Concat: strTmp = "+"; break; case IFTDataServices.FTSQLTokens.deSQLTk_DateFmt: strTmp = strDF; break; case IFTDataServices.FTSQLTokens.deSQLTk_DelimDate: strTmp = "'"; break; case IFTDataServices.FTSQLTokens.deSQLTk_DelimQuote: strTmp = "'"; break; case IFTDataServices.FTSQLTokens.deSQLTk_EmbeddedQuote: strTmp = "''"; break; case IFTDataServices.FTSQLTokens.deSQLTk_TimeFmt: strTmp = strTF; break; case IFTDataServices.FTSQLTokens.deSQLTk_WildcardDel: strTmp = ""; break; case IFTDataServices.FTSQLTokens.deSQLTk_WildcardLike: strTmp = "%"; break; case IFTDataServices.FTSQLTokens.deSQLTk_WildcardSel: strTmp = "*"; break; case IFTDataServices.FTSQLTokens.deSQLTk_DateTimeFmt: strTmp = strDF + " " + strTF; break; } break; } } catch(System.Exception ex) { throw ex; } return strTmp; } -----Original Message----- From: dotnet discussion [mailto:[EMAIL PROTECTED]] On Behalf Of Murphy, James Sent: Tuesday, April 30, 2002 4:13 PM To: [EMAIL PROTECTED] Subject: Re: [DOTNET] How are you supporting multiple DB vendors? Hey - this is great. The interface is a little flat for me but I could imagine extending it slightly to return lower level objects if I needed them. Like an IDataReader for things that return rowsets. I'd be interested to learn a little more about GetSQLToken (IFTDataServices.FTSQLTokens sqt). The SQL syntax used to generate the queries is a large part of what I'm talking about. Bridging Object-Relational gap is something I'm looking into as a follow-up. Your method [1] looks really promising. Do you provide a schema generation capability with this approach too? Jim > -----Original Message----- > From: Dan Souk [mailto:[EMAIL PROTECTED]] > Sent: Tuesday, April 30, 2002 4:46 PM > To: [EMAIL PROTECTED] > Subject: Re: [DOTNET] How are you supporting multiple DB vendors? > > > Why not build your own, simpler interfaces? I built a set of > interfaces, > with default implementations for Access and SQL Server. Talk to Access > with OleDbConnection, SQL with SqlConnection. Business > objects implement > a higher-level interface [1] that lets them instantiate an object's > properties from a table row, which in turn works with the > implementation > of this interface. If/when I have to support another DBMS, I'll just > write another implementation against the IFTDBServices interface, and > applications won't know any different. Obviously, the SQL syntax used > must be supported by the DBMS, but is really a separate problem IMHO. > Here's the core interface I use to talk to a DB: > > using System; > > namespace FinnaTech.Data.IFTDataServices > { > /// <summary> > /// FinnaTech database services interface. > /// </summary> > public interface IFTDBServices > { > string ConnectString{get; set;} > IFTDataServices.FTDBType DBType (); > void CloseConnection(); > bool Connected(); > void CreateConnection(); > string DataRead(string SQL, string className); //Sends > back an XML doc as a string. Can easily be overloaded to send back a > stream, the doc itself, etc. > bool DataWrite (string SQL, > System.Data.CommandType ct, > bool useTrans); > string GetSQLToken (IFTDataServices.FTSQLTokens sqt); > > void TranBegin(); > void TranCommit(); > void TranRollback(); > } > } > > The GetSQLToken method provides limited support for building > SQL strings > for different DBs by returning the appropriate delimiter for passing > strings within single quotes, dates in yyyymmdd format, a > standard date > format for the DB, etc. > > [1] This interface translates table columns to object properties, but > does not hard-code the columns to properties. Instead, a collection of > field objects is built based on the field names passed in. SQL > statements are generated based on the fields used by that particular > instance of the business object. Enormously less maintenance than > hard-coding columns to properties:). > > > > > -----Original Message----- > From: dotnet discussion [mailto:[EMAIL PROTECTED]] > On Behalf Of > Murphy, James > Sent: Tuesday, April 30, 2002 2:18 PM > To: [EMAIL PROTECTED] > Subject: [DOTNET] How are you supporting multiple DB vendors? > > > I'm curious what folks are using to abstract the underlying DBMS from > your > .NET apps. I know lots of shops that just pick a RDBMS and > run with it > - > and have simpler designs - that would be nice. But lets say > you need to > support both ORACLE and SQL Server? > > You can program to the ADO.NET interfaces so instead of > SqlConnection or > OleDdConnection use IDbConnection or use OleDdConnection always and > sacrifice performance. But what about the actual SQL statements? How > do > you virtualize the variants? String tables in resource only > assemblies? > Do > you put everything in stored procs and simplify the SQL > embedded in your > code? Or Don't use stored procs because you have SQL statement > generation > code a la RogueWave's DBTools. > > I'd love to hear all strategies big and small. > > Thanks > Jim > > You can read messages from the DOTNET archive, unsubscribe > from DOTNET, > or > subscribe to other DevelopMentor lists at http://discuss.develop.com. > > You can read messages from the DOTNET archive, unsubscribe > from DOTNET, or > subscribe to other DevelopMentor lists at http://discuss.develop.com. > You can read messages from the DOTNET archive, unsubscribe from DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com. You can read messages from the DOTNET archive, unsubscribe from DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com.