English 中文(简体)
在C#中使用临时表。
原标题:
  • 时间:2008-10-15 14:29:35
  •  标签:

我将一个Excel表格读入到一个数据网格中。从那里,我成功地将网格的行读入到一个DataTable对象中。DataTable对象具有数据,因为当我将网格的数据源等于那个表格对象时,网格就被填充了。

我的问题:我想使用表对象并使用SQL服务器操作它的值,即我想将它作为临时表存储并使用C#代码内的SQL查询进行操作,并且我希望它返回一个不同的结果到一个网格中。(我不知道如何在C#中使用临时表)

这是一个当点击按钮时要执行的代码。

 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  
问题回答

把临时表格从#table改为##table,两个地方都需要修改。

使用 ## 表示一个全局临时表,它将保留下来。你需要在完成任务后将其删除。

指令 = "删除表格 ##table"

将数据放入数据库需要时间 - 既然您已经将其存储在内存中,也许LINQ-to-Objects(使用DataSetExtensions)是您的朋友? 用正确的类型替换 等...

        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服务器来修改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"

Pardon me, if I have not understood what you exactly want.
If you want to perform SQL query on excel sheet, you could do it directly.

或者,您可以使用SQL Server查询Excel(OPENROWSET或我不记得的函数)。使用此功能,您可以将SQL Server表与Excel工作表连接起来。

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

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

dv = new DataView(dataTableName);

然后,您可以使用DataView的方法过滤(应用SQL WHERE子句)或对数据进行排序。您还可以使用Find查找匹配行,或使用FindRows查找所有匹配行。

一些过滤器:

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"

查找行:查找名为“约翰 · 史密斯”的客户。

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

“i” 是包含客户的行的索引。

一旦您将它们应用于数据视图,您就可以将网格绑定到数据视图。

从更改命令文本

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

Translate what into Chinese? There is no context or sentence provided. Please provide more information.

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




相关问题
热门标签