2008-10-15 83 views
7

Leí una hoja de Excel en una cuadrícula de datos. Desde allí, he podido leer las filas de la cuadrícula en un objeto DataTable. El objeto DataTable tiene datos porque cuando hago igual el origen de datos de la cuadrícula a ese objeto de tabla , la grilla esta pobladaUso de la tabla temporal en C#

Mi problema: quiero usar el objeto de tabla y manipular sus valores usando SQL server, (es decir, quiero almacenarlo como una tabla temporal y manipularlo usando consultas SQL desde C# code y, quiero que regrese un resultado diferente inte una cuadrícula. (no sé cómo trabajar con tablas temporales en C#)

Aquí está el código que se ejecutará al hacer clic en el botón ....

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 

Respuesta

4

Poner los datos en una base de datos tomará tiempo, dado que ya lo tiene en la memoria, tal vez LINQ-to-Objects (con DataSetExtensions) es su amigo? Reemplace <int> etc con los tipos correctos ...

 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

Esto toma tiempo, sin embargo, todavía quiero utilizarlo como velocidad no es un problema todavía –

0

Perdón, si no he entendido lo que quiere exactamente.
Si desea realizar una consulta SQL en la hoja de Excel, puede hacerlo directamente.

Como alternativa, puede usar SQL Server para consultar Excel (OPENROWSET o una función que no recuerdo de inmediato). Al usar esto, puede unirse a una tabla de servidor SQL con la hoja de Excel

La sugerencia de Marc es una forma más de verla.

+0

Hola, informaré más adelante si tengo éxito. –

0

Quizás podría utilizar un DataView. Usted lo crea desde una DataTable, que ya tiene.

dv = new DataView(dataTableName); 

A continuación, puede filtrar (aplicar una cláusula WHERE de SQL) u ordenar los datos utilizando los métodos de la DataView. También puede usar Buscar para encontrar una fila coincidente, o FindRows para encontrar todas las filas coincidentes.

Algunos filtros:

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)" 

Clasificación:

dv.Sort = "City" 

Encontrar consecutivas: Encontrar el cliente llamado "John Smith".

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

donde i es el índice de la fila que contiene el cliente.

Una vez que haya aplicado esto a DataView, puede vincular su grilla al DataView.

+0

Hola, gracias por hacer comentarios, pero ¿cómo puedo usar este tipo de consulta ... "SELECT , , de grupo por ,

3

No creo que pueda crear una tabla temporal en SQL de la manera en que está pensando, ya que solo existe dentro del alcance de la consulta/procedimiento almacenado que la crea.

Si la hoja de cálculo es un formato estándar, lo que significa que conoce las columnas y son siempre las mismas, le conviene crear una tabla en SQL para colocar este archivo. Hay una manera muy rápida de hacer esto se llama 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); 

Pero, si estoy comprensión de su problema correctamente, no es necesario utilizar el servidor SQL para modificar los datos en el DataTable.Puede usar el motor JET para tomar los datos por usted.

// 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(); 

Además, en su código, pregunte si su cadena de conexión es correcta. No creo que lo sea (pero podría estar equivocado). Si el tuyo no funciona, prueba esto.

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

yo preferiría usar su segunda opción (utilizando el motor JET) .La consulta Necesito hacer es esto "Seleccione , , De grupo por , . Creo que necesito crear objetos de columna pero intentaré averiguar –

7

Cambie su tabla temporal de #table a ## table en ambos lugares.

El uso de ## se refiere a una tabla temporal global que se mantiene. Tendrá que soltarlo después de haber completado su tarea.

Comando = "Drop Table ## Tabla"

+0

Eso detendrá el mensaje de error, pero hay otras cosas que considerar antes de hacer que su tabla temporal sea global. Por ejemplo, cuando es un "#" único, puede tener varios comandos ejecutándose al mismo tiempo, "##" se comparte la misma tabla, por lo que debe tener cuidado en situaciones de subprocesos múltiples. –

0

Cambiar el texto del comando de

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

a

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