使用c#中的临时表

本文关键字:临时表 使用 | 更新日期: 2023-09-27 17:47:46

我将excel表读入数据网格。从那里,我已经设法将网格的行读取到DataTable对象中。DataTable对象具有数据,因为当我使网格的数据源与该表对象相等时,就会填充网格。

我的问题:我想使用表对象并使用SQL server操作其值,(即,我想将其存储为临时表,并使用C#代码中的SQL查询操作它,并且,我希望它在网格中返回不同的结果。)

以下是单击按钮时要执行的代码。。。。

 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  

使用c#中的临时表

将临时表从#table更改为##table。

使用##表示一个全局临时表。您需要在完成任务后将其删除。

Command="Drop Table##Table"

将数据放入数据库需要时间,因为您已经在内存中有了数据,所以LINQ to Objects(带有DataSetExtensions)可能是您的朋友?替换<int>等具有正确类型。。。

        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);
        }

我不认为您可以按照您的想法在SQL中创建临时表,因为它只存在于创建它的查询/存储过程的范围内。

如果电子表格是标准格式,也就是说你知道列并且它们总是相同的,那么你会想用SQL创建一个表来放入这个文件。有一种非常快速的方法叫做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);

但是,如果我正确理解您的问题,您就不需要使用SQL server来修改DataTable中的数据。您可以使用JET引擎为您获取数据。

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

此外,在代码中,您会询问连接字符串是否正确。我不这么认为(但我可能错了)。如果你的不起作用,试试这个。

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

如果我不明白你到底想要什么,请原谅
如果您想在excel表上执行SQL查询,可以直接执行。

或者,您可以使用SQL Server查询excel(OPENROWSET或一个我现在不记得的函数)。使用此功能,您可以将sql server表与excel表连接

Marc的建议是另一种看待它的方式。

也许您可以使用DataView。您可以从已有的DataTable中创建它。

dv = new DataView(dataTableName);

然后,您可以使用DataView的方法对数据进行筛选(应用SQL WHERE子句)或排序。也可以使用"查找"查找匹配的行,或使用"查找行"查找所有匹配的行。

一些过滤器:

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

排序:

dv.Sort = "City"

查找一行:查找名为"John Smith"的客户。

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

其中i是包含客户的行的索引。

一旦将这些应用到DataView,就可以将网格绑定到DataView。

从更改命令文本

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

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