2008-10-15 2 views
7

Я прочитал лист excel в datagrid. Из-за этого мне удалось прочитать строки сетки в объекте DataTable. Объект DataTable имеет данные, потому что когда я делаю равным источник данных сетки для этого объекта таблицы , сетка заполнена.Использование временной таблицы в C#

Моя проблема: я хочу использовать объект таблицы и управлять его значениями с помощью SQL-сервера (т.е. я хочу сохранить его как временную таблицу и манипулировать ею с помощью SQL-запросов из кода C# и, я хочу, чтобы он возвращался другой результат инте сетки. (я не знаю, как работать с временными таблицами в 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

Ввод данных в базу данных потребуется время - поскольку у вас уже есть память, возможно, 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); 
     } 
+0

Это занимает время, но я все еще хочу, чтобы использовать его как скорость еще не проблема. – 2008-10-15 14:40:27

0

пардон, если я не понял, что вы точно хотите.
Если вы хотите выполнить SQL-запрос на листе excel, вы можете сделать это напрямую.

В качестве альтернативы вы можете использовать SQL Server для запроса excel (OPENROWSET или функции, которую я не помню сразу). Используя это, вы можете присоединиться к таблице sql-сервера с листом excel

Предложение Марка - еще один способ взглянуть на него.

+0

Привет, я сообщу позже, если мне это удастся. – 2008-10-15 15:11:12

0

Возможно, вы можете использовать DataView. Вы создаете это из DataTable, который у вас уже есть.

dv = new DataView(dataTableName); 

Затем можно отфильтровать (применить SQL предложения WHERE) или сортировать данные, используя методы в DataView в. Вы также можете использовать «Найти», чтобы найти подходящую строку или 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 - индекс строки, содержащей клиента.

Как только вы применили их к DataView, вы можете привязать свою сетку к DataView.

+0

Привет, спасибо за комментарий, но как я могу использовать этот тип запроса ... "SELECT , , из группы по , 2008-10-16 06:22:33

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 для изменения данных в 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" 
+0

я предпочел бы использовать второй вариант (с помощью реактивного двигателя) .Отель запрос Мне нужно сделать это »Выберите , , От группа по , . Я думаю, мне нужно создать объекты столбца, но я попытаюсь выяснить, – 2008-10-16 06:26:58

7

Измените таблицу темп из таблицы #table в ## в обоих местах.

Использование ## означает глобальную таблицу темп, которая находится вокруг. Вам нужно будет удалить его после выполнения вашей задачи.

Command = "Drop Table ## Таблица"

+0

Это остановит сообщение об ошибке, но перед тем, как сделать вашу таблицу темп глобальной. Например, когда это один «#», вы можете одновременно запускать несколько команд, «##» одна и та же таблица является общей, поэтому вам нужно быть осторожным в многопоточных ситуациях. – 2017-05-25 19:48:23

0

Измените текст команды из

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

в

Select col1,col2,SUM(col7) From @#table group by col1,col2 
Смежные вопросы