Использование временной таблицы в C # - PullRequest
7 голосов
/ 15 октября 2008

Я прочитал таблицу Excel в таблицу данных. Отсюда мне удалось прочитать строки сетки в объект DataTable. Объект DataTable содержит данные, потому что, когда я делаю источник данных сетки равным этому объекту таблицы, сетка заполняется .

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

Ответы [ 6 ]

7 голосов
/ 31 октября 2008

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

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

Command = "Drop Table ## table"

4 голосов
/ 15 октября 2008

Помещение данных в базу данных займет время - поскольку у вас уже есть это в памяти, возможно, 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);
        }
3 голосов
/ 15 октября 2008

Я не думаю, что вы можете создать временную таблицу в 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 голосов
/ 07 августа 2013

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

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

до

Select col1,col2,SUM(col7) From @#table group by col1,col2
0 голосов
/ 15 октября 2008

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

dv = new DataView(dataTableName);

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

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

0 голосов
/ 15 октября 2008

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

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

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

...