Avatar billede kennedk Nybegynder
27. november 2007 - 22:46 Der er 14 kommentarer

3 forskellige databaser

Hej eksperter

jeg sidder og leger med et lille skole projekt, og kom med en sjov ide, som jeg synes der kunne være sjovt at prøve.

Min ide er at man får sådan en pakke man ligger ud på sin server og kører en installionsguide og i den guide vælger man database, fx access mysql mssql, og gemmer login oplsyningerne i en fil.

Men hvordan kan jeg lave alle mine functioner på min hjemmeside, så database udkaldene stadig virker selvom det er en anden slags database.
Det er noget jeg aldrig har prøvet før, men allerede nu kan jeg komme i tanke om det første problem, SQL sætningerne er ikke de samme...

Men er der nogen der har en smart ide som bare virker?

Hilsen kenneth
Avatar billede arne_v Ekspert
27. november 2007 - 22:48 #1
Du laver din kode saa den ikke bruger database specfikke klasser men kun IDbXxxx interfacene
i System.Data og saa bruger du kun standard SQL ingen database specifikke extensions.

Med lidt omhu kan det godt fungere.
Avatar billede kennedk Nybegynder
27. november 2007 - 22:51 #2
Det forstod jeg ikke ret meget af :)
Kan du ikke skære det helt ud i pap, og måske komme med et lille ekspempel?
Avatar billede Slettet bruger
27. november 2007 - 22:53 #3
øhm kender ikke lige overstående løsning men skal jo nok være rigtig når arne siger det ;) .. så vidt jeg har lært det bruger man dbfactory til formålet.
Avatar billede arne_v Ekspert
27. november 2007 - 22:54 #4
Her er et meget simpelt eksempel sakset fra min .NET 2.0 C# 2.0 artikel:

using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;

class MultiDb2
{
    private static void test(string provider, string constr)
    {
        DbProviderFactory dbf = DbProviderFactories.GetFactory(provider);
        IDbConnection con = dbf.CreateConnection();
        con.ConnectionString = 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("System.Data.OleDb", @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb");
        test("System.Data.SqlClient", "server=ARNEPC3;Integrated Security=SSPI;database=Test");
    }
}
Avatar billede arne_v Ekspert
27. november 2007 - 22:55 #5
Ja - man bruger DbProviderFactory til at faa connection og saa creater
man derfra.
Avatar billede arne_v Ekspert
27. november 2007 - 22:56 #6
connection string og provider navn strenge gemmes saa i config fil eller
som i dette tilfaeldes vaelges i GUI
Avatar billede arne_v Ekspert
27. november 2007 - 22:56 #7
Jeg har ogsaa et lidt mere komplekst eksempel liggende (et eller andet sted)
Avatar billede kennedk Nybegynder
27. november 2007 - 23:05 #8
Ja okay :) Det ser faktisk simpelt ud. Må lege med det i skolen i morgen.
Men hvad så hvis man skal lave paging?
Så ville det bedste da kun at hente de felter der skal bruges på aktuel side, hvordan gøres det så med de forskellige databasetyper?
Avatar billede arne_v Ekspert
28. november 2007 - 00:51 #9
Medmindre data er meget store kan du læse ind i en memory struktur og page i den.
Avatar billede kennedk Nybegynder
28. november 2007 - 08:36 #10
Ja det kunne man.
Men hvad så med parametere? Hvordan skal det løsses?
Og det ville være skønt hvis du kunne finde det eksempel du havde til at ligge et eller andet sted (-:
Avatar billede arne_v Ekspert
28. november 2007 - 15:13 #11
using System;
using System.Data;
using System.Data.Common;

namespace E
{
    public class SqlServer4
    {
        public static void Main(string[] args)
        {
            DbProviderFactory dbf = DbProviderFactories.GetFactory("System.Data.SqlClient");
            IDbConnection con = dbf.CreateConnection();
            con.ConnectionString = "server=ARNEPC3\\SQLEXPRESS;Integrated Security=SSPI;database=Test";
            con.Open();
            IDbCommand cre = con.CreateCommand();
            cre.CommandText = "CREATE TABLE j(id INTEGER NOT NULL, txt VARCHAR(50), PRIMARY KEY(id))";
            cre.Connection = con;
            cre.ExecuteNonQuery();
            IDbCommand ins = con.CreateCommand();
              ins.CommandText = "INSERT INTO j VALUES(@id,@txt)";
            ins.Connection = con;
            IDbDataParameter p1 = ins.CreateParameter();
            p1.ParameterName = "@id";
            p1.DbType = DbType.Int32;
            ins.Parameters.Add(p1);
            IDbDataParameter p2 = ins.CreateParameter();
            p2.ParameterName = "@txt";
            p2.DbType = DbType.String;
            p2.Size = 50;
            ins.Parameters.Add(p2);
            for(int i = 0; i < 5; i++)
            {
                ((IDbDataParameter)ins.Parameters["@id"]).Value = i+1;
                ((IDbDataParameter)ins.Parameters["@txt"]).Value = "Test #" + (i+1);
                ins.ExecuteNonQuery();
            }
            IDbCommand sel = con.CreateCommand();
            sel.CommandText = "SELECT id,txt FROM j WHERE id > @lim";
            sel.Connection = con;
            IDbDataParameter p = ins.CreateParameter();
            p.ParameterName = "@lim";
            p.DbType = DbType.Int32;
            p.Value = 3;
            sel.Parameters.Add(p);
            IDataReader rdr = sel.ExecuteReader();
            while(rdr.Read())
            {
                int id = rdr.GetInt32(0);
                String txt = rdr.GetString(1);
                Console.WriteLine(id + " : " + txt);
            }
            rdr.Close();
            IDbCommand drp = con.CreateCommand();
            drp.CommandText = "DROP TABLE j";
            drp.Connection = con;
            drp.ExecuteNonQuery();
            con.Close();
            Console.ReadKey();
        }
    }
}
Avatar billede kennedk Nybegynder
28. november 2007 - 15:58 #12
Jeg takker :) Send svar
Avatar billede arne_v Ekspert
28. november 2007 - 15:59 #13
svar
Avatar billede arne_v Ekspert
09. juni 2008 - 04:56 #14
så mangler du bare at acceptere svaret
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