SqlCommand с более чем одной таблицей результатов - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над веб-приложением ASP.NET с Visual Studio 2010. Моя целевая среда - «.NET Framework 4», и я отправляю запросы к базе данных SQL Server 2008, версия которой - «Microsoft SQL Server 2008 R2».(SP2) ".

Я подключаюсь, используя следующую строку подключения "Data Source=XXXX;Initial Catalog=XXXX;Integrated Security=False;User Id=XXXX;Password= XXXX;MultipleActiveResultSets=True" и отправляю запросы с кодом ниже:

public static List<DataTable> getData(String query)
{
    var results = new List<DataTable>();

    try
    {
        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                connection.Open();
                command.CommandTimeout = 0;

                using (SqlDataReader reader = command.executeReader())
                {
                    do
                    {
                        while (reader.Read()) ;
                        var dataTable = new DataTable();
                        dataTable.Load(reader);
                        results.Add(dataTable);
                    } while (reader.NextResult());
                }

                connection.Close();
            }
        }
    }
}

Отправляемый запрос является хранимой процедуройкоторый возвращает две таблицы, сначала у него был цикл, который вызывает другую хранимую процедуру в зависимости от некоторого внутреннего условия, создания и вставки для tempdb..#table и двух операторов SELECT.

Но теперь он содержит только:

SELECT 1,2,3,4,5

SELECT 6,7,8,9,0

Я не знаю почему, но reader.NextResult() всегда ложно, поэтому я никогда не получаю второй результат таблицы.

Кто-нибудь знает, что я делаю неправильно?Что я должен сделать, чтобы получить и прочитать два результата из запроса?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

ОК, я провел какой-то тест и обнаружил, что проблема как-то из dataTable.Load(reader);, и я не знаю, почему и что именно происходит за этим методом.но если вы используете

do {
   while(reader.Read()) {
      ...
   }
} while (reader.NextResult());

, все работает как положено.

0 голосов
/ 16 октября 2018

если используется хранимый процесс, вам нужно что-то вроде этого: обратите внимание на тип команды

using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(myConnString))
{
    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
    {
        cmd.CommandText = "myMultipleTablesSP";
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;

        conn.Open();

        System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmd);

        DataSet ds = new DataSet();
        adapter.Fill(ds);

        conn.Close();
    }
}

, если, например, вы возвращаете 2 таблицы в SP, например:

SELECT * FROM [TableA];
SELECT * FROM [TableB];

вы получите доступ к этим таблицам как:

DataTable tableA = ds.Tables[0];
DataTable tableB = ds.Tables[1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...