2008-08-04 12 views

Odpowiedz

30

@Goyuix - to doskonała czegoś pisemnej z pamięci. testowałem to tutaj - stwierdziłem, że połączenie nie zostało otwarte. W przeciwnym razie bardzo miły.

using System.Data.OleDb; 
... 

using (OleDbConnection conn = new OleDbConnection()) 
{ 
    conn.ConnectionString = "Provider=sqloledb;Data Source=yourServername\\yourInstance;Initial Catalog=databaseName;Integrated Security=SSPI;"; 

    using (OleDbCommand cmd = new OleDbCommand()) 
    { 
     conn.Open(); 
     cmd.Connection = conn; 
     cmd.CommandText = "Select * from yourTable"; 

     using (OleDbDataReader dr = cmd.ExecuteReader()) 
     { 
      while (dr.Read()) 
      { 
       Console.WriteLine(dr["columnName"]); 
      } 
     } 
    } 
} 
16

grubsza i z pamięci, ponieważ nie mam kodu na tym laptopie:

using (OleDBConnection conn = new OleDbConnection()) 
{ 
    conn.ConnectionString = "Whatever connection string"; 

    using (OleDbCommand cmd = new OleDbCommand()) 
    { 
    cmd.Connection = conn; 
    cmd.CommandText = "Select * from CoolTable"; 

    using (OleDbDataReader dr = cmd.ExecuteReader()) 
    { 
     while (dr.Read()) 
     { 
     // do something like Console.WriteLine(dr["column name"] as String); 
     } 
    } 
    } 
} 
10

To zdecydowanie dobry sposób na zrobienie tego. Ale jeśli używasz bazy danych, która obsługuje LINQ do SQL, może być o wiele więcej zabawy. Może to wyglądać mniej więcej tak:

MyDB db = new MyDB("Data Source=..."); 
var q = from db.MyTable 
     select c; 
foreach (var c in q) 
    Console.WriteLine(c.MyField.ToString()); 
7

Jest to alternatywny sposób (DataReader jest szybszy niż ten jeden):

string s = ""; 
SqlConnection conn = new SqlConnection("Server=192.168.1.1;Database=master;Connect Timeout=30;User ID=foobar;Password=raboof;"); 
SqlDataAdapter da = new SqlDataAdapter("SELECT TOP 5 name, dbid FROM sysdatabases", conn); 
DataTable dt = new DataTable(); 

da.Fill(dt); 

for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    s += dt.Rows[i]["name"].ToString() + " -- " + dt.Rows[i]["dbid"].ToString() + "\n"; 
} 

MessageBox.Show(s); 
3

Jeśli zapytań do bazy danych SQL Server (wersja 7 i wyżej) Cię powinien zastąpić klasy OleDb odpowiednimi klasami w przestrzeni nazw System.Data.SqlClient (SqlConnection, SqlCommand i SqlDataReader), ponieważ te klasy zostały zoptymalizowane do pracy z SQL Server.

Inną rzeczą, na którą należy zwrócić uwagę, jest to, że nie należy nigdy wybierać wszystkich, ponieważ może to później prowadzić do nieoczekiwanych wyników, jeśli dodasz lub usuniesz kolumny do tej tabeli.

4

Jeśli zamierzasz czytać dużą liczbę kolumn lub zapisów, warto również zapisać je w pamięci podręcznej i uzyskać dostęp do mocno napisanych metod, np.

using (DbDataReader dr = cmd.ExecuteReader()) { 
    if (dr.Read()) { 
    int idxColumnName = dr.GetOrdinal("columnName"); 
    int idxSomethingElse = dr.GetOrdinal("somethingElse"); 

    do { 
     Console.WriteLine(dr.GetString(idxColumnName)); 
     Console.WriteLine(dr.GetInt32(idxSomethingElse)); 
    } while (dr.Read()); 
    } 
} 
1

Chyba można wypróbować strukturę encji.

using (SchoolDBEntities ctx = new SchoolDBEntities()) 
{ 
    IList<Course> courseList = ctx.GetCoursesByStudentId(1).ToList<Course>(); 
    //do something with courselist here 
} 
Powiązane problemy