Повторно использовать SqlCommand? - PullRequest
41 голосов
/ 22 марта 2009

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

В настоящее время я работаю над проектом колледжа, и у меня есть функция, которая использует хранимые процедуры. Я хотел бы знать, можно ли взять тот же экземпляр 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 и снова вызвать хранимую процедуру?

Ответы [ 2 ]

51 голосов
/ 22 марта 2009

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

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();
11 голосов
/ 22 марта 2009

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

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

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, чтобы убедиться, что оно закрыто.

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