2010-09-23 48 views
6

Tôi muốn lấy tất cả các tên cột trong bảng cụ thể ..lấy tên cột cho bảng cụ thể

Tôi đang sử dụng MSAccess và C# .net 2008.

+0

Bạn cần cung cấp thêm thông tin. Bạn truy cập cơ sở dữ liệu như thế nào? –

+0

@Daniel Đây là chuỗi kết nối của tôi .. string strConnection = "Nhà cung cấp = Microsoft.Jet.OLEDB.4.0; Nguồn dữ liệu =" + System.Environment.CurrentDirectory + "\\ test.mdb"; –

+0

Bạn đang sử dụng 'SqlConnection' để truy cập cơ sở dữ liệu? –

Trả lời

23

Bạn có thể lấy thông tin schema cho một truy vấn cụ thể thông qua OleDb sử dụng SchemaOnly CommandBehaviorGetSchemaTable phương pháp như sau:

var conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.mdb"; 
using (var con = new OleDbConnection(conStr)) 
{ 
    con.Open(); 
    using (var cmd = new OleDbCommand("select * from Suppliers", con)) 
    using (var reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) 
    { 
     var table = reader.GetSchemaTable(); 
     var nameCol = table.Columns["ColumnName"]; 
     foreach (DataRow row in table.Rows) 
     { 
      Console.WriteLine(row[nameCol]); 
     } 
    } 
} 
+0

thưa các tên cột trả về có chữ thường như i có columnname = OBJECTID nhưng nó trả về objectid –

2

này lấy tất cả các cột của tất cả các bảng và quan điểm

 DataTable schemaTable = ((OleDbConnection)jetConnection).GetOleDbSchemaTable(
      System.Data.OleDb.OleDbSchemaGuid.Columns, 
      new object[] { null, null, null, null }); 
2

Một biến thể của phương pháp bubi cho một bảng cụ thể:

public List<string> GetTableColumnNames(string tableName) 
{ 
    var conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.mdb"; 
    using (var connection = new OleDbConnection(conStr)) 
    { 
    connection.Open(); 
    var schemaTable = connection.GetOleDbSchemaTable(
     OleDbSchemaGuid.Columns, 
     new Object[] { null, null, tableName }); 
    if (schemaTable == null) 
     return null; 

    var columnOrdinalForName = schemaTable.Columns["COLUMN_NAME"].Ordinal; 

    return (from DataRow r in schemaTable.Rows select r.ItemArray[columnOrdinalForName].ToString()).ToList(); 
    } 
} 

Tất nhiên đầu tiên bạn có thể muốn kiểm tra xem bàn thực sự tồn tại trước khi tên cột của nó:

public bool TableExists(string tableName) 
{ 
    var conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.mdb";  
    using (var connection = new OleDbConnection(conStr)) 
    { 
    connection.Open(); 
    var tables = connection.GetSchema("Tables"); 
    var tableExists = false; 
    for (var i = 0; i < tables.Rows.Count; i++) 
    { 
     tableExists = String.Equals(tables.Rows[i][2].ToString(), 
          tableName, 
          StringComparison.CurrentCultureIgnoreCase); 
     if (tableExists) 
     break; 
    } 
    return tableExists; 
    } 
} 
0

Tôi thấy điều này bài viết trong khi cố gắng xây dựng một ứng dụng C# để di chuyển cơ sở dữ liệu Access. Cơ sở dữ liệu mà tôi đang di chuyển là một tệp Access 2007/2010 với phần mở rộng .accdb.

Nếu bạn sử dụng mã này trên bảng có cột Ghi nhớ hoặc tệp đính kèm (có sẵn trong tệp accdb), nó sẽ trả về loại cột này dưới dạng chuỗi (wchar).

tôi đã khó khăn khi tìm nhiều thông tin về làm thế nào để đối phó với các loại cột, vì vậy tôi muốn cung cấp một liên kết đến bài viết mà đã giúp tôi tìm ra cách để xử lý chúng:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/d15606f9-f38d-4a1b-8ce3-000c558e79c5

tôi lấy ví dụ dưới cùng trong chuỗi đó và chuyển nó thành C#. Tôi đã phải thêm câu lệnh using này để các mô-đun để tránh phải sửa tất cả các tài liệu tham khảo để "AccessDao":

using AccessDao = Microsoft.Office.Interop.Access.Dao; 

lời xin lỗi của tôi cho tacking lên một chủ đề cũ, nhưng tôi sử dụng chủ đề này như một khởi đầu điểm để viết mã của tôi và không nhận ra điều này ngay lập tức.

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