請閱讀答案的評論針對的是什麼問題,更完整地理解/爲如何使用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();
}
}
只是要清楚,你現在不使用dapper?「dapperness」在哪裏?謝謝 – JustAspMe 2015-09-21 21:15:08
@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
好的,謝謝澄清。我正在研究使用Dapper w/ODBC到iSeries。我終於「明白了」。僅供參考(不是現在,因爲這篇文章是舊的) - 關於這篇文章的「點」,我不會用我的sql語句發送參數。我只是將parms連接到sql語句中。不知道這是否會對你有所幫助。因此,對於where子句,我會使用「WHERE EmpId ='+ id.toString()。Trim()+'」;您尋求的目的地總是有很多路。 – JustAspMe 2015-09-22 17:35:16