webForumDet fria alternativet

Olika MSDB's?

6 svar · 438 visningar · startad av Travoni

TravoniMedlem sedan okt. 20041 556 inlägg
#1

Hur programerar man för att kunna använda olika typer av databaser till en och samma applikation.

Ex. så att man skall ex både kunna använda mySql och msSql. (Dock ej samtidigt...)

NickemannenMedlem sedan aug. 20003 575 inlägg
#2

Använd NHibernate eller CastleProject som bygger på NHibernate.

ZaimanMedlem sedan dec. 20014 239 inlägg
#3

Tja..
Ett sätt är väl att sätta någon typ av variabel och kontrollera mot den om frågor ska vara si eller så. Det är ju en del skillnade mellan MySQL och MSSQL så en del dubbeljobb blir det .

LukaspojkenMedlem sedan maj 20011 312 inlägg
#4

Menar du att "samma" select-satser ska köras mot de olika databaserna? Det skiljer sig som sagt lite i syntax.

TravoniMedlem sedan okt. 20041 556 inlägg
#5

Jo, jag vet det, tänkte att man kanske kunde använda en resoursefil eller likande för selectsatserna, men jag vet inte riktigt vad som är bäst.
nHibernate eller CastleProject verkar så tung-rott :)

emissionMedlem sedan dec. 19996 721 inlägg
#6

Travoni skrev:

Jo, jag vet det, tänkte att man kanske kunde använda en resoursefil eller likande för selectsatserna, men jag vet inte riktigt vad som är bäst.
nHibernate eller CastleProject verkar så tung-rott :)

Det är inte så tungrott, i synnerhet inte ActiveRecord (den del av CastleProject som är relevant i denna diskussion), men det är å andra sidan heller inte vad du efterfrågar, eftersom NHibernate och ActiveRecord är OR-mappers.

Microsofts Data Application Block innehåller en hel del för att underlätta och abstrahera dataaccess, så det kan vara en bra utgångspunkt.

GladhMedlem sedan maj 20012 812 inlägg
#7

Travoni skrev:

Hur programerar man för att kunna använda olika typer av databaser till en och samma applikation.

Ex. så att man skall ex både kunna använda mySql och msSql. (Dock ej samtidigt...)

Det smidigaste sättet att lösa det på är med Interfaces. Alltså du skapar ett interface som heter typ: Databas. Och på det interfacet så skapar du sedan olika metoder säg typ Select(). Så här.

public interface IDatabas{
   DataTable Select(string sqlStatement);
}

om du sedan skapar nya classer för varje databastyp som du vill kunna koppla mot så ser du till så att dessa classer implementerar interfacet, alltså classerna har de metoder som interfacet har.

public class SqlServer : IDatabas{

  private DataTable Select(string sqlStatement){
      SqlDataAdapter sqlDataAdapter = new ();
      . . . 
      return dataTable;
   }

  //-- Implements IDatabas methods
  DataTable IDatabas.Select(string sqlStatement){
      return Select(sqlStatement);
  }
}

Du kan sedan i din kod helt enkelt själv skapa vilken databas du vill anropa genom att skapa en instans av den klassen och typcasta den till ditt interface och sedan så låter du ditt program ALLTID anropa interfacet i din kod, typ så här:

public static void main(DatabasEnum databasEnum){
    IDatabas databas;

    switch(databasEnum){ 
      case DatabasEnum.SqlServer:
          databas = new SqlServer();
          break;
      case DatabasEnum.MySql:
          databas = new MySql();
          break;
    }

    //-- Time to fetch som data from some database
    DataTable result = databas.Select("SELECT * FROM [Table1]");
}

Så nu kan du skifta ut vilken databas du använder genom att bara ändra värdet på DatabasEnum som du skickar in i metoden. Här har du grunden för hur du skall lösa det, problemet här är att den inte är helt generell eftersom den SELECT sats som du skriver in kan se olika ut i olika databashanterare. Så det betyder att din inte bara kan skifta din databas hur som helst eftersom de SELECT-satser som du skriver in kanske inte fungerar i alla databaser.

Därför måste du se till så man inte kan skriva in egna SELECT satser utan man helt enkelt får skicka in din typ av selectsats och sedan måste du för varje databas omvandla det till en korrekt SELECT sats, typ så här.

DataTable result = databas.SELECT(string[] cols, string table);

Där du skickar in vilka kolumner som du vill hämta från databasen samt från vilken tabell. Nu kan du i varje databasklass bygga upp en korrekt SELECT sträng och skicka den till databasen, jobbigt, men din applikation är totalt oberoende av vilken databas som finns i botten, du skulle kunna använda dig av en XML-fil istället om du vill, eller varför inte data från ett ActiveDirectory. Låt fantiasin flöda på alla tänkbara lagringsställe du kan hitta på...

- M

127 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)