Avatar billede dsj Nybegynder
07. maj 2004 - 10:35 Der 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?
Avatar billede arne_v Ekspert
07. maj 2004 - 10:43 #1
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)
Avatar billede dsj Nybegynder
07. maj 2004 - 10:53 #2
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.
Avatar billede arne_v Ekspert
07. maj 2004 - 10:56 #3
SQLServer Desktop Edition er gratis ...
Avatar billede arne_v Ekspert
07. maj 2004 - 10:59 #4
Det ser ud som om at cyberfessors svar med hans lille db klasse gik tabt
sammen med de 13000 andre spørgsmål
Avatar billede dsj Nybegynder
07. maj 2004 - 10:59 #5
Det er ikke godt nok, det er stadig lettere at smide en access-db rundt, end at alle i projektgruppen skal lære SQL Server :)
Avatar billede arne_v Ekspert
07. maj 2004 - 10:59 #6
Men ellers må man da hurtigt kunne bikse den lille factory klasse sammen
Avatar billede dsj Nybegynder
07. maj 2004 - 10:59 #7
skod - kan du ikke lige kalde på ham ;)
Avatar billede dsj Nybegynder
07. maj 2004 - 11:02 #8
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.
Avatar billede arne_v Ekspert
07. maj 2004 - 11:03 #9
Ja - System.Data.I*
Avatar billede dsj Nybegynder
07. maj 2004 - 11:10 #10
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.
Avatar billede arne_v Ekspert
07. maj 2004 - 11:15 #11
svar
Avatar billede arne_v Ekspert
07. maj 2004 - 11:16 #12
Og lidt 5 minutters kode:

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();
    }
}
Avatar billede dsj Nybegynder
07. maj 2004 - 11:18 #13
Ja fint ska det jo være :)
Avatar billede guidmaster Nybegynder
07. maj 2004 - 11:57 #14
Avatar billede arne_v Ekspert
07. maj 2004 - 12:57 #15
Min forbedrede version:

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");
    }
}
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester