2008-10-15 16 views
7

Tôi đọc một bảng excel thành một dữ liệu. Từ đó, tôi đã quản lý để đọc các hàng của lưới vào một đối tượng DataTable. Đối tượng DataTable có dữ liệu vì khi tôi tạo nguồn dữ liệu bằng lưới cho đối tượng bảng đó , lưới điện được phổ biến.Sử dụng bảng tạm thời trong C#

Vấn đề của tôi: Tôi muốn sử dụng đối tượng bảng và thao tác các giá trị của nó bằng cách sử dụng SQL server (tức là tôi muốn lưu trữ nó dưới dạng bảng tạm thời và thao tác nó bằng truy vấn SQL từ bên trong mã C#). một kết quả khác nhau inte một mạng lưới. (tôi không biết làm thế nào để làm việc với các bảng tạm thời trong C#)

đây là mã để thực hiện khi nhấp nút ....

SqlConnection conn = new SqlConnection("server = localhost;integrated security = SSPI"); 
//is connection string incorrect? 

SqlCommand cmd = new SqlCommand(); 

//!!The method ConvertFPSheetDataTable Returns a DataTable object// 
cmd.Parameters.AddWithValue("#table",ConvertFPSheetDataTable(12,false,fpSpread2_Sheet1)); 
//I am trying to create temporary table  

//Here , I do a query    
cmd.CommandText = "Select col1,col2,SUM(col7) From #table group by col1,col2 Drop #table"; 

SqlDataAdapter da = new SqlDataAdapter(cmd.CommandText,conn); 
DataTable dt = new DataTable(); 
da.Fill(dt); ***// I get an error here 'Invalid object name '#table'.'*** 

fpDataSet_Sheet1.DataSource = dt; 

//**NOTE:** fpDataSet_Sheet1 is the grid control 

Trả lời

4

Đưa dữ liệu vào một cơ sở dữ liệu sẽ mất thời gian - vì bạn đã có nó trong bộ nhớ, có lẽ LINQ-to-Objects (với DataSetExtensions) là bạn của bạn? Thay thế <int> v.v ... với các loại chính xác ...

 var query = from row in table.Rows.Cast<DataRow>() 
        group row by new 
        { 
         Col1 = row.Field<int>(1), 
         Col2 = row.Field<int>(2) 
        } into grp 
        select new 
        { 
         Col1 = grp.Key.Col1, 
         Col2 = grp.Key.Col2, 
         SumCol7 = grp.Sum(x => x.Field<int>(7)) 
        }; 
     foreach (var item in query) 
     { 
      Console.WriteLine("{0},{1}: {2}", 
       item.Col1, item.Col2, item.SumCol7); 
     } 
+0

này không mất thời gian, tuy nhiên tôi vẫn muốn sử dụng nó như là tốc độ chưa phải là vấn đề. –

0

Xin lỗi, nếu tôi chưa hiểu chính xác bạn muốn gì.
Nếu bạn muốn thực hiện truy vấn SQL trên trang tính excel, bạn có thể thực hiện trực tiếp.

Hoặc, bạn có thể sử dụng SQL Server để truy vấn excel (OPENROWSET hoặc hàm mà tôi không nhớ ngay). Sử dụng điều này, bạn có thể tham gia một bảng máy chủ sql với bảng excel

Đề xuất của Marc là một cách khác để xem xét nó.

+0

Xin chào, tôi sẽ báo cáo sau nếu tôi thành công. –

0

Có lẽ bạn có thể sử dụng một DataView. Bạn tạo nó từ một DataTable mà bạn đã có.

dv = new DataView(dataTableName); 

Sau đó, bạn có thể lọc (áp dụng mệnh đề SQL WHERE) hoặc sắp xếp dữ liệu bằng phương pháp của DataView. Bạn cũng có thể sử dụng Tìm để tìm hàng phù hợp hoặc Tìm kiếm để tìm tất cả các hàng phù hợp.

Một số bộ lọc:

dv.RowFilter = "Country = 'USA'"; 
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#" 
dv.RowFilter = "Description LIKE '*product*'" 
dv.RowFilter = "employeeID IN (2,4,5)" 

Phân loại:

dv.Sort = "City" 

Tìm một hàng: Tìm khách hàng có tên là "John Smith".

vals(0)= "John" 
    vals(1) = "Smith" 
    i = dv.Find(vals) 

nơi tôi là chỉ mục của hàng chứa khách hàng.

Khi bạn đã áp dụng chúng cho DataView, bạn có thể liên kết lưới của mình với DataView.

+0

Hi, cảm ơn cho bình luận, nhưng làm thế nào tôi có thể sử dụng loại truy vấn ... "SELECT , , từ nhóm bởi ,

3

Tôi không nghĩ bạn có thể tạo một bảng tạm thời trong SQL theo cách bạn đang nghĩ, vì nó chỉ tồn tại trong phạm vi của truy vấn/thủ tục lưu trữ tạo ra nó.

Nếu bảng tính là định dạng chuẩn - nghĩa là bạn biết các cột và chúng luôn giống nhau, bạn sẽ muốn tạo Bảng trong SQL để đưa tệp này vào. Có một cách rất nhanh để làm điều này được gọi là SqlBulkCopy

// Load the reports in bulk 
SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString); 
// Map the columns 
foreach(DataColumn col in dataTable.Columns) 
    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
bulkCopy.DestinationTableName = "SQLTempTable"; 
bulkCopy.WriteToServer(dataTable); 

Nhưng, nếu tôi hiểu vấn đề của bạn một cách chính xác, bạn không cần phải sử dụng SQL server để sửa đổi dữ liệu trong DataTable.Bạn c sử dụng động cơ JET để lấy dữ liệu cho bạn.

// For CSV 
    connStr = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source={0};Extended Properties='Text;HDR=Yes;FMT=Delimited;IMEX=1'", Folder); 
    cmdStr = string.Format("SELECT * FROM [{0}]", FileName); 
    // For XLS 
    connStr = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source={0}{1};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", Folder, FileName); 
    cmdStr = "select * from [Sheet1$]"; 
OleDbConnection oConn = new OleDbConnection(connStr); 
      OleDbCommand cmd = new OleDbCommand(cmdStr, oConn); 
      OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
      oConn.Open(); 
      da.Fill(dataTable); 
      oConn.Close(); 

Ngoài ra, trong mã của bạn, bạn hỏi xem chuỗi kết nối của bạn có đúng không. Tôi không nghĩ đó là (nhưng tôi có thể sai). Nếu máy của bạn không hoạt động, hãy thử điều này.

connectionString="Data Source=localhost\<instance>;database=<yourDataBase>;Integrated Security=SSPI" providerName="System.Data.SqlClient" 
+0

Tôi thà sử dụng tùy chọn thứ hai của bạn (sử dụng động cơ JET) .Công truy vấn Tôi cần phải thực hiện điều này là "Chọn , , Từ nhóm theo số , . Tôi nghĩ rằng tôi cần phải tạo ra các đối tượng cột nhưng tôi sẽ cố gắng tìm ra –

7

Thay đổi bảng tạm thời của bạn từ #table thành ## table ở cả hai vị trí.

Sử dụng ## có nghĩa là bảng tạm thời trên toàn cầu. Bạn sẽ cần phải thả nó sau khi bạn đã hoàn thành nhiệm vụ của bạn.

Command = "Drop Bảng ## bảng"

+0

Điều đó sẽ ngăn chặn các thông báo lỗi, nhưng có những thứ khác để xem xét trước khi làm cho bảng temp của bạn toàn cầu. Ví dụ, khi nó là một "#" duy nhất bạn có thể có nhiều lệnh chạy cùng một lúc, "##" cùng một bảng được chia sẻ, vì vậy bạn phải cẩn thận trong các tình huống đa luồng. –

0

Thay đổi văn bản lệnh từ

Select col1,col2,SUM(col7) From #table group by col1,col2 

để

Select col1,col2,SUM(col7) From @#table group by col1,col2