2011-11-10 51 views
6

Tôi có tập dữ liệu được tạo động từ tệp csv. Những gì tôi muốn làm là chèn các hàng vào bảng MS Access của tôi nhưng tôi không thể tìm ra nơi để bắt đầu với điều này.C# Tập dữ liệu để truy cập DB

Tiêu đề của dữ liệu trong tập dữ liệu có thể thay đổi theo thứ tự nhưng tên của tiêu đề sẽ luôn khớp với cơ sở dữ liệu truy cập. Tôi có phải gọi tĩnh tên đầu trang trong lệnh chèn hoặc tôi có thể tạo tiêu đề từ tập dữ liệu không?

Tôi biết cách tạo kết nối và mở nó vào cơ sở dữ liệu nhưng không chắc chắn cách tạo lệnh chèn để tự động kéo tiêu đề bảng.

Tôi khá xanh khi nói đến lập trình C# vì vậy nếu bạn có thể đánh vần nó cho tôi, tôi thực sự sẽ đánh giá cao nó!

Dưới đây là một ví dụ về các tiêu đề bảng truy cập:

ID, khoản, Chi phí, bán lẻ

Sau đó CSV mà sẽ điền vào bảng số liệu. Nó có thể có bán lẻ hoặc nó có thể không:

Item, Chi phí

Dưới đây là đoạn code tôi có cho đến nay nhưng nó không ghi vào bảng truy cập. Nếu tôi viết dtAccess thì nó sẽ hiển thị chính xác.

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;"); 
       myConnection.Open(); 

       string queryString = "SELECT * from " + lblTable.Text; 

       OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection); 

       DataTable dtAccess = new DataTable(); 

       DataTable dtCSV = new DataTable(); 

       dtCSV = ds.Tables[0]; 

       using (new OleDbCommandBuilder(adapter)) 
       { 
        adapter.Fill(dtAccess); 
        dtAccess.Merge(dtCSV); 
        adapter.Update(dtAccess); 
       } 

       myConnection.Close(); 
+0

Nó đã được tạo động hoặc bạn muốn nó được tạo động? – McKay

+0

Tôi muốn nó được dymanically tạo thành một chuỗi vì vậy tôi có thể sử dụng nó trong một lệnh chèn. Mọi thứ như: INSERT INTO [table] (datasetheaders) – Reg

+0

Xin lỗi @reg bạn có thể rõ ràng hơn về những gì bạn đang tìm kiếm. Chúng ta có thể xem các ví dụ không? – McKay

Trả lời

4

đặn nó ra. Đây là mã tôi đã sử dụng:

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"Database.accdb\";Persist Security Info=False;"); 

       //command to insert each ASIN 
       OleDbCommand cmd = new OleDbCommand(); 

       //command to update each column (ASIN, Retail... from CSV) 
       OleDbCommand cmd1 = new OleDbCommand(); 

       //load csv data to dtCSV datatabe 
       DataTable dtCSV = new DataTable(); 

       dtCSV = ds.Tables[0]; 

       // Now we will collect data from data table and insert it into database one by one 
       // Initially there will be no data in database so we will insert data in first two columns 
       // and after that we will update data in same row for remaining columns 
       // The logic is simple. 'i' represents rows while 'j' represents columns 

       cmd.Connection = myConnection; 
       cmd.CommandType = CommandType.Text; 
       cmd1.Connection = myConnection; 
       cmd1.CommandType = CommandType.Text; 

       myConnection.Open(); 

       for (int i = 0; i <= dtCSV.Rows.Count - 1; i++) 
       { 
        cmd.CommandText = "INSERT INTO " + lblTable.Text + "(ID, " + dtCSV.Columns[0].ColumnName.Trim() + ") VALUES (" + (i + 1) + ",'" + dtCSV.Rows[i].ItemArray.GetValue(0) + "')"; 

        cmd.ExecuteNonQuery(); 

        for (int j = 1; j <= dtCSV.Columns.Count - 1; j++) 
        { 
         cmd1.CommandText = "UPDATE " + lblTable.Text + " SET [" + dtCSV.Columns[j].ColumnName.Trim() + "] = '" + dtCSV.Rows[i].ItemArray.GetValue(j) + "' WHERE ID = " + (i + 1); 

         cmd1.ExecuteNonQuery(); 
        } 
       } 

       myConnection.Close(); 
+1

Đối với dòng 'dtCSV = ds.Tables [0]', bạn lấy biến 'ds' ở đâu? –

0

Truy cập có các bảng ẩn cung cấp quyền truy cập cơ sở dữ liệu vào các bảng và cột trong cơ sở dữ liệu. Tên của chúng phụ thuộc vào phiên bản truy cập, nhưng chúng thường là một cái gì đó giống như systables? Đã lâu rồi, nhưng nếu bạn "hiển thị các bảng ẩn", bạn sẽ có thể tìm thấy chúng.

+0

Tôi biết về các systables trong truy cập nhưng tôi đang cố gắng tạo ra các tiêu đề từ bộ dữ liệu không phải từ bảng truy cập. Tập dữ liệu của tôi sẽ chỉ bao gồm 4 trong số 10 cột (sẽ thay đổi) từ bảng truy cập. – Reg

0

Nếu hai DataTable có cấu trúc tương tự như bạn có thể merge các "CSV" DataTable với DataTable bảng cơ sở dữ liệu, ví dụ như vậy bạn có thể lấy các bảng cơ sở dữ liệu vào một DataTable sử dụng một bộ chuyển đổi dữ liệu:

string queryString = "SELECT * FROM sometable"; 
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); 
DataTable dtAccess = new DataTable(); 
adapter.Fill(dtAccess); 

sau đó bạn có thể hợp nhất các nội dung của DataTable này với nội dung của các DataTable CSV:

dtAccess.Merge(dtCSV); 

Sau đó bạn có thể viết nội dung của DataTable vào bảng cơ sở dữ liệu truy cập với một người thợ xây lệnh:

Nếu datatables có cấu trúc giống nhau nên làm việc mà không cần bất kỳ vấn đề ...

+0

Điều này gần như hoạt động nhưng nó không ghi vào bảng truy cập. Tui bỏ lỡ điều gì vậy? – Reg

+0

Thử khởi tạo CommandBuilder trước khi điền vào bộ dữ liệu với bộ điều hợp. – aleroot

+0

Xin lỗi tôi là một noob. Tôi sẽ làm như thế nào? Câu lệnh sử dụng ở trên có khởi tạo mà không gọi nó theo bất kỳ cách nào không? – Reg

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