Для сложного отчета требуется временный файл SQL C# не возвращает строк

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

        SqlConnection connection = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand();
        SqlDataReader reader;

        cmd.CommandText = "SELECT * INTO ##temp FROM Customers";
        cmd.Connection = connection;
        connection.Open();

        reader = cmd.ExecuteReader();

        if (reader.HasRows)
        { MessageBox.Show("ROWS"); }
        else
        { MessageBox.Show("NO ROWS"); }

        connection.Close();

Поэтому я подумал, может быть, мне нужен другой ридер для SELECT * FROM ##TEMP, но он всегда вылетает, сообщая мне, что мой ридер уже открыт (я использовал reader = cmd.ExecuteReader();). Пожалуйста помоги.


person Missy    schedule 25.06.2016    source источник
comment
Что значит крах? Если вы не получаете строк, то нет и строк набора результатов. Поскольку вы выбираете into во временной таблице, я понятия не имею, почему вообще можно было бы ожидать появления строк результатов. Очевидно, что выдавать набор результатов при выборе в временной таблице недопустимо, что подтверждается выполнением запроса в SSMS.   -  person user2864740    schedule 26.06.2016
comment
Хорошо - вы правы. Когда я начал пост, он вылетал, но я это исправил. Я изменил заголовок на вопрос. Как вы думаете, вы можете помочь с моей проблемой? Как получить строки из временного файла?   -  person Missy    schedule 26.06.2016
comment
Я откатил вашу правку. Если вы нашли решение, которое, по вашему мнению, принесет пользу будущим читателям, используйте пространство под заголовком Ваш ответ и поместите его туда. Вполне приемлемо ответить на свой вопрос.   -  person Ken White    schedule 26.06.2016


Ответы (2)


Я нашел ответ:

        cmd.Connection = connection;
        connection.Open();
        cmd.ExecuteNonQuery();
        cmd.CommandText = "SELECT * from ##temp";
        reader = cmd.ExecuteReader();

Сначала запустите ExecuteNonQuery, затем измените команду, затем запустите ExecuteReader

person Missy    schedule 26.06.2016

Ваш вопрос не оправдывает использование временной таблицы. У вас действительно нет причин не просто читать данные непосредственно из фактической таблицы (если только ваш вопрос не упустил важные и важные детали).

Кроме того, рекомендуется иметь привычку размещать объекты базы данных с блоками using для правильной очистки даже в случае исключений.

Вот как может выглядеть код:

using (var connection = new SqlConnection(connectionString))
{
    using (var cmd = new SqlCommand("SELECT * FROM Customers", connection))
    {
        connection.Open();

        using (var reader = cmd.ExecuteReader())
        {
            if (reader.HasRows)
            {
                MessageBox.Show("ROWS");
            }
            else
            {
                MessageBox.Show("NO ROWS");
            }
        }
    }
}
person sstan    schedule 26.06.2016
comment
Что ж, очень интересно, что вы думаете, что мне не следует использовать временную таблицу. Вот объем отчета: он будет скопирован в рабочую книгу примерно с 10 рабочими листами, каждый из которых содержит около 1000 строк и около 30 столбцов. Я думал, что это слишком много данных для хранения в памяти, но у меня нет опыта в этом, поэтому мне очень хотелось бы узнать ваше мнение о том, так это или нет и почему. - person Missy; 26.06.2016