Comment pouvez-vous vous connecter à un fournisseur de données ProgressDB avec Dapper?

c# dapper openedge progress-db

Question

S'il vous plaît lire les commentaires de la réponse pour une compréhension plus complète du problème est / était

Tout d'abord, j'ai lu beaucoup d'autres questions SO liées à cela et je n'arrive toujours pas à le faire fonctionner avec une configuration de base. Voici la question connexe que j'ai déjà lue:

Passer des paramètres de requête dans Dapper à l'aide d'OleDb

EDIT: Le dépannage ci-dessous est quelque peu trompeur. La seule chose qui n'allait pas était la syntaxe de requête de l'exemple Github qui n'était pas valide avec le pilote ProgressDB OpenEdge.

Le problème avec la réponse à cette question et avec l'exemple donné dans les exemples de Git documentés est qu'un objet ODBC vrai n'est pas utilisé, mais plutôt un objet OleDbConnection . Cela provoque des problèmes avec le scénario dans lequel j'essaie d'utiliser Dapper. Quelques antécédents et restrictions à mon scénario:

  • Je ne peux pas modifier la technologie DB, nous nous connectons à une base de données Progress. La chaîne de connexion à connecter à la base de données: connectionString = "PROVIDER = MSDASQL ; DRIVER = {Pilote OpenEdge 10.2A}; HOST = ...; PORT = ...; DB = mfgsys; UID = ...; PWD = ...; DIL = READ UNCOMMITTED "Remarquez le fournisseur: MSDASQL
  • Selon MSDN, https://msdn.microsoft.com/en-us/library/a6cd7c08%28v=vs.110%29.aspx - " Le fournisseur de données .NET Framework pour OLE DB ne fonctionne pas avec le fournisseur OLE DB pour ODBC (MSDASQL). Pour accéder à une source de données ODBC à l'aide de ADO.NET, utilisez le fournisseur de données .NET Framework pour ODBC. "
  • Lorsque OdbcConnection d'utiliser l'objet OdbcConnection avec Dapper, j'obtiens l'erreur suivante: " System.Data.Odbc.OdbcException: ERREUR [HY000] [DataDirect] [Pilote ODBC Progress OpenEdge Wire Protocol] [OPENEDGE] Erreur de syntaxe dans l'instruction SQL à ou à propos de "=?, Age =?" (10713) "

J'utilise exactement la même syntaxe de requête que l'autre question SO:

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

J'ai aussi supprimé l'objet DynamicParameters et tenté avec un objet dynamique avec le même résultat:

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

Est-il possible d'accomplir cette requête simple en utilisant un objet OdbcConnection? Ou est-ce que cela a plus à voir avec le pilote spécifique Progress que nous utilisons et en tant que tel empêche d'utiliser Dapper?

modifier

En incluant le code ADO.Net fonctionnel par requête ci-dessous, le Build.FromReader<EmployeeDataModel>(reader) ne fait que parcourir le lecteur et mappe les colonnes avec un codage en dur et est confirmé pour fonctionner:

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();
    }
}

Réponse acceptée

Si le problème utilise des paramètres anonymes ( ? ), Alors:

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

Dapper va réécrire cela selon votre requête d'origine, mais saura quel paramètre mettre où.

Toutefois, si le problème est que le fournisseur ODBC ne prend pas en charge les paramètres: Je ne peux pas aider beaucoup avec ce :( Si vous pouvez montrer comment le faire dans le travail du code ADO.NET, je peux probablement vous montrer comment faire plus facile via Dapper.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi