使用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
将临时表从#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