如何使用 Dapper 连接到 ProgressDB 数据提供程序?
How can you connect to a ProgressDB data provider with Dapper?
请阅读答案的评论以更全面地了解问题所在is/was
首先,我通读了许多与此相关的其他 SO 问题,但仍然无法通过基本设置使用它。这是我已经阅读过的相关问题:
Passing query parameters in Dapper using OleDb
编辑:下面的故障排除有些误导。唯一出错的地方是 Github 示例中的查询语法在使用 ProgressDB OpenEdge 驱动程序时无效。
该问题的答案和记录的 Git 示例中给出的示例的问题是没有使用真正的 ODBC 对象,而是 OleDbConnection
对象.这会导致我尝试使用 Dapper 的场景出现问题。我的场景的一些背景和限制:
- 我无法更改数据库技术,我们正在连接到 Progress 数据库。连接数据库的连接字符串:connectionString="PROVIDER=MSDASQL;DRIVER={Progress OpenEdge 10.2A Driver};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 数据提供程序不能与 ODBC 的 OLE DB 提供程序 (MSDASQL) 一起使用。要使用 ADO.NET 访问 ODBC 数据源,使用 .NET Framework Data Provider for ODBC。"
- 当我尝试将
OdbcConnection
对象与 Dapper 一起使用时,出现以下错误:“System.Data.Odbc.OdbcException:错误 [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]SQL 语句中的语法错误或关于“= ?, Age = ?” (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 对象来完成这个简单的查询?还是这真的与我们正在使用的特定 Progress 驱动程序有更多关系,因此无法使用 Dapper?
编辑
包括下面每个请求的工作 ADO.Net 代码,Build.FromReader<EmployeeDataModel>(reader)
只是循环遍历 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 提供程序不支持参数:我对此无能为力:( 如果您可以在 working 中展示如何操作ADO.NET 代码,我可能会告诉你如何通过 dapper 更轻松地完成它。
请阅读答案的评论以更全面地了解问题所在is/was
首先,我通读了许多与此相关的其他 SO 问题,但仍然无法通过基本设置使用它。这是我已经阅读过的相关问题:
Passing query parameters in Dapper using OleDb
编辑:下面的故障排除有些误导。唯一出错的地方是 Github 示例中的查询语法在使用 ProgressDB OpenEdge 驱动程序时无效。
该问题的答案和记录的 Git 示例中给出的示例的问题是没有使用真正的 ODBC 对象,而是 OleDbConnection
对象.这会导致我尝试使用 Dapper 的场景出现问题。我的场景的一些背景和限制:
- 我无法更改数据库技术,我们正在连接到 Progress 数据库。连接数据库的连接字符串:connectionString="PROVIDER=MSDASQL;DRIVER={Progress OpenEdge 10.2A Driver};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 数据提供程序不能与 ODBC 的 OLE DB 提供程序 (MSDASQL) 一起使用。要使用 ADO.NET 访问 ODBC 数据源,使用 .NET Framework Data Provider for ODBC。"
- 当我尝试将
OdbcConnection
对象与 Dapper 一起使用时,出现以下错误:“System.Data.Odbc.OdbcException:错误 [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]SQL 语句中的语法错误或关于“= ?, Age = ?” (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 对象来完成这个简单的查询?还是这真的与我们正在使用的特定 Progress 驱动程序有更多关系,因此无法使用 Dapper?
编辑
包括下面每个请求的工作 ADO.Net 代码,Build.FromReader<EmployeeDataModel>(reader)
只是循环遍历 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 提供程序不支持参数:我对此无能为力:( 如果您可以在 working 中展示如何操作ADO.NET 代码,我可能会告诉你如何通过 dapper 更轻松地完成它。