2012-05-11 5 views
2

Я хочу вызвать хранимую процедуру с помощью C#.Вызов хранимой процедуры в C#

Я хотел бы создать сокращенную форму для вызова процедуры.

Я все еще не хочу переопределять соединение и открывать его. Как создать метод - я все еще не открыл соединение с базой данных?

Я использую следующий код:

SqlConnection conn = null; 
SqlDataReader rdr = null; 

conn = new SqlConnection(""); 
conn.Open(); 

SqlCommand cmd = new SqlCommand("Procedure", conn); 
cmd.CommandType = CommandType.StoredProcedure; 

rdr = cmd.ExecuteReader(); 

while (rdr.Read()) 
{ 
} 
+2

Ouch. Я думаю, вам нужно уточнить или переосмыслить свой вопрос. Если вы спрашиваете нас, как обернуть это методом, вам нужна дополнительная помощь, чем мы можем вам дать. Кроме того, вам не хватает дерьма при использовании вызовов и/или Dispose(). –

+1

** Я все еще не хочу переопределять соединение и открывать его. ** Можете ли вы повторить это? Я не понимаю. – McGarnagle

+1

Сначала вы прочитали документацию MSDN на SqlConnection, которая ответит на половину ваших вопросов. – ErnieL

ответ

1

ответ FlyingStreudel это хорошо, но я адаптировал этот код, чтобы эта версия демонстрировала лучшие практики (ссылки внизу). Вы также можете использовать корпоративную библиотеку Microsoft, которая даст вам надежные классы доступа к данным.

private string _connectionString = "yourconnectionstring"; // from web.config, or wherever you store it 
public static SqlDataReader executeProcedure(string commandName, 
             Dictionary<string, object> params) 
{ 
    SqlConnection conn = new SqlConnection(_connectionString); 
    conn.Open(); 
    SqlCommand comm = conn.CreateCommand(); 
    comm.CommandType = CommandType.StoredProcedure; 
    comm.CommandText = commandName; 
    if (params != null) 
    { 
     foreach(KeyValuePair<string, object> kvp in params) 
      comm.Parameters.Add(new SqlParameter(kvp.Key, kvp.Value)); 
    } 
    return comm.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 
} 

используется, например, так:

Dictionary<string, object> paras = new Dictionary<string, object>(); 
paras.Add("user_name", "Timmy"); 
paras.Add("date", DateTime.Now); 
using(SqlDataReader results = executeProcedure("sp_add_user", paras)) 
{ 
    while (results.Read()) 
    { 
     //do something with the rows returned 
    } 
} 

Ссылки:

How Microsoft use Connections in Enterprise Library

Keeping an SqlConnection open is 'foo bar'

Returning a data reader from a class

+1

Вы законно просто скопировали и вставили мой код и добавили две строки. Не рекомендуется создавать соединение для каждого вызова процедуры. У вашего метода есть строковая переменная частного соединения, также ужасно, если вы когда-либо захотите изменить базу данных, с которой вы работаете, вам придется перекомпилировать ваш код. – FlyingStreudel

+1

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

0
using (SqlConnection sqlConnection1 = new SqlConnection("Your Connection String")) { 
using (SqlCommand cmd = new SqlCommand()) { 
    Int32 rowsAffected; 

    cmd.CommandText = "StoredProcedureName"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Connection = sqlConnection1; 

    sqlConnection1.Open(); 

    rowsAffected = cmd.ExecuteNonQuery(); 

}} 
0

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

Вы можете, например, обернуть этот код оболочки как ExecuteProcedure(), который ожидает, что строка соединения вернется в базу данных.

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

0

Вы можете обернуть этот код и принять процедуру как параметр. Что-то вроде этого:

public SqlCommand GetData(string procedure) 
{ 
    var conn = new SqlConnection(connectionString); 
    var cmd = new SqlCommand(procedure, conn); 

    cmd.CommandType = CommandType.StoredProcedure; 
    conn.Open(); 
    return cmd; 
} 

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

1

Я понятия не имею, если я понимаю, что вы просите или нет, но вы имеете в виду что-то вроде:

public static SqlReader executeProcedure(SqlConnection oConn, string commandName, Dictionary<string, object> params) 
{ 
    SqlCommand comm = oConn.CreateCommand(); 
    comm.CommandType = CommandType.StoredProcedure; 
    comm.CommandText = commandName; 
    if (params != null) 
     foreach(KeyValuePair<string, object> kvp in params) 
      comm.Parameters.Add(new SqlParameter(kvp.Key, kvp.Value)); 
    return comm.ExecuteReader(); 
} 

Примером использования может быть

Dictionary<string, object> paras = new Dictionary<string, object>(); 
paras.Add("user_name", "Timmy"); 
paras.Add("date", DateTime.Now); 
SqlReader results = executeProcedure(oConn, "sp_add_user", paras); 
while (results.Read()) 
{ 
    //do something with the rows returned 
} 
results.Close(); 
+0

Как создать метод для извлечения данных? Мне нужно прочитать данные. – JohnMalcom

+0

Вы не можете создать метод для извлечения данных, поскольку столбец будет отличаться от любого сохраненного вами запроса. Вы можете просто увеличивать строку в 'SqlReader' и обрабатывать до завершения. – FlyingStreudel

+0

Как добавить параметры в команду sql? – JohnMalcom

Смежные вопросы