2009-10-15 40 views
6
OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader(CommandBehavior.KeyInfo); 
DataTable dataTable = oleDbDataReader.GetSchemaTable(); 

Làm thế nào để GetSchemaTable() hoạt động?GetSchemaTable() hoạt động như thế nào?

Thông tin của nó ở đâu trong RDBMS?

Trả lời

6

Việc triển khai IDataReader.GetSchemaTable() tùy thuộc vào nhà cung cấp - vì vậy nó sẽ thay đổi. Bạn có thể viết các nhà cung cấp của riêng bạn và làm theo bất kỳ cách nào bạn muốn.

Thành thật mà nói, đây là thiết kế kém trong khung công tác - bạn không bao giờ nên có phương thức giao diện trả về DataTable hoặc DataSet không được phân loại vì kết quả đó có thể chứa bất kỳ thứ gì. Kinda đánh bại các điểm hạn chế nó bằng một giao diện ở nơi đầu tiên: "bạn phải có một phương thức trả DataTable nhưng chúng tôi không quan tâm những gì các hàng hoặc cột nó có"

Thậm chí nếu các nhà cung cấp là SQL GetSchemaTable() không quay lại số [syscolumns] hoặc [sysobjects]. Đó sẽ là một cuộc gọi DB bổ sung, yêu cầu các đặc quyền bổ sung và không hoạt động, vì tập kết quả không cần phản ánh bất kỳ đối tượng nào trong DB.

Tôi không chắc chắn, nhưng tôi mong đợi phần lớn các triển khai IDataReader.GetSchemaTable() để đọc một số thuộc tính của dữ liệu meta được tổ chức với tập hợp kết quả.

-1

Từ bảng hệ thống (ví dụ: syscolumns, sysobjects, v.v.) trong mỗi cơ sở dữ liệu.

+0

Trường hợp này luôn xảy ra hay không phụ thuộc vào nhà cung cấp OLE DB đang được sử dụng? –

+2

Điều đó sai. Kết quả có thể là động, người dùng có thể không có quyền xem sysobject (VIEW DEFINITION trong MSSQL 2005+), v.v. – VladV

+0

Giả sử người đọc của bạn đã vượt qua bài kiểm tra 'SELECT ', 1'? Bạn có thể gọi 'GetSchemaTable()' trên tập kết quả 'IDataReader' và chắc chắn nó sẽ không kiểm tra' [sysobjects] '. – Keith

2

GetSchemaTable() đọc siêu dữ liệu trên resultset được trả về bởi ADO.NET.

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