Show return value SQL Server in WPF window C #

1

I have the following code with which I recover the value that a stored procedure returns to me

public bool EjecutarSQL(string consecutivo, string otratabla)
    {
        Clsconexion objConexion = new Clsconexion();
        objConexion.SQL = "EXECUTE insertarDatos" + "'" + consecutivo + "'" + "," + "'" + otratabla + "'";
        objConexion.NombreTabla = "tconsecutivo";
        if (objConexion.LlenarDataSet(false) == true)
        {
            tblTablaDatos = objConexion.MiDataSet.Tables[0];
            if (tblTablaDatos.Rows.Count>0)//se encontraron datos
            {
                respuesta = tblTablaDatos.Rows[0][0].ToString();
                objConexion.CerrarConexion();
                objConexion = null;
                return true;
            }
            else
            {
                tblTablaDatos = null;
                strerror = "No se encontraron datos, soy un error de capa dao";
                objConexion.CerrarConexion();
                objConexion = null;
                return false;
            }
        }
        else
        {
            strerror = objConexion.Error;
            objConexion.CerrarConexion();
            objConexion = null;
            return false;
        }
    }

That I keep it in the variable answer , this fragment I have in a data layer as I can take that variable to the view layer To not make this query in the view if not return to the view only that result.

Pd: this code is for tests, please excuse my comments on the unprofessional names.

I appreciate all your contributions

    
asked by Brian Velez 06.12.2018 в 16:26
source

2 answers

3

You can use the keyword out which modifies the parameter to allow you to pass an argument to a method using a reference instead of a value.

public bool EjecutarSQL(string consecutivo, string otratabla, out string respuesta)
{
    respuesta = string.Empty;
    Clsconexion objConexion = new Clsconexion();
    objConexion.SQL = "EXECUTE insertarDatos" + "'" + consecutivo + "'" + "," + "'" + otratabla + "'";
    objConexion.NombreTabla = "tconsecutivo";
    if (objConexion.LlenarDataSet(false) == true)
    {
        tblTablaDatos = objConexion.MiDataSet.Tables[0];
        if (tblTablaDatos.Rows.Count>0)//se encontraron datos
        {
            respuesta = tblTablaDatos.Rows[0][0].ToString();
            objConexion.CerrarConexion();
            objConexion = null;
            return true;
        }
        else
        {
            tblTablaDatos = null;
            strerror = "No se encontraron datos, soy un error de capa dao";
            objConexion.CerrarConexion();
            objConexion = null;
            return false;
        }
    }
    else
    {
        strerror = objConexion.Error;
        objConexion.CerrarConexion();
        objConexion = null;
        return false;
    }
}

And from your view you can call it like this:

string respuesta;

bool flag = EjecutarSQL(consecutivo, otratabla, out respuesta);

// demas validaciones pertinentes
    
answered by 06.12.2018 / 16:37
source
1

Although you already got an answer, I will add another way of doing it, which does not involve using output variables.

The idea is to return more than one value in a method. From my point of view the parameters of a method is better to leave them input.

To return more than one value in a method you can use the tuple type, which is defined in System.

Example of use:

public Tuple<bool, string> EjecutarSQL(string consecutivo, string otratabla)
{
    var respuesta = string.Empty;
    var objConexion = new Clsconexion();
    objConexion.SQL = "EXECUTE insertarDatos" + "'" + consecutivo + "'" + "," + "'" + otratabla + "'";
    objConexion.NombreTabla = "tconsecutivo";

    if (objConexion.LlenarDataSet(false) == true)
    {
        tblTablaDatos = objConexion.MiDataSet.Tables[0];
        if (tblTablaDatos.Rows.Count > 0) 
        {
            respuesta = tblTablaDatos.Rows[0][0].ToString();
            objConexion.CerrarConexion();
            objConexion = null;
            return Tuple.Create(true, respuesta);
        }
        else
        {
            tblTablaDatos = null;
            strerror = "No se encontraron datos, soy un error de capa dao";
            objConexion.CerrarConexion();
            objConexion = null;
            return Tuple.Create(false, respuesta);
        }
    }
    else
    {
        strerror = objConexion.Error;
        objConexion.CerrarConexion();
        objConexion = null;
        return Tuple.Create(false, respuesta);
    }
}

And to use it:

var result = EjecutarSQL(consecutivo, otratabla);
if (result.Item1) // Item1 contiene el primer valor, el bool
{
    var respuesta = result.Item2; // Item2 tiene el segundo valor, el tipo string
    // resto del código
}

EDIT: If you use Visual Studio 2017 you have access to C # 7, so you can use the new ValueTuple type, the previous example would be like that with the ValueTuple:

public (bool, string) EjecutarSQL(string consecutivo, string otratabla)
{
    var respuesta = string.Empty;
    var objConexion = new Clsconexion();
    objConexion.SQL = "EXECUTE insertarDatos" + "'" + consecutivo + "'" + "," + "'" + otratabla + "'";
    objConexion.NombreTabla = "tconsecutivo";

    if (objConexion.LlenarDataSet(false) == true)
    {
        tblTablaDatos = objConexion.MiDataSet.Tables[0];
        if (tblTablaDatos.Rows.Count > 0) 
        {
            respuesta = tblTablaDatos.Rows[0][0].ToString();
            objConexion.CerrarConexion();
            objConexion = null;
            return (true, respuesta);
        }
        else
        {
            tblTablaDatos = null;
            strerror = "No se encontraron datos, soy un error de capa dao";
            objConexion.CerrarConexion();
            objConexion = null;
            return (false, respuesta);
        }
    }
    else
    {
        strerror = objConexion.Error;
        objConexion.CerrarConexion();
        objConexion = null;
        return (false, respuesta);
    }
}

And it's used like this:

(bool success, string respuesta) = EjecutarSQL(consecutivo, otratabla);
if (success)
{
    // aquí puedes usar la variable respuesta
    // resto del código
}
    
answered by 06.12.2018 в 17:26