此查询产生错误No value given for one or more required parameters
:
using (var conn = new OleDbConnection("Provider=..."))
{
conn.Open();
var result = conn.Query(
"select code, name from mytable where id = ? order by name",
new { id = 1 });
}
如果我将查询字符串更改为: ... where id = @id ...
,我将收到一个错误: Must declare the scalar variable "@id".
如何构造查询字符串以及如何传递参数?
以下应该工作:
var result = conn.Query(
"select code, name from mytable where id = ?id? order by name",
new { id = 1 });
在当前构建中,答案是“否”,原因有两个:
@id
, :id
或?id
的内容好消息是这两个都是可以解决的
将这些更改发布到我的本地克隆,现在传递以下内容:
// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()
{
using (var conn = new System.Data.OleDb.OleDbConnection(
Program.OleDbConnectionString))
{
var row = conn.Query("select Id = ?, Age = ?", new DynamicParameters(
new { foo = 12, bar = 23 } // these names DO NOT MATTER!!!
) { RemoveUnused = false } ).Single();
int age = row.Age;
int id = row.Id;
age.IsEqualTo(23);
id.IsEqualTo(12);
}
}
请注意,我目前正在使用DynamicParameters
来避免向Query
/ Query<T>
添加更多重载 - 因为这需要添加到相当多的方法中。将其添加到DynamicParameters
可以在一个地方解决它。
在我推动之前,我愿意接受反馈 - 这看起来对您有用吗?
编辑:添加一个时髦的smellsLikeOleDb
(不,不是一个笑话),我们现在可以更直接地做到这一点:
// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()
{
using (var conn = new System.Data.OleDb.OleDbConnection(
Program.OleDbConnectionString))
{
var row = conn.Query("select Id = ?, Age = ?",
new { foo = 12, bar = 23 } // these names DO NOT MATTER!!!
).Single();
int age = row.Age;
int id = row.Id;
age.IsEqualTo(23);
id.IsEqualTo(12);
}
}