2013-01-23 40 views
5

tôi sử dụng OLEDB để đọc một AccessFile (accdb) to DataSet, tôi không biết gì về tên bảng hoặc cột, Việc thực hiện thường xuyên là:Sử dụng OLEDB để đọc AccessFile từ Suối to DataSet

public void GetAccessDB(string filepath){ 

this.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " + filepath; 
// get Table Names 
this.TableNames = new List<string>(); 
using (System.Data.OleDb.OleDbConnection oledbConnection = new System.Data.OleDb.OleDbConnection(this.ConnectionString)) 
{ 
oledbConnection.Open(); 
System.Data.DataTable dt = null; 
dt = oledbConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); 
foreach (System.Data.DataRow row in dt.Rows) 
{ 
    string strSheetTableName = row["TABLE_NAME"].ToString(); 
    if (row["TABLE_TYPE"].ToString() == "TABLE") 
    this.TableNames.Add(strSheetTableName); 
} 
oledbConnection.Close(); 
} 


this.Dataset = new System.Data.DataSet(); 
using (System.Data.OleDb.OleDbConnection oledbConnection = new System.Data.OleDb.OleDbConnection(this.ConnectionString)) 
{ 
    foreach (string table in this.TableNames) 
    { 
    string command = string.Format("SELECT * FROM {0};", table); 
    using (System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(command, oledbConnection)) 
    { 
     cmd.CommandType = System.Data.CommandType.Text; 
     oledbConnection.Open(); 
     System.Data.OleDb.OleDbDataReader dr = cmd.ExecuteReader(); 
     this.Dataset.Load(dr, System.Data.LoadOption.OverwriteChanges, table); 
     oledbConnection.Close(); 
    } 
    } 
} 
} 

Nhưng Tôi cần lấy File Access từ Stream, và tôi không thể ghi nó trên đĩa tạm thời, vậy đề nghị của bạn là gì?

Tôi cần quá tải này GetAccessDB(Stream AccessFile)? Tôi tìm kiếm và tìm thấy This, nhưng điều đó không rõ ràng đối với tôi, cuối cùng tôi cũng cần có DataSet bởi tất cả các Bảng trong Tệp Truy cập.

Có ai biết về điều này không?

+0

Tại sao bạn muốn thực hiện các thao tác dữ liệu trong tệp 'Access' được mở dưới dạng luồng? Chỉ tò mò thôi. –

+0

@AlexFilipovici Tập tin truy cập tải lên của khách hàng và tôi cần đọc chúng và tìm Datas đích và lưu trữ trên SQL và hiển thị một bảng mục tiêu cho khách hàng, nhưng tôi không thể (một số giới hạn) ghi tập tin vào đĩa! – Saeid

+0

làm thế nào đến bạn không thể làm công việc trên đĩa địa phương ..? hãy giải thích lý luận của bạn tốt hơn để những người khác có thể hiểu và không dẫn bạn xuống con đường vàng khi họ nói – MethodMan

Trả lời

1

Nếu bạn có quyền kiểm soát trên MS SQL Server, đó là tin tốt. Tôi hiện thấy 2 lựa chọn:

  1. Tạo một CLR asssembly rằng sẽ xử lý (không đồng bộ là một ý tưởng tốt) các tập tin khi chèn được thực hiện trong bảng tập tin tải lên. Nó sẽ tạo một tệp tạm thời MS Access trên máy chủ bằng cách sử dụng nội dung của tệp được tải lên. Sau đó, mở nó bằng OleDB, phân tích cú pháp và chèn thông tin từ nó trong bảng SQL để ánh xạ thông tin được trích xuất với bản ghi tệp được tải lên trong bảng đầu tiên. Sau đó, bạn có thể đi và tìm kiếm dữ liệu trong bảng thứ hai này.

  2. Một lựa chọn khác sẽ được gửi đến SQL một lệnh mà sẽ làm như sau:

    1. Sử dụng tập tin byte tải lên create a file on the filesystem.
    2. Sau đó, sử dụng các tập tin như một linked server
    3. Sử dụng SELECT để truy vấn cơ sở dữ liệu truy cập

Bạn có thể nhận thấy rằng cả hai tùy chọn liên quan đến việc tạo ra một (ít nhất là tạm thời) nộp trên SQL Server .

+0

Cảm ơn Alex, hãy để tôi thử. – Saeid

2

Tôi không biết bất kỳ chức năng api nào trong OleDb để làm việc với cơ sở dữ liệu trong bộ nhớ. Có lẽ, bạn có thể cài đặt RAMDisk không?