¿Cómo se puede conectar con un proveedor de datos ProgressDB con Dapper?

c# dapper openedge progress-db

Pregunta

Lea los comentarios de la respuesta para una comprensión más completa de cuál es el problema / era

Primero, leo muchas otras preguntas relacionadas con esto y todavía no puedo hacer que esto funcione con una configuración básica. Aquí está la pregunta relacionada que ya leí:

Pasar parámetros de consulta en Dapper usando OleDb

EDIT: la solución de problemas a continuación es un tanto engañosa. Lo único que salió mal fue que la sintaxis de consulta del ejemplo de Github no era válida con el controlador ProgressDB OpenEdge.

El problema con la respuesta de esa pregunta y con el ejemplo dado en los ejemplos documentados de Git es que no se está utilizando un verdadero objeto ODBC, sino más bien un objeto OleDbConnection . Esto causa problemas con el escenario en el que estoy tratando de usar Dapper. Algunos antecedentes y restricciones a mi escenario:

  • No puedo cambiar la tecnología de DB, nos estamos conectando a un DB de Progreso. La cadena de conexión para conectarse a la base de datos: connectionString = "PROVIDER = MSDASQL ; DRIVER = {Progress OpenEdge 10.2A Driver}; HOST = ...; PORT = ...; DB = mfgsys; UID = ...; PWD = ...; DIL = LEER NO COMPROMETIDO "Observe el proveedor: MSDASQL
  • Según MSDN, https://msdn.microsoft.com/en-us/library/a6cd7c08%28v=vs.110%29.aspx - " .NET Framework Data Provider para OLE DB no funciona con el proveedor OLE DB para ODBC (MSDASQL). Para acceder a una fuente de datos ODBC utilizando ADO.NET, use el Proveedor de datos de .NET Framework para ODBC. "
  • Cuando intento utilizar el objeto OdbcConnection con Dapper OdbcConnection el siguiente error: " System.Data.Odbc.OdbcException: ERROR [HY000] [DataDirect] [ODBC Progress OpenEdge Wire Protocol driver] [OPENEDGE] Error de sintaxis en la declaración de SQL en o sobre "=?, Age =?" (10713) "

Estoy usando exactamente la misma sintaxis de consulta que la otra pregunta SO:

var row = _odbcConn.Query("select Id = ?, Age = ?", new DynamicParameters(new{foo = 12, bar = 23}) {RemoveUnused = false}).Single();

También DynamicParameters objeto DynamicParameters e intenté con un objeto dinámico con el mismo resultado:

var row = _odbcConn.Query("select Id = ?, Age = ?", new{foo = 12, bar = 23}).Single();

¿Hay alguna manera de lograr esta simple consulta utilizando un objeto OdbcConnection? ¿O esto realmente tiene más que ver con el controlador Progress específico que estamos utilizando y, como tal, impide usar Dapper?

Editar

Incluyendo el código ADO.Net en funcionamiento por solicitudes a continuación, Build.FromReader<EmployeeDataModel>(reader) simplemente realiza un bucle a través del lector y mapea las columnas con codificación rígida y se confirma que funciona:

public class EmployeeRepository : IEmployeeRepository
{
    private readonly OdbcConnection _sqlConn = new OdbcConnection();

    public EmployeeRepository() : this(ConfigurationManager.ConnectionStrings["TCI_Epicor"].ConnectionString) { }
    public EmployeeRepository(string connString)
    {
        _sqlConn.ConnectionString = connString;
    }

    public EmployeeDataModel GetById(string id)
    {
        try
        {
            _sqlConn.Open();
            using (OdbcCommand command = new OdbcCommand())
            {
                command.Connection = _sqlConn;
                command.CommandType = CommandType.Text;
                command.CommandText = GetEmployeeDataQuery();
                command.Parameters.Add("empID", OdbcType.NVarChar);
                command.Parameters["empID"].Value = id;
                var reader = command.ExecuteReader();
                return Build.FromReader<EmployeeDataModel>(reader);
            }
        }
        catch
        {
            return new EmployeeDataModel();
        }
        finally
        {
            _sqlConn.Close();
        }
    }

    private string GetEmployeeDataQuery()
    {
        var sb = new StringBuilder();
        sb.AppendLine("SELECT EmpID as 'EmployeeID',");
        sb.AppendLine("       FirstName + ' ' + LastName as 'EmployeeName'");
        sb.AppendLine("  FROM MFGSYS.PUB.EmpBasic");
        sb.AppendLine(" WHERE EmpID = ?");
        return sb.ToString();
    }
}

Respuesta aceptada

Si el problema es usar parámetros anónimos ( ? ), Entonces:

var row = _odbcConn.Query(
    "select Id = ?foo?, Age = ?bar?", new { foo = 12, bar = 23 }
).Single();

Dapper reescribirá eso según su consulta original, pero sabrá qué parámetro colocar.

Sin embargo, si el problema es que el proveedor ODBC no admite parámetros: Yo no puedo ayudarle mucho con eso :( Si usted puede demostrar cómo hacerlo en el trabajo de código ADO.NET, es probable que pueda mostrarle cómo hacer que sea más fácil a través de dapper.



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é