07. maj 2004 - 10:35Der er
14 kommentarer og 1 løsning
Komponent til at skifte mellem forskellige databaser
Jeg mangler en komponent, som gør det let for mig i koden at skifte mellem forskellige databaser, f.eks. SQL Server og Access. Er der nogen der har en eller ved hvor jeg kan finde en?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Spørgsmål: hvorfor bruger du ikke bare System.Data.OleDb eller System.Data.Odbc klasser, så er det kun et spørgsmål om at skifte connection string for alle databaser der har henholdsvis en OLE DB eller en ODBC driver (og det er de fleste).
Ellers kan du nemt lave en lille factory som returnerer System.Data.I* interfaces.
cyberfessor har noget i den stil liggende (søg evt. i gamle spørgsmål)
Svar: Fordi SqlClient er optimeret til SQL Server, som systemet endeligt skal køre mod. Dog har jeg ikke en SQL Server liggende, så det ville være rart lige at kunne teste mod Access. Samtidig er det også lettere at distribuere en access-db i min projektgruppe, som folk kan teste mod.
Jeg har hørt fra en anden, at en sådan komponent allerede ligger her, men jeg kan virkelig ikke finde den... Samtidig er mit kendskab til database-strukturen i .NET stadig lidt begrænset.
SqlClient.SqlDataReader, implementerer den et interface et eller andet sted? Jeg ville gerne have nogle metoder der håndterer database-tilgangen og returnerer DataReader's og DataSet's, så Business-laget ikke skal ændres efter database-type.
ahhhh, med I foran :) Jeg sad og ledte efter System.Data.DataReader, som jo ikke findes. Først troede jeg at den ikke implementerede nogen interfaces, og så ville det næsten være umuligt at lave en generel db-komponent. Nåh men det er let nok så, du må gerne smide et svar.
using System; using System.Data; using System.Data.SqlClient; using System.Data.OleDb;
public class MultiDb { public const int SQLSERVER = 1; public const int ACCESS = 2; public static IDbConnection GetConnection(int type) { switch(type) { case SQLSERVER: return new SqlConnection("server=ARNEPC2;Integrated Security=SSPI;database=Test");; case ACCESS: return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Database\\MSAccess\\Test.mdb"); default: return null; } } public static IDbCommand GetCommand(string sqlstr, IDbConnection con, int type) { switch(type) { case SQLSERVER: return new SqlCommand(sqlstr, (SqlConnection)con); case ACCESS: return new OleDbCommand(sqlstr, (OleDbConnection)con); default: return null; } } }
class MainClass { public static void Main(string[] args) { IDbConnection con1 = MultiDb.GetConnection(MultiDb.ACCESS); con1.Open(); IDbCommand cmd1 = MultiDb.GetCommand("SELECT * FROM T1", con1, MultiDb.ACCESS); IDataReader rdr1 = cmd1.ExecuteReader(); while(rdr1.Read()) { int f1 = (int)rdr1[0]; string f2 = (string)rdr1[1]; Console.WriteLine(f1 + " " + f2); } con1.Close(); } }
using System; using System.Data; using System.Data.SqlClient; using System.Data.OleDb; using System.Data.Odbc;
public class MultiDb { public static IDbConnection GetConnection(string constr) { if(constr.ToUpper().IndexOf("DRIVER=") >= 0) { return new OdbcConnection(constr); } else if(constr.ToUpper().IndexOf("PROVIDER=") >= 0) { return new OleDbConnection(constr); } else if(constr.ToUpper().IndexOf("TRUSTED_CONNECTION=") >= 0 || constr.ToUpper().IndexOf("INTEGRATED SECURITY=") >= 0) { return new SqlConnection(constr); } else { return null; } } }
class TestClass { private static void test(string constr) { IDbConnection con = MultiDb.GetConnection(constr); con.Open(); IDbCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT * FROM T1"; IDataReader rdr = cmd.ExecuteReader(); while(rdr.Read()) { int f1 = (int)rdr[0]; string f2 = (string)rdr[1]; Console.WriteLine(f1 + " " + f2); } con.Close(); } public static void Main(string[] args) { test("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Database\\MSAccess\\Test.mdb"); test("server=ARNEPC2;Integrated Security=SSPI;database=Test"); } }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.