请阅读答案的评论针对的是什么问题,更完整地理解/是
首先,我经历了很多与此相关的其他做题阅读,仍然不能得到这个有一个基本的设置工作。这里是我已经阅读了相关的问题:
Passing query parameters in Dapper using OleDb
编辑:下面的故障排除是有点误导。这是走错了来自GitHub的例子查询语法的唯一的事情是不是有效使用ProgressDB OpenEdge驱动程序。
与这个问题的答案,并在记录的Git的例子给出的示例中的问题是,没有使用真正的ODBC对象,而是一个OleDbConnection
对象。这会导致在那里我想使用小巧精致的场景问题。一些背景和限制,以我的情况:
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对象这个简单的查询?或者这是否真的有更多的事情要做,我们正在使用的具体进展的驱动程序,并且应用这种小巧玲珑排除了?
包括工作按照以下要求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();
小巧玲珑将改写说,按照原来的查询,但会知道把哪些参数哪里。
但是,如果问题是ODBC提供程序不支持参数:我不禁大为与:(如果你能证明如何做到这一点的工作ADO.NET代码,我也许可以告诉你如何做到这一点更容易通过短小精悍。