2009-08-28 35 views
47

Tôi có một số DataTable được điền từ truy vấn SQL vào cơ sở dữ liệu cục bộ, nhưng tôi không biết cách trích xuất dữ liệu từ nó. phương thức Main (trong chương trình thử nghiệm):Làm cách nào để trích xuất dữ liệu từ một DataTable?

static void Main(string[] args) 
{ 
    const string connectionString = "server=localhost\\SQLExpress;database=master;integrated Security=SSPI;"; 
    DataTable table = new DataTable("allPrograms"); 

    using (var conn = new SqlConnection(connectionString)) 
    { 
     Console.WriteLine("connection created successfuly"); 

     string command = "SELECT * FROM Programs"; 

     using (var cmd = new SqlCommand(command, conn)) 
     { 
      Console.WriteLine("command created successfuly"); 

      SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

      conn.Open(); 
      Console.WriteLine("connection opened successfuly"); 
      adapt.Fill(table); 
      conn.Close(); 
      Console.WriteLine("connection closed successfuly"); 
     } 
    } 

    Console.Read(); 
} 

Lệnh tôi sử dụng để tạo các bảng trong cơ sở dữ liệu của tôi:

create table programs 
(
    progid int primary key identity(1,1), 
    name nvarchar(255), 
    description nvarchar(500), 
    iconFile nvarchar(255), 
    installScript nvarchar(255) 
) 

Làm thế nào tôi có thể trích xuất dữ liệu từ DataTable thành một dạng có ý nghĩa sử dụng không?

Trả lời

115

Các DataTable có một bộ sưu tập .Rows của các phần tử DataRow.

Mỗi DataRow tương ứng với một hàng trong cơ sở dữ liệu của bạn và chứa một tập hợp các cột.

Để truy cập vào một giá trị duy nhất, đừng cái gì đó như thế này:

foreach(DataRow row in YourDataTable.Rows) 
{ 
    string name = row["name"].ToString(); 
    string description = row["description"].ToString(); 
    string icoFileName = row["iconFile"].ToString(); 
    string installScript = row["installScript"].ToString(); 
} 

Marc

+2

Tôi biết đây là một câu trả lời cũ, nhưng bạn không cần phải làm một dàn diễn viên trong vòng lặp foreach để cho phép lập chỉ mục? Tôi đã không thể làm điều gì đó như thế này cho đến khi tôi thay đổi mã để trông giống như sau: foreach (Dòng DataRow trong YourDataTable.Rows.Cast ()) ... – awh112

+0

Ngay cả nhận xét cũ hơn, nhưng không cần để cast: 'foreach' hoạt động, bởi vì' Rows' là một tập hợp ('DataRowCollection'). Mặc dù, bạn cần sử dụng '.Cast ()' nếu bạn muốn sử dụng một số phương thức Linq ('.Where()', ví dụ). –

+1

@marc_s Cảm ơn bạn –

16

Bạn có thể đặt dữ liệu có thể định dạng thành nguồn dữ liệu thành nhiều phần tử.

Đối với ví dụ

GridView

repeater

datalist

vv vv

Nếu bạn cần trích xuất dữ liệu từ mỗi hàng sau đó bạn có thể sử dụng

table.rows[rowindex][columnindex] 

hoặc

nếu bạn biết tên cột

table.rows[rowindex][columnname] 

Nếu bạn cần phải lặp bảng sau đó bạn có thể sử dụng một vòng lặp for hoặc một vòng lặp foreach như

for (int i = 0; i < table.rows.length; i ++) 
{ 
    string name = table.rows[i]["columnname"].ToString(); 
} 

foreach (DataRow dr in table.Rows) 
{ 
    string name = dr["columnname"].ToString(); 
} 
+0

foreach (DataRow dr trong bảng) table.Rows – StampedeXV

3

Trừ khi bạn có một lý do cụ thể để làm ado.net liệu tôi sẽ có một cái nhìn tại sử dụng một ORM (đối tượng ánh xạ quan hệ) như nhibernate hoặc LINQ to Sql. Bằng cách đó, bạn có thể truy vấn cơ sở dữ liệu và các đối tượng truy xuất để làm việc với các công cụ được gõ mạnh mẽ và dễ dàng hơn để làm việc với IMHO.

Colin G

+1

Tôi đang có kiến ​​thức cơ bản về ADO.net trước khi chuyển sang ORM theo đề xuất của http://stackoverflow.com/questions/1345508/how-do-i-connect-to-a- sql-database-from-c/1345531 # 1345531 – RCIX

4

Hãy xem xét sử dụng một số mã như thế này:

SqlDataReader reader = command.ExecuteReader(); 
int numRows = 0; 
DataTable dt = new DataTable(); 

dt.Load(reader); 
numRows = dt.Rows.Count; 

string attended_type = ""; 

for (int index = 0; index < numRows; index++) 
{ 
    attended_type = dt.Rows[indice2]["columnname"].ToString(); 
} 

reader.Close(); 
0
var table = Tables[0]; //get first table from Dataset 
    foreach (DataRow row in table.Rows) 
    { 
     foreach (var item in row.ItemArray) 
     { 
      console.Write("Value:"+item); 
     } 
    } 
0

Xin vui lòng, lưu ý rằng Mở và Đóng kết nối là không cần thiết khi sử dụng DataAdapter.

Vì vậy, tôi đề nghị vui lòng cập nhật mã này và loại bỏ các mở và đóng các kết nối:

 SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

conn.Open(); // dòng mã này là uncessessary

 Console.WriteLine("connection opened successfuly"); 
     adapt.Fill(table); 

conn.Close(); // dòng mã này là uncessessary

 Console.WriteLine("connection closed successfuly"); 

Reference Documentation

Mã thể hiện trong ví dụ này không rõ ràng mở và đóng Connection. Phương thức Fill mở hoàn toàn Connection mà DataAdapter đang sử dụng nếu nó phát hiện rằng kết nối chưa được mở là . Nếu Fill mở kết nối, nó cũng đóng kết nối khi Điền xong. Điều này có thể đơn giản hóa mã của bạn khi bạn xử lý một thao tác đơn lẻ như Điền hoặc Cập nhật. Tuy nhiên, nếu bạn đang thực hiện nhiều thao tác yêu cầu kết nối mở, bạn có thể cải thiện hiệu suất của ứng dụng bằng cách gọi một cách rõ ràng Phương thức mở của Kết nối, thực hiện các thao tác với nguồn dữ liệu và sau đó gọi phương thức Đóng của kết nối. Bạn nên cố gắng giữ kết nối với nguồn dữ liệu được mở một thời gian ngắn càng tốt để sử dụng các tài nguyên miễn phí để sử dụng bởi các ứng dụng khách khác.

Các vấn đề liên quan