2013-09-15 8 views
9

Здравствуйте, я написал свои DAL-вызовы Хранимые процедуры, но я до сих пор не знаю, следует ли мне использовать ExecuteScalar, NonQuery или Reader для некоторых процедур.C# лучший способ вызвать хранимые процедуры MySQL, функции

Например, я написал эту функцию, которую я хочу назвать

CREATE FUNCTION `retornarIdArea`(cod longtext) RETURNS int(11) 
BEGIN 
DECLARE id int; 
    select AreaId into id FROM area where Codigo = cod; 
    return id; 
END 

этой процедура, которая должна возвращать набор данных

CREATE PROCEDURE `consultar_n_asunto`(in asun longtext, in est int) 
BEGIN 
    select * from notas where Asunto LIKE CONCAT('%',CONCAT(asun,'%')) AND Estado = est; 
END$$ 

И последнюю процедуру, которая вставляет некоторые данные, и я проверить, что с a выберите, используя выходной параметр.

CREATE PROCEDURE `registrar_dest`(in nomb longtext, 
in dir longtext, in inst int, in mail longtext, in tel longtext, 
in act int, out res tinyint(1)) 
BEGIN 
    -- verificar que no exista el destinatario 
    select count(*) into res from destinatario WHERE Nombre = nomb AND 
    Direccion = dir AND Email = mail AND Telefono = tel AND Activo = act; 

    IF res = 0 THEN 
     INSERT INTO destinatario (Nombre, Direccion, InstitucionId, Email, Telefono, Activo) 
     VALUES (nomb, dir, inst, mail, tel, act); 
     select count(*) into res from destinatario WHERE Nombre = nomb AND 
     Direccion = dir AND Email = mail AND Telefono = tel AND Activo = act; 
    ELSE 
     set res = -1; 
    END IF; 
END$$ 

Теперь я писал в C# для возврата значений из функций

public object ejecutarFuncion() 
    { 
     using (MySqlConnection conn = new MySqlConnection(stringDeConexion)) 
     { 
      using (MySqlCommand cmd = new MySqlCommand(procedimiento, conn)) 
      { 
       cmd.CommandType = System.Data.CommandType.StoredProcedure; 
       //Se abre la conexión 
       conn.Open(); 
       //existen parámetros los recorremos y agregamos. 
       foreach (KeyValuePair<string, object> pars in parametros) 
       { 
        cmd.Parameters.Add(new MySqlParameter(pars.Key, pars.Value)); 
       } 
       //Se crea la variable de retorno 
       cmd.Parameters.Add(new MySqlParameter(nombreOut, tipoParOut)); 
       cmd.Parameters[nombreOut].Direction = System.Data.ParameterDirection.ReturnValue; 
       cmd.ExecuteNonQuery(); 
       // Cerramos conexión 
       conn.Close(); 
       return cmd.Parameters[nombreOut].Value; 
      } 
     } 
    } 

Если вы видите, что я делаю ExecuteNonQuery(), но я должен использоваться Execute Scalar? или просто использовать возвращаемое значение из парм?

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

public object ejecutarProcedimientoConOutput() 
{ 
    using (MySqlConnection conn = new MySqlConnection(stringDeConexion)) 
    { 
     using (MySqlCommand cmd = new MySqlCommand(procedimiento, conn)) 
     { 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 
      //Se abre la conexión 
      conn.Open(); 
      //verificamos si se mando la lista de parámetros 
      if (parametros.Count > 0) 
      { 
       //existen parámetros los recorremos y agregamos. 
       foreach (KeyValuePair<string, object> pars in parametros) 
       { 
        cmd.Parameters.Add(new MySqlParameter(pars.Key, pars.Value)); 
        cmd.Parameters[pars.Key].Direction = System.Data.ParameterDirection.Input; 
       } 
      } 
      cmd.Parameters.Add(new MySqlParameter(nombreOut, tipoParOut)); 
      cmd.Parameters[nombreOut].Direction = System.Data.ParameterDirection.Output; 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 
      return cmd.Parameters[nombreOut].Value; 
     } 
    } 
} 

Опять же, если я делаю обновление или вставить операцию, но я использую выходной параметр, чтобы проверить, если это было сделано, вы можете проверить вставку хранимой процедуры следует использовать ExecuteNonQuery или ExecuteScalar?

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

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

ответ

6
  • Если вы хотите, чтобы количество строк, затронутых запросом, чтобы возвратить затем использовать ExecuteNonReader().

  • Если вы хотите, чтобы первый столбец первой строки был возвращен, используйте ExecuteScalar.

  • Если вам нужно создать SqlDataReader, чтобы вы могли выполнить итерацию по результату, воспользуйтесь ExecuteReader.

Таким образом, вы могли бы использовать ExecuteScalar для функции retornarIdArea, так как вы только когда-либо вернуться на один столбец и одну строку (идентификатор), поэтому эта функция соответствует контексту.

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

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