你怎么能连接到同一个精致小巧的数据ProgressDB供应商?

问题描述 投票:2回答:1

请阅读答案的评论针对的是什么问题,更完整地理解/是

首先,我经历了很多与此相关的其他做题阅读,仍然不能得到这个有一个基本的设置工作。这里是我已经阅读了相关的问题:

Passing query parameters in Dapper using OleDb

编辑:下面的故障排除是有点误导。这是走错了来自GitHub的例子查询语法的唯一的事情是不是有效使用ProgressDB OpenEdge驱动程序。

与这个问题的答案,并在记录的Git的例子给出的示例中的问题是,没有使用真正的ODBC对象,而是一个OleDbConnection对象。这会导致在那里我想使用小巧精致的场景问题。一些背景和限制,以我的情况:

  • 我不能改变数据库的技术,我们连接到数据库的进展。连接字符串连接到数据库:的connectionString =“PROVIDER = MSDASQL; DRIVER = {进展OpenEdge 10.2A驱动程序}; HOST = ...; PORT = ...; DB = mfgsys; UID = ...; PWD = ...; DIL =未提交读”注意提供者:MSDASQL
  • 根据MSDN,https://msdn.microsoft.com/en-us/library/a6cd7c08%28v=vs.110%29.aspx - “的.NET Framework数据提供OLE DB不与OLE DB提供程序的ODBC(MSDASQL)工作要使用ADO.NET访问ODBC数据源,使用的ODBC .NET Framework数据提供“。
  • 当我尝试使用带有精致小巧的OdbcConnection对象,我得到了以下错误:“System.Data.Odbc.OdbcException:ERROR [HY000] [的DataDirect] [ODBC进展OpenEdge Wire Protocol驱动程序] [OPENEDGE]语法错误在SQL语句或在关于 “=?,年龄=?”(10713)”

我使用的是完全相同的查询语法与其他SO问题:

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

我也删除了DynamicParameters对象,并试图用同样的结果动态对象:

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

有没有办法来完成使用OdbcConnection对象这个简单的查询?或者这是否真的有更多的事情要做,我们正在使用的具体进展的驱动程序,并且应用这种小巧玲珑排除了?

Edit

包括工作按照以下要求ADO.Net代码中,Build.FromReader<EmployeeDataModel>(reader)只是循环通过阅读器和列硬编码的地图和确认工作:

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();
    }
}
c# dapper openedge progress-db
1个回答
3
投票

如果问题是使用匿名(?)参数,则:

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

小巧玲珑将改写说,按照原来的查询,但会知道把哪些参数哪里。

但是,如果问题是ODBC提供程序不支持参数:我不禁大为与:(如果你能证明如何做到这一点的工作ADO.NET代码,我也许可以告诉你如何做到这一点更容易通过短小精悍。

© www.soinside.com 2019 - 2024. All rights reserved.