Http:// Tiger Computer Services Ltd Using Interfaces in.NET Simplifying access to multiple DB...

Preview:

Citation preview

http://www.tigernews.co.ukTiger Computer Services Ltd

Using Interfaces in .NETSimplifying access to multiple DB providers in .NET

Liam Westley liam.westley@tigernews.co.uk

DeveloperDeveloperDeveloper! - 14th May 2005

http://www.tigernews.co.uk

Contents

• Quick overview of interfaces– What is an interface?– When and how to use an interface?

• Using interfaces for generic access to different DB Providers– Abstracting the differences– Creating and implementing the interface– MP3 library code walkthrough for SQL

Server 2000 and mySQL 4.1

http://www.tigernews.co.uk

Interfaces vs Inheritance?

• Inheritance– inheritance defines an ‘is a’ relationship– .NET only supports single inheritance– if a class does not override a member,

the base class implementation is used

• Interfaces– interfaces define an ‘act as’ relationship– a class can implement multiple interfaces

Note: Visual Basic 6.0 supported Interfaces with the Implements keyword but it involved ‘casting’ of objects to the required interface

http://www.tigernews.co.uk

What is an Interface?

• Defines a set of properties, indexers, events and methods

• Contains no implementation code• Other classes, which implement the

interface, provide the implementation of the interface members

• Every member has to be implemented• The interface does not define how the

members should be implemented

http://www.tigernews.co.uk

When to use an Interface?

• For an ‘acts as’ relationship• To enforce a set of rules for a class

– application plug-ins– to create a ‘lowest common denominator’

• To support multi-‘platform’ solutions– client program uses the interface to access

majority of functionality– each ‘platform’ has a class which implements

the interface – Platforms include Windows App, ASP.NET, .NET

Compact Framework, or different DB providers

http://www.tigernews.co.uk

Creating an interface – VB.NETPublic Interface IHelloWorld

Function HelloWorld(ByVal myName As String) As String

End Interface

Public Class English Implements IHelloWorld

Public Function HelloWorld(ByVal myName As String) _ As String Implements IHelloWorld.HelloWorld HelloWorld = "Hello " + myName + "!" End FunctionEnd Class

Interface(IHelloWorld.vb)

Implementation(English.vb)

Public Class Francais Implements IHelloWorld

Public Function HelloWorld(ByVal myName As String) _ As String Implements IHelloWorld.HelloWorld HelloWorld = “Bonjour " + myName + "!" End FunctionEnd Class

Implementation(Francais.vb)

http://www.tigernews.co.uk

Using that interface – VB.NET

Private Sub btnSayHello_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles btnSayHello.Click Dim hw As IHelloWorld

If (rbtnEnglish.Checked) Then hw = New English Else hw = New Francais End If

MsgBox(hw.HelloWorld(txtName.Text))End Sub

Windows Form application

http://www.tigernews.co.uk

Creating an interface – C#public interface IHelloWorld{

string HelloWorld(string myName);}

public class English : IHelloWorld{

public string HelloWorld(string myName){

return "Hello " + myName + "!";}

}

Interface(IHelloWorld.cs)

Implementation(English.cs)

public class Francais : IHelloWorld{

public string HelloWorld(string myName){

return “Bonjour " + myName + "!";}

}

Implementation(Francais.cs)

http://www.tigernews.co.uk

Using that interface – C#

private void btnSayHello_Click(object sender, System.EventArgs e){

IHelloWorld hw;

if (rbtnEnglish.Checked){

hw = new English(); }else{

hw = new Francais(); }

MessageBox.Show(hw.HelloWorld(txtName.Text));

}

Windows Form application

http://www.tigernews.co.uk

Real World – Generic DB Providers

• First some facts ?– ADO ‘classic’ or ADOc provided a generic

data access model– ADO.NET is not generic –we have

namespaces for each DB provider i.e. SQLConnection, OracleConnection etc..

• Not true !!– Microsoft provided generic database

access out of the box – Look in the MSDN Library carefully,

i.e. IDBConnection, IDBCommand etc..

http://www.tigernews.co.uk

How do we use these interfaces?

• Examine the interfaces within the System.Data namespace,– IDBConnection, IDBCommand,

IDataReader, IDBTransaction etc..

• Ensure the business layer members only utilise interface references

public void GetItem(IDBConnection openDB)

• Create DB provider specific variables within the client, and pass these as interfaces to the business layer

http://www.tigernews.co.uk

.. actually, this is not a real generic solution

• Interfaces are not enough, there are SQL syntax issues as well

• What does ‘generic’ really mean– Safely format data used in SQL

statements– ‘Format’ field and table names to allow

reserved names (or spaces – urgh!)– Map .NET data types to different DB

provider data types– Prevent provider specific properties

being used (HasRows property)

http://www.tigernews.co.uk

Quiz time

SQL 2000 vs MySql 4.1

http://www.tigernews.co.uk

… and .NET data connectors differ too

• Can only use methods and properties from System.Data interfaces– HasRows property not in base interfaces

(absent in SQL Server for CE 2.0)– ExecuteXmlReader is only in SqlClient

• Some methods are not supported– MySql .NET connector doesn’t support

the Cancel method on a IDBCommand– Auto incrementing identity fields are not

always returned as System.Int32

http://www.tigernews.co.uk

What do we lose ?

• For code to work with all databases we have to give up some stuff– Stored procedures are not available in

MySql 4.1 (or MS Access, or SQL CE)– Generic data types, no UDTs– All commands must be raw SQL

statements designed to work with all databases

– Code can become less readable• Not for everyone – losing SQL Server

2000 features may not be appropriate

http://www.tigernews.co.uk

What could we gain ?

• Single code logic handling database operations in the business layer

• Multi platform deployment– Intranet might could use SQL Server, but a

public web site implementation could use MySql

• Higher performance with native data connectors, rather than OLEDB connector

• Robust SQL, if you are methodical– LIKE handles quotes and wildcards– No UK/US Date format issues ever again– NULL replacement handled elegantly– Prevent SQL injection attacks

http://www.tigernews.co.uk

MP3Library – ASP.NET application

http://www.tigernews.co.uk

Only a starting point

• View this as a base– more reliable code– more secure code– target multiple platforms; SQL Server

2000, MySql 4.1 Oracle, IBM DB2, SQL Server CE, Microsoft Access

• Next step– create generic database schemas– automated code creation for business

logic, and even web services

http://www.tigernews.co.uk

Bengal RapidDB

• Origins– concept of database compatibility

between SQL 2000, SQL CE and Microsoft Access

– mobile data connectivity via web services, not via standard replication

– automated generation of code libraries and web services

• Key features– lowest common denominator data types– code suitable for .NET CF

http://www.tigernews.co.uk

Bengal RapidDB

http://www.tigernews.co.uk

Thank you

Any questions?

Recommended