2010-10-21 13 views
12

Sono nuovo su .NET e ho sentito parlare di diversi modi di interrogare un database SQL Server come ADO.NET e il framework di entità.Il modo migliore per accedere a un database SQL Server tramite C# .Net

Qualcuno può darmi qualche consiglio sul modo migliore di andare per nuove applicazioni?

Grazie per qualsiasi aiuto o suggerimento.

+0

Quanta esperienza di programmazione hai? Hai usato i database prima? – Onkelborg

+0

Ho alcune conoscenze di base in C# e so SQL, non ho avuto accesso ad un db in un programma C# prima. – user483267

+1

Questa è una domanda aperta. Qualsiasi buona risposta dipenderà da ciò che si vuole fare, dal lasso di tempo con cui si deve lavorare e da ciò che si è già familiari/a proprio agio. – jac

risposta

10

Ecco un esempio di utilizzo EF con la generazione del codice dalla banca dati (per un'applicazione reale probabilmente vuoi generare il tuo DB dal codice, invece):

  1. Fare clic con il tasto destro sul progetto >> Aggiungi >> Nuovo I tem >> Modello dati Entity ADO.NET.
  2. Scegli un nome per le entità cioè MyEntities.edmx, fare clic su Avanti
  3. Selezionare "Genera da database"
  4. Configurare una 'nuova connessione' se non ce n'è uno già lì. Il prossimo.
  5. Selezionare le tabelle, le viste e i SPROC che si desidera includere nelle entità. Finire.

Verrà aggiunto un file MyEntities.edmx al progetto. Puoi aprirlo in visualizzazione struttura per vedere un diagramma delle tue entità e relazioni. Nota che ogni entità dovrebbe avere una chiave primaria - il modo più semplice per farlo è aggiungere un ID - campo di incremento automatico per ogni tabella o una colonna GUID. Ad ogni modo ora è possibile interrogare il db in questo modo:

// assuming a "Product" table, which has an entity pluralized to "Products" 

MyEntities db = new MyEntities(); 

var cheapProducts = db.Products.Where(p => p.Price > 30); // var is IEnumerable<Product> 
2

NHibernate è la strada da percorrere. Vedere http://nhforge.org e http://sf.net/projects/nhibernate per ulteriori informazioni.

La differenza principale tra Entity Framework e NHibernate è che Entity Framework è solo per Microsoft SQL Server (Oracle è supportato, ma il supporto non è l'ideale). NHibernate supporta i database many many many.

+1

Considerate anche di ottenere Fluent NHibernate se scegliete questa opzione. –

2

Entity Framework è il più facile, e il suo costruito in.

Tutto quello che dovete fare è importante il vostro modello, e poi basta aggiornare le classi semplici, che sono mappati automaticamente al vostro db.

È proprio come aggiornare gli oggetti normali, ma alla fine si chiama SaveChanges.

+1

Se stai iniziando un progetto che durerà per alcuni anni, non usare EF. Inquina i tuoi oggetti di dominio con informazioni di stato. Ti costringerà a utilizzare uno stile di codifica specifico ... Gli strumenti VisualStudio per EF sono supportati a metà. Per i progetti lunghi raccomanderò di utilizzare NHibernate. –

+0

Tale BS, fuori dalla scatola si ottiene entità con stato. Ma ci sono altre opzioni molto semplici. Hai appena guardato EF di recente? Lascia che ti aiuti .. (http://channel9.msdn.com/Blogs/wriju/POCO-Template-in-ADONET-Entity-Framework) – Nix

2

LINQ to SQL è piuttosto facile da utilizzare. È possibile trascinare e rilasciare le tabelle del database nella finestra di progettazione e scrivere query molto semplici in pochi minuti.

NorthwindDataContext db = new NorthwindDataContext(); 

    var products = from p in db.Products 
        select p; 

Il che in pratica si traducono in SELECT * FROM Prodotti

Alcuni altri esempi selezionati:

var products = from p in db.Products 
        where p.Category.Name == "Beverages" 
        select p; 

    var products = from p in db.Products 
        orderby p.Name 
        select p; 
+2

'var products = db.Products;' – SLaks

+1

Tentativo di mostrare la sintassi LINQ ... che è in qualche modo simile a SQL – Dismissile

+0

Per una soluzione ORM generica su un nuovo progetto vorrei andare con NHibernate su Linq-to-sql ma questo sarà probabilmente più facile da lavorare con out of the box. – flatline

2

A mio parere la soluzione migliore è quella di creare classe intermedia tra il db e di applicazione (un certo tipo di livello di dati), che un certo numero di metodi per gestire le query. descrizione sotto base su SQLite come analogia a SQLServer (connettore ADO)

classe oggetto possono da Singleton, e si può chiamare esempio dove vuoi nella vostra applicazione - per SQLite si può sembra che:

private static SQLite instance; 

public static SQLite getInstance() 
{ 
    if(instance == null) 
    { 
    instance = new SQLite(); 
    thread = Thread.CurrentThread.ManagedThreadId; 
    } 
    return instance; 
} 

È possibile ottenere l'istanza in questo modo:

SQLite db = SQLite.getInstance(); 

questa classe può contenere più metodi per la manipolazione dei dati, ad esempio:

public SQLiteCommand prepareQuery(string sql) 
{ 
    cmd = new SQLiteCommand(sql, conn); 
    return cmd; 
} 

public SQLiteDataReader executeReader() 
{ 
    return cmd.ExecuteReader(); 
} 

public int executeInt() 
{ 
    object obj = cmd.ExecuteScalar(); 
    return (int)obj; 
} 

ma anche metodi di gestione delle transazioni e di diagnostica. Quindi, ora puoi utilizzare questa classe simile nell'applicazione se disponi di altri sorgenti db o anche tipi db, puoi creare il prossimo livello dati (ad esempio per Oracle o MSSQL, MySQL ...) ognuno dei quali ha implementazioni la stessa interfaccia per esempio:

IDataBase 

e ora, si ha una sorta di facciata, che è possibile sostituire, se necessario dynamicly. Da questo momento l'uso di db in application è concentrato in un punto, ed è un puro piacere per il programmatore utilizzarlo - questo è il mio suggerimento.

+1

Probabilmente è più semplice utilizzare un'astrazione DB preesistente piuttosto che girare il proprio, a meno che l'obiettivo dell'OP non sia puramente educativo. – Jimmy

+0

In questa situazione è difficile ottenere uno strato uniforme compatibile con tutti gli abbonati – UGEEN

Problemi correlati