Несколько SQL-запросов asp.net c # - PullRequest
7 голосов
/ 04 мая 2011

Мне нужно выполнить несколько запросов внутри одной функции. Должен ли я создать новую SqlConnection для каждой? Или иметь одно соединение, но разные SqlCommands тоже работают?

Спасибо

РЕДАКТИРОВАТЬ: это будет работать?

       using (SqlConnection conn = new SqlConnection(connectionString))
      {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand(query1, conn))
        {
            cmd.ExecuteNonQuery();
        }

        using (SqlCommand cmd = new SqlCommand(query2, conn))
        {
            cmd.ExecuteNonQuery();
        }

        using (SqlCommand cmd = new SqlCommand(query3, conn))
        {
            cmd.ExecuteNonQuery();
        }

    }

Ответы [ 5 ]

8 голосов
/ 04 мая 2011

Использование MDSN-документации в качестве базы:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    string sql1 = "SELECT ID,FirstName,LastName FROM VP_PERSON";
    string sql2 = "SELECT Address,City,State,Code FROM VP_ADDRESS";

    using (SqlCommand command = new SqlCommand(sql1,connection))
    {
        //Command 1
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // reader.Read iteration etc
        }

    } // command is disposed.

    using (SqlCommand command = new SqlCommand(sql2,connection))
    {

        //Command 1
        using (SqlDataReader reader = command.ExecuteReader())
        {
            // reader.Read iteration etc
        }

    } // command is disposed.

   // If you don't using using on your SqlCommands you need to dispose of them 
   // by calling command.Dispose(); on the command after you're done.

} // the SqlConnection will be disposed
3 голосов
/ 10 сентября 2014

Неважно, куда вы идете.

SqlConnections объединяются операционной системой.Вы можете буквально открывать и закрывать соединение тысячи раз подряд и не понести какой-либо производительности или другого штрафа.

Как это работает:

  1. Приложение создает запрос на созданиеdb connection (var c = new SqlConnection(...))
  2. Пул соединений операционных систем проверяет, находится ли соединение в режиме ожидания.Если это произойдет, вы получите ссылку на это.Если нет, то оно раскручивает новое.
  3. Приложение указывает, что оно завершено с подключением (c.Dispose())
  4. Операционная система сохраняет соединение открытым в течение определенного времениколичество времени, в течение которого ваше приложение или другое пытается создать другое соединение с тем же ресурсом.
  5. Если это соединение остается бездействующим до истечения времени ожидания, ОС наконец закрывается и освобождается.

Вот почему первый раз, когда вы устанавливаете соединение с базой данных, может потребоваться секунда для запуска, прежде чем команда (ы) может быть обработана.Однако, если вы закроете и снова откроете его, соединение будет доступно немедленно.Более подробная информация здесь: http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx

Теперь, что касается вашего кода, вы, вообще говоря, открываете 1 SqlConnection каждый раз, когда делаете вызов SqlCommand;однако вполне допустимо / разумно делать несколько вызовов SqlCommand, находясь в одном и том же блоке в соответствии с предложением SqlConnection.

Просто имейте в виду, что вы НЕ хотите, чтобы объект SqlConnection зависал в вашем коде длядольше, чем это абсолютно необходимо.Это может привести к множеству потенциальных проблем, особенно если вы занимаетесь веб-разработкой.Это означает, что для вашего кода гораздо лучше открывать и закрывать 100 объектов SqlConnection в быстрой последовательности, чем удерживать этот объект и передавать его различными способами.

2 голосов
/ 04 мая 2011

Открыть только один SQLConnection

Используйте keyworkd Используя , так как он автоматически удалит соединение.

Если вы откроете соединение для каждого из них, у него могут быть проблемы с производительностью.

Пример:

using (SqlConnection con = new SqlConnection(connectionString))
    {
        //
        // Open the SqlConnection.
        //
        con.Open();
        //
        // The following code shows how you can use an SqlCommand based on the SqlConnection.
        //
        using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1", con))
        using (SqlDataReader reader = command.ExecuteReader())
        {
        while (reader.Read())
        {
            Console.WriteLine("{0} {1} {2}",
            reader.GetInt32(0), reader.GetString(1), reader.GetString(2));
        }
        }
    }

Еще один пример:

public  DataTable GetData()
        {
            DataTable dt = new DataTable();
            using (SqlConnection con = new SqlConnection("your connection here")
            {
                con.Open();
                using (SqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "your stored procedure here";                    
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(dt);
                    }
                }
            }
            return dt;
        }
1 голос
/ 04 мая 2011

Наличие одного SqlConnection и множества SqlCommands будет работать нормально, однако вы должны убедиться, что вы утилизируете все SqlDataReaders, которые были возвращены из предыдущих команд, прежде чем пытаться выполнить дополнительные команды.

using (SqlConnection conn = new SqlConnection())
{
    conn.Open()

    using (SqlCommand cmd = new SqlCommand("SELECT myrow FROM mytable", conn))
    {
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            // Handle first resultset here
        }
    }

    using (SqlCommand cmd = new SqlCommand("SELECT otherrow FROM othertable", conn))
    {
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            // Handle second resultset here
        }
    }
}

В качестве альтернативы вы можете объединить свои команды в один пакет и вместо этого обработать несколько результирующих наборов, например:

using (SqlConnection conn = new SqlConnection())
{
    conn.Open()
    using (SqlCommand cmd = new SqlCommand("SELECT myrow FROM mytable; SELECT otherrow FROM othertable", conn))
    {
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            // Handle first resultset here, and then when done call
            if (reader.NextResult())
            {
                // Handle second resultset here
            }
        }
    }
}

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

0 голосов
/ 04 мая 2011

Чисто как альтернатива с использованием операторов:

SqlConnection con = new SqlConnection(myConnectionString);

SqlCommand cmd = con.CreateCommand();
cmd.CommandText = @"SELECT [stuff] FROM [tableOfStuff]";

con.Open();

SqlDataReader dr = null;
try
{
    dr = cmd.ExecuteReader();

    while(dr.Read())
    {
        // Populate your business objects/data tables/whatever
    }
}
catch(SomeTypeOfException ex){ /* handle exception */ }

// Manually call Dispose()...
if(con != null) con.Dispose();
if(cmd != null) cmd.Dispose();
if(dr != null) dr.Dispose();

Основное различие между этим и операторами использования состоит в том, что это позволит вам обрабатывать исключения более аккуратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...