Dapper를 사용하여 ProgressDB 데이터 공급자에 어떻게 연결할 수 있습니까?

c# dapper openedge progress-db

문제

문제가 무엇인지에 대한보다 완전한 이해를 위해 대답의 설명을 읽으십시오.

첫째, 나는 이것과 관련된 다른 많은 질문을 읽었으며 여전히 기본 설정으로이 작업을 수행 할 수 없습니다. 다음은 이미 읽은 관련 질문입니다.

OleDb를 사용하여 Dapper에서 쿼리 매개 변수 전달

편집 : 아래의 문제 해결 다소 오해의 소지가 있습니다. 잘못된 점은 ProgressDB OpenEdge 드라이버를 사용하여 Github 예제의 쿼리 구문이 유효하지 않다는 것입니다.

이 질문의 답과 문서화 된 Git 예제에 주어진 예제의 문제점은 실제 ODBC 객체가 사용되지 않고 오히려 OleDbConnection 객체라는 것입니다. 이로 인해 Dapper를 사용하려고하는 시나리오에 문제가 발생합니다. 내 시나리오에 대한 배경 및 제한 사항 :

  • DB 기술을 변경할 수 없으며 Progress DB에 연결하고 있습니다. DB에 연결하기위한 연결 문자열 : connectionString = "PROVIDER = MSDASQL ; DRIVER = {진행 OpenEdge 10.2A 드라이버}; HOST = ...; PORT = ...; DB = mfgsys; UID = ...; PWD = ...; DIL = READ UNCOMMITTED "공급자 유의 사항 : MSDASQL
  • MSDN에 따르면 https://msdn.microsoft.com/en-us/library/a6cd7c08%28v=vs.110%29.aspx - " OLE DB 용 .NET Framework 데이터 공급자는 OLE DB 공급자와 작동하지 않습니다. ODBC (MSDASQL) 용 .ADO.NET을 사용하여 ODBC 데이터 원본에 액세스하려면 ODBC 용 .NET Framework 데이터 공급자를 사용하십시오. "
  • Dapper와 함께 OdbcConnection 개체를 사용하려고하면 " System.Data.Odbc.OdbcException : ERROR [HY000] [DataDirect] [ODBC 진행 OpenEdge 와이어 프로토콜 드라이버] [OPENEDGE] 또는 SQL 문에서 구문 오류가 발생합니다. 약 = =, 연령 =? "(10713) "

나는 다른 질문과 똑같은 질의 문법을 사용하고있다 :

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 개체를 사용하여이 간단한 쿼리를 수행하는 방법이 있습니까? 아니면 이것이 우리가 사용하고있는 특정 진행 드라이버와 더 관련이 있으며 Dapper 사용을 배제합니까?

편집하다

아래 요청마다 작동하는 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();
    }
}

수락 된 답변

문제가 익명 ( ? ) 매개 변수를 사용하는 경우 다음을 수행하십시오.

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

Dapper는 원래 쿼리에 따라이를 다시 작성하지만 어디에 넣을 매개 변수를 알 수 있습니다.

그러나 문제가 ODBC 공급자가 매개 변수를 지원하지 않는다면 : 나는 그다지 도움을 줄 수 없다. (ADO.NET 코드를 어떻게 작동 시키는지를 보여줄 수 있다면, 아마 어떻게하면 더 쉽게 할 수 있는지 보여줄 수있을 것이다. 대퍼를 통해.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.