2015-03-31 48 views
2

請閱讀答案的評論針對的是什麼問題,更完整地理解/爲如何使用Dapper連接到ProgressDB數據提供者?

首先,我經歷了很多與此相關的其他做題閱讀並仍不能得到這個與基本設置一起工作。下面是相關的問題我已經閱讀:

Passing query parameters in Dapper using OleDb

編輯:下面的故障排除是有點誤導。唯一出錯的是使用ProgressDB OpenEdge驅動程序,Github示例中的查詢語法無效。

與這個問題的答案,並在記錄的Git的例子給出的例子的問題是,一個真正的ODBC對象沒有被使用,而是一個OleDbConnection對象。這會導致我嘗試使用Dapper的場景出現問題。一些背景和限制我的方案:

  • 我無法更改數據庫技術,我們正在連接到進度數據庫。連接到DB的連接字符串:connectionString =「PROVIDER = MSDASQL; DRIVER = {Progress OpenEdge 10.2A Driver}; HOST = ...; PORT = ...; DB = mfgsys; UID = .. 。; PWD = ...; DIL = READ UNCOMMITTED「注意Provider:MSDASQL
  • 根據MSDN的說明,https://msdn.microsoft.com/en-us/library/a6cd7c08%28v=vs.110%29.aspx - 」OLE DB的.NET Framework數據提供程序不適用於ODBC的OLE DB提供程序(MSDASQL )。要使用ADO.NET訪問ODBC數據源,請使用.NET Framework數據提供程序的ODBC。
  • 當我嘗試在Dapper中使用OdbcConnection對象時,出現以下錯誤:」System.Data。 Odbc.OdbcException:錯誤[HY000] [DataDirec T] [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(); 

有沒有辦法做到這一點簡單的q使用OdbcConnection對象的uery?或者,這確實與我們使用的特定Progress驅動程序有關,因此不能使用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(); 
    } 
} 
+0

只是要清楚,你現在不使用dapper?「dapperness」在哪裏?謝謝 – JustAspMe 2015-09-21 21:15:08

+0

@JustAspMe,實際上,我使用dapper,上面的例子「編輯「上面的部分與Dapper在Github上的示例代碼中提供的類似,在」Edit「部分下面的所有東西都是純粹的ADO.Net,並且是作爲對Marc請求的響應而提供的,所有這一切的要點是,如果你是使用ProgressDB,你仍然可以使用Dapper,你只是不能在'select'類中指定params使用。例如,'(「select ID from empTable where Id =?foo?」,new {foo = 12})'將在ProgressDB中工作,而'(「select ID =?foo?」,new {foo = 12}) '在ProgressDB上不起作用。清除泥漿? – akousmata 2015-09-22 15:15:26

+0

好的,謝謝澄清。我正在研究使用Dapper w/ODBC到iSeries。我終於「明白了」。僅供參考(不是現在,因爲這篇文章是舊的) - 關於這篇文章的「點」,我不會用我的sql語句發送參數。我只是將parms連接到sql語句中。不知道這是否會對你有所幫助。因此,對於where子句,我會使用「WHERE EmpId ='+ id.toString()。Trim()+'」;您尋求的目的地總是有很多路。 – JustAspMe 2015-09-22 17:35:16

回答

2

如果問題是使用匿名(?)參數,然後:

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

Dapper會根據您的原始查詢重寫,但會知道將哪個參數放在哪裏。但是,如果問題是ODBC提供程序不支持參數:我不能幫助很多:(如果您可以顯示如何在工作 ADO.NET代碼中執行此操作,我可能會顯示你如何做到這一點更容易通過短小精悍

+0

我收到相同的錯誤消息。我認爲這與我使用'OdbcConnection'對象而不是'OleDbConnection'對象有關。我只是克隆了Dapper在本地測試我的理論。 – akousmata 2015-03-31 17:18:35

+0

@akousmata so:忘記短小精悍:你有使用'OdbcConnection'工作的參數化ADO.NET代碼嗎? – 2015-03-31 17:26:32

+0

是的,我正在手工完成所有的ORM映射,這是我試圖避免的。我使用的代碼返回一個OdbcDataReader,然後我讀取結果並用硬編碼映射到我的對象。這將工作,但希望避免這種情況。另外,我可以確認問題出在'{Progress OpenEdge 10.2A Driver}'上,當我切換到使用'{SQL Server}'時,測試通過。很快會發布我的ADO.Net代碼。 – akousmata 2015-03-31 17:40:03

相關問題