Подтвердить что ты не робот

Как запустить несколько SQL-команд в одном соединении SQL?

Я создаю проект, в котором мне нужно запустить 2-3 sql-команды в одном соединении sql. Вот код, который я написал:

SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\project.mdf;Integrated Security=True");
con.Open();
SqlCommand cmd = new SqlCommand("select *  from " + mytags.Text + " ", con);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.Read())
{
    con.Close();
    con.Open();
    SqlCommand cmd1 = new SqlCommand("insert into " + mytags.Text + " values ('[email protected]','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','"+mytags.Text+"')", con);
    cmd1.ExecuteNonQuery();
    label.Visible = true;
    label.Text = "Date read and inserted";
}
else
{
    con.Close();
    con.Open();
    SqlCommand cmd2 = new SqlCommand("create table " + mytags.Text + " ( session VARCHAR(MAX) , Price int , Description VARCHAR(MAX), Date VARCHAR(20),tag VARCHAR(10))", con);
    cmd2.ExecuteNonQuery();
    con.Close();
    con.Open();
    SqlCommand cmd3 = new SqlCommand("insert into " + mytags.Text + " values ('" + Session + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + mytags.Text + "')", con);
    cmd3.ExecuteNonQuery();
    label.Visible = true;
    label.Text = "tabel created";
    con.Close();
}

Я попытался удалить ошибку, и я понял, что соединение не будет выполнено иначе. Просмотрите код и предположите, есть ли какая-либо ошибка или какое-либо другое решение для этого.

4b9b3361

Ответ 1

Просто измените SqlCommand.CommandText вместо создания нового SqlCommand каждый раз. Нет необходимости закрывать и снова открывать соединение.

// Create the first command and execute
var command = new SqlCommand("<SQL Command>", myConnection);
var reader = command.ExecuteReader();

// Change the SQL Command and execute
command.CommandText = "<New SQL Command>";
command.ExecuteNonQuery();

Ответ 2

Следующее должно работать. Храните одно соединение открытым все время и просто создавайте новые команды и выполняйте их.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command1 = new SqlCommand(commandText1, connection))
    {
    }
    using (SqlCommand command2 = new SqlCommand(commandText2, connection))
    {
    }
    // etc
}

Ответ 3

Просто включите это свойство в строке подключения:

sqb.MultipleActiveResultSets = true;

Это свойство допускает одно открытое соединение для нескольких считывателей данных.

Ответ 4

Я не тестировал, но основная идея: поставить точку с запятой на каждый запрос.

SqlConnection connection = new SqlConnection();
SqlCommand command = new SqlCommand();
connection.ConnectionString = connectionString; // put your connection string
command.CommandText = @"
     update table
     set somecol = somevalue;
     insert into someTable values(1,'test');";
command.CommandType = CommandType.Text;
command.Connection = connection;

try
{
    connection.Open();
}
finally
{
    command.Dispose();
    connection.Dispose();
}

Update: вы можете следовать Возможно ли иметь несколько инструкций SQL в свойстве ADO.NET Command.CommandText? тоже

Ответ 5

Это, вероятно, будет атаковано с помощью SQL-инъекции. Было бы полезно прочитать об этом и соответствующим образом настроить ваши запросы.

Возможно, посмотрите даже на создание хранимой процедуры для этого и используя что-то вроде sp_executesql, которое может обеспечить некоторую защиту от этого, когда динамическое sql является требованием (т.е. имена неизвестных таблиц и т.д.). Для получения дополнительной информации ознакомьтесь с этой ссылкой.

Ответ 6

Здесь вы можете найти пример Postgre, этот код запускает несколько SQL-команд (обновление 2 столбца) в одном SQL-соединении

public static class SQLTest
    {
        public static void NpgsqlCommand()
        {
            using (NpgsqlConnection connection = new NpgsqlConnection("Server = ; Port = ; User Id = ; " + "Password = ; Database = ;"))
            {
                NpgsqlCommand command1 = new NpgsqlCommand("update xy set xw = 'a' WHERE aa='bb'", connection);
                NpgsqlCommand command2 = new NpgsqlCommand("update xy set xw = 'b' where bb = 'cc'", connection);
                command1.Connection.Open();
                command1.ExecuteNonQuery();
                command2.ExecuteNonQuery();
                command2.Connection.Close();
            }
        }
    }

Ответ 7

Пример нескольких запросов, если кому-то это интересно.

using (OdbcConnection DbConnection = new OdbcConnection("ConnectionString"))
{
  DbConnection.Open();
  using (OdbcCommand DbCommand = DbConnection.CreateCommand())
  {
    DbCommand.CommandText = "INSERT...";
    DbCommand.Parameters.Add("@Name", OdbcType.Text, 20).Value = "name";
    DbCommand.ExecuteNonQuery();

    DbCommand.Parameters.Clear();
    DbCommand.Parameters.Add("@Name", OdbcType.Text, 20).Value = "name2";
    DbCommand.ExecuteNonQuery();
  }
}