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

Повторное использование SqlCommand?

Я не уверен, возможно ли это или нет.

В настоящее время я работаю над проектом колледжа, и у меня есть функция, которая использует хранимые процедуры. Я хотел бы знать, можно ли взять тот же экземпляр SqlCommand и применить обновленные параметры для повторного вызова хранимой процедуры в пределах одной и той же функции.

Позволяет сказать, что в моем коде есть что-то подобное:

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
myConn = new SqlConnection(myConStr);
myCommand = new System.Data.SqlClient.SqlCommand("team5UserCurrentBooks3", myConn); 
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@book_id", bookID);
myCommand.Parameters.AddWithValue("@user_id", userID);

try
{
    myConn.Open();
    myCommand.ExecuteNonQuery();

Возможно ли обновить параметры MyCommand и снова вызвать хранимую процедуру?

4b9b3361

Ответ 1

Да. Вы захотите убедиться, что вы вызываете myCommand.Parameters.Clear между каждым вызовом, чтобы сбрасывать параметры, но ничего не мешает вам повторно использовать объект. (Я не часто использую С#, поэтому в тексте может быть ошибка или два)

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
myConn = new SqlConnection(myConStr);
myConn.Open();

myCommand = new System.Data.SqlClient.SqlCommand("team5UserCurrentBooks3", myConn); 
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@book_id", bookID);
myCommand.Parameters.AddWithValue("@user_id", userID);
myCommand.ExecuteNonQuery();

myCommand.Parameters.Clear();
myCommand.CommandText= "NewStoredProcedureName";
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@foo_id", fooId);
myCommand.Parameters.AddWithValue("@bar_id", barId);
mycommand.ExecuteNonQuery();

myCommand.Parameters.Clear();
myCommand.CommandText = " SELECT * FROM table1 WHERE ID = @TID;"
myCommand.CommandType = CommandType.Text;
myCommand.Parameters.AddWithValue("@tid", tId);
SqlReader rdr;
rdr = myCommand.ExecuteReader();

Ответ 2

Да! Вы определенно можете сделать это. Внутри функции вы также можете повторно использовать то же соединение (я не рекомендую повторно использовать объект соединения для больших областей, но это возможно).

Вы также можете сделать что-то вроде этого:

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
using (var cn = new SqlConnection(myConStr) )
using (var cmd = new SqlCommand("team5UserCurrentBooks3", cn) ) 
{
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@user_id", SqlDbType.Int).Value = userID;
    cmd.Parameters.Add("@book_id", SqlDbType.Int);
    cn.Open();

    for(int i = 0; i<10; i++)
    {
        cmd.Parameters["@book_id"].Value = i;
        cmd.ExecuteNonQuery();
    }
}

Это выполнит запрос 10 раз и будет использовать один и тот же user_id каждый раз, когда он выполняется, но изменит book_id. Блок using - это то же самое, что обернуть ваше соединение в try/catch, чтобы убедиться, что оно закрыто.