10

我将 excel 表读入数据网格。从那里,我设法将网格的行读入 DataTable 对象。DataTable 对象具有数据,因为当我将网格的数据源与该表对象相等时,网格被填充。

我的问题:我想使用表对象并使用 SQL 服务器操作它的值,(即我想将它存储为临时表并使用 C# 代码中的 SQL 查询来操作它,我希望它返回不同的结果 inte一个网格。(我不知道如何在 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  
4

6 回答 6

8

在这两个地方将您的临时表从 #table 更改为 ##table。

使用## 表示保留的全局临时表。完成任务后,您需要将其删除。

Command =“删除表##table”

于 2008-10-31T00:51:15.150 回答
4

将数据放入数据库需要时间 - 因为您已经在内存中拥有它,也许 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);
        }
于 2008-10-15T14:37:33.810 回答
3

我不认为您可以按照您的想法在 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"
于 2008-10-15T16:20:33.773 回答
0

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

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"

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

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

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

将这些应用到 DataView 后,您可以将网格绑定到 DataView。

于 2008-10-15T16:04:52.153 回答
0

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

或者,您可以使用 SQL Server 查询 excel(OPENROWSET 或我不记得的函数)。使用它,您可以使用 excel 表加入 sql server 表

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

于 2008-10-15T14:46:00.207 回答
0

将命令文本从

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

Select col1,col2,SUM(col7) From @#table group by col1,col2
于 2013-08-07T16:43:22.160 回答