c# - 小巧玲珑.NET : problems with struct parameterized queries

标签 c# dapper

我正在尝试使用结构作为 Dapper 中的参数查询。它对我不起作用。但好像it should work .

一个失败的例子:

struct Simple { public int ID; }

[TestMethod]
public void StructParameter()
{
    int result = Db.Query<int>("select [ID] = @ID", new Simple { ID = 123 }).First();
    result.Should().Be(123);
}

一个工作示例:

[TestMethod]
public void AnonymousParameter()
{
    int result = Db.Query<int>("select [ID] = @ID", new { ID = 123 }).First();
    result.Should().Be(123);
}

第一种情况抛出的错误:

System.Data.SqlClient.SqlException: Must declare the scalar variable "@ID".
Result StackTrace:  
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at Dapper.SqlMapper.<QueryImpl>d__11`1.MoveNext() in d:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1553
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in d:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1443
   ...

我使用的是 Dapper 1.38 版。


根据 Dirk 的建议,使用属性而不是归档就可以了:

struct Simple {
    public int ID { get; set; }
}

最佳答案

问题不是使用结构引起的,而是使用字段而不是属性引起的。

如果您将 struct Simple 更改为 class Simple 仍然行不通,因为参数读取器仅创建 IL 代码来读取属性。

ID 字段更改为属性即可解决。

关于c# - 小巧玲珑.NET : problems with struct parameterized queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29140539/

相关文章:

c# - 值不能为空。参数名称 : key (only happens on XAML Designer's design view)

c# - 无需 wddm 1.1 即可运行 Windows 7 模拟器

c# - Net Core Connection String Dapper visual studio 2017

c# - 如何在 Dapper 中使用 Char 和 VarBinary?

c# - 无法使用 ASP.NET Redis SessionState Provider 连接到本地 Redis Sentinel 故障转移系统

c# - 异常调用堆栈被截断而没有任何重新抛出

c# - 将 ToolStripMenuItems 动态添加到 MenuStrip (C#/Winforms)

c# - 通过运算符对 Lambda 表达式进行分组并将它们与 DapperExtensions 的 PredicateGroups 一起使用

c# - 如何使用 Dapper 从 SQL Server 获取 bigint 到 long 对象属性?

orm - 使用 dot net 3.5 的 dapper dot net 的 CRUD