有时 Dapper 或 System.Data 不是 return 对某些数据库的简单 select 查询的正确结果(SQL Server 2012 和 2019)
Sometimes Dapper or System.Data not return correct result for simple select query on some databases (SQL Server 2012 and 2019)
我有一个简单的查询,它是 运行 网络中的批处理操作 api (.net core 3.1) 托管于
IIS。问题是对于某些数据库(通常是大小大于 10-20GB 的数据库),查询 returns false 而结果应该为 true。数据库是 SQL Server 2012 在一个 everonment 和 2019 在另一个。但是在这两种情况下都会发生奇怪的行为。我的 ORM 是最新版本的 Dapper。查询是这个:
SELECT
CASE Column
WHEN 'S' THEN 1
ELSE 0
END AS Result
FROM
Table
WHERE
Id = @Id
该列的类型为 CHAR(1)。在 C# 中,我们有以下代码:
bool result= Context.Connection.QueryFirstOrDefault<bool>(
sql: QUERY,
param: new { Id = id },
transaction: Context.Transaction
);
我已经检查了一些简单的事情,例如连接字符串以及是否存在具有 Id 参数值的寄存器。
运行 SQL 两个数据库中的 Profiler 我能够捕获 dapper 为数据库发送的查询:
exec sp_executesql N'
SELECT
CASE Column
WHEN ''S'' THEN 1
ELSE 0
END AS Result
FROM
Table
WHERE
Id = @Id',N'@Id int',@Id=103051026
运行 相同的查询在 SSMS 2019 中的结果符合预期,但在生产和开发环境中的应用程序中,某些数据库的结果有时是错误的。当在单个 运行 中结果恰好为 false 时,对于批处理内部方法的所有调用都将为 false (对于这里的批处理,您可以理解为在 Web Api 中执行操作Table).
中有数千个寄存器
有人可以帮我解决这种奇怪的行为吗?
在@Charliface 发表评论后,我收到了异常:
"ERRO" "System.ArgumentNullException: Value cannot be null. (Parameter 'value')
at Dapper.SqlMapper.ReadChar(Object value) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1878
at Dapper.SqlMapper.<>c__DisplayClass198_0.<GetStructDeserializer>b__0(IDataReader r) in C:\projects\dapper\Dapper\SqlMapper.cs:line 2914
at Dapper.SqlMapper.QueryRowImpl[T](IDbConnection cnn, Row row, CommandDefinition& command, Type effectiveType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1199
at Dapper.SqlMapper.QueryFirstOrDefault[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 763
at ProjectNamespace.Repository.RunSimpleQuerz(Nullable`1 codigoTraco, Int32 implantacaoId) in C:\agents\_work3\s\src\Repositorios\Siac\Repository.cs:line 26
at ProjectNamespace.Service.Business.Method5(Evento evento, Rule regraValida, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 278
at ProjectNamespace.Service.Business.Method4(Evento evento, Rule regraValida, Dto dto, RegraInteligenciaTecnologica regraCorrente, Nullable`1 codigoTracoCorrente, Int32 anoCorrente, Int32 semanaCorrente, Int32 quatidadeSemanasPeriodo, List`1 list, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 100
at ProjectNamespace.Service.Business.Method3(List`1 listaEventos, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 64
at ProjectNamespace.Service.Business.Method2(Int32 implantacaoId, DateTime dataInicio, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 35
at ProjectNamespace.Service.Business.Method1(Int32 implantacaoId, DateTime dataInicioOperacao, DateTime dataMemoria, Nullable`1 Avaliacao) in C:\agents\_work3\s\src\Servicos\Something\Servico\GerenciadorServico.cs:line 259" "MOTOR" 26
ADO.NET 和 Dapper 都只是按照提供的方式执行查询;他们无法决定会发生什么,所以:我可以在这里看到两种可能性:1) 查询是正确的,并且对于一段时间,结果不是你想要的预期会是这样,但是因为 数据 不是您预期的那样,或者 2) 您正在从多个线程访问 Context.Connection
(对于同一连接),这可能导致未定义的行为,包括从并发操作中获取混乱的查询结果
我有一个简单的查询,它是 运行 网络中的批处理操作 api (.net core 3.1) 托管于 IIS。问题是对于某些数据库(通常是大小大于 10-20GB 的数据库),查询 returns false 而结果应该为 true。数据库是 SQL Server 2012 在一个 everonment 和 2019 在另一个。但是在这两种情况下都会发生奇怪的行为。我的 ORM 是最新版本的 Dapper。查询是这个:
SELECT
CASE Column
WHEN 'S' THEN 1
ELSE 0
END AS Result
FROM
Table
WHERE
Id = @Id
该列的类型为 CHAR(1)。在 C# 中,我们有以下代码:
bool result= Context.Connection.QueryFirstOrDefault<bool>(
sql: QUERY,
param: new { Id = id },
transaction: Context.Transaction
);
我已经检查了一些简单的事情,例如连接字符串以及是否存在具有 Id 参数值的寄存器。
运行 SQL 两个数据库中的 Profiler 我能够捕获 dapper 为数据库发送的查询:
exec sp_executesql N'
SELECT
CASE Column
WHEN ''S'' THEN 1
ELSE 0
END AS Result
FROM
Table
WHERE
Id = @Id',N'@Id int',@Id=103051026
运行 相同的查询在 SSMS 2019 中的结果符合预期,但在生产和开发环境中的应用程序中,某些数据库的结果有时是错误的。当在单个 运行 中结果恰好为 false 时,对于批处理内部方法的所有调用都将为 false (对于这里的批处理,您可以理解为在 Web Api 中执行操作Table).
中有数千个寄存器有人可以帮我解决这种奇怪的行为吗?
在@Charliface 发表评论后,我收到了异常:
"ERRO" "System.ArgumentNullException: Value cannot be null. (Parameter 'value')
at Dapper.SqlMapper.ReadChar(Object value) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1878
at Dapper.SqlMapper.<>c__DisplayClass198_0.<GetStructDeserializer>b__0(IDataReader r) in C:\projects\dapper\Dapper\SqlMapper.cs:line 2914
at Dapper.SqlMapper.QueryRowImpl[T](IDbConnection cnn, Row row, CommandDefinition& command, Type effectiveType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1199
at Dapper.SqlMapper.QueryFirstOrDefault[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 763
at ProjectNamespace.Repository.RunSimpleQuerz(Nullable`1 codigoTraco, Int32 implantacaoId) in C:\agents\_work3\s\src\Repositorios\Siac\Repository.cs:line 26
at ProjectNamespace.Service.Business.Method5(Evento evento, Rule regraValida, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 278
at ProjectNamespace.Service.Business.Method4(Evento evento, Rule regraValida, Dto dto, RegraInteligenciaTecnologica regraCorrente, Nullable`1 codigoTracoCorrente, Int32 anoCorrente, Int32 semanaCorrente, Int32 quatidadeSemanasPeriodo, List`1 list, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 100
at ProjectNamespace.Service.Business.Method3(List`1 listaEventos, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 64
at ProjectNamespace.Service.Business.Method2(Int32 implantacaoId, DateTime dataInicio, DateTime dataExecucao) in C:\agents\_work3\s\src\Servicos\Something\Servico\Business.cs:line 35
at ProjectNamespace.Service.Business.Method1(Int32 implantacaoId, DateTime dataInicioOperacao, DateTime dataMemoria, Nullable`1 Avaliacao) in C:\agents\_work3\s\src\Servicos\Something\Servico\GerenciadorServico.cs:line 259" "MOTOR" 26
ADO.NET 和 Dapper 都只是按照提供的方式执行查询;他们无法决定会发生什么,所以:我可以在这里看到两种可能性:1) 查询是正确的,并且对于一段时间,结果不是你想要的预期会是这样,但是因为 数据 不是您预期的那样,或者 2) 您正在从多个线程访问 Context.Connection
(对于同一连接),这可能导致未定义的行为,包括从并发操作中获取混乱的查询结果