Intentando obtener el valor de una consulta SQL en una cadena

c# dapper sql-server

Pregunta

Estoy ejecutando una consulta SQL en SQL Server dentro de mi aplicación WPF C #. La consulta devuelve una cadena que contiene el valor llamado MYCOUNT que quiero devolver a GetNumber . ¿Cómo devuelvo el valor MYCOUNT solo para obtener el número y no toda la cadena?

public string GetNumber(string SkillNumber)       
{
    DateTime dte = DateTime.Today;
    string fixedStartDate = String.Format("{0:yyyy-MM-dd " + "05:00:00.000" + "}", dte);
    string fixedEndDate = String.Format("{0:yyyy-MM-dd " + "05:00:00.000" + "}", dte.AddDays(1));

    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SQLHelper.CnnCal("OADB")))
    {
        var x = connection.Query($"SELECT COUNT(SOURCEID) AS 'MYCOUNT' "
                         + "FROM [OADB].[oadb].[CmsCallHistory] "
                         + "WHERE disposition = 2 and DISPSPLIT in (" + SkillNumber + ") AND SEGSTOP BETWEEN '" +
                         fixedStartDate + "' and '" + fixedEndDate + "'");

        return x.ToString();
    }
}

Esto es lo que regresa Solo necesito devolver el valor:

enter image description here

Respuesta aceptada

Obtiene un error porque el método Dapper Query devuelve un valor IEnumerable, no un valor único (de hecho, puede ver que tiene un objeto (un int) en el IEnumerable devuelto y este objeto tiene el valor '767')

En Dapper puedes usar ExecuteScalar para obtener un único valor escalar a medida que tu consulta retorna

var x = connection.ExecuteScalar<int>(.....)

También puede usar el método Query pero con un giro Linq

var x = connection.Query(.....).Single();

La advertencia habitual sobre Inyección Sql se aplica a su código, aunque parametrizar una cláusula IN no es tan simple. Y las dos fechas deberían ser definitivamente parámetros para evitar el análisis de incompatibilidades entre lo que usted considera que es una fecha y, en su lugar, el servidor sql y su configuración regional piensan en transformar una cadena en una fecha y hora.


Respuesta popular

Su respuesta está en la documentación de msdn: https://msdn.microsoft.com/en-us/library/system.data.idbconnection(v=vs.110).aspx

Puedes intentar usar

using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SQLHelper.CnnCal("OADB")))
{
    IDbCommand command = connection.createCommand();
    command.CommandText = $"SELECT COUNT(SOURCEID) AS 'MYCOUNT' "
                     + "FROM [OADB].[oadb].[CmsCallHistory] "
                     + "WHERE disposition = 2 and DISPSPLIT in (" + SkillNumber + ") AND SEGSTOP BETWEEN '" +
                     fixedStartDate + "' and '" + fixedEndDate + "'";
    return (string)command.ExecuteScalar();
}

Otra nota: quieres intentar y cerrar la conexión una vez que hayas terminado. Recomiendo poner esto en una declaración try / catch / finally para que pueda cerrar su conexión en la sección 'finally'.

¡Espero que esto ayude!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué