C# 有时,对于某些数据库(SQL Server 2012和2019)上的简单select查询,数据不会返回正确的结果

C# 有时,对于某些数据库(SQL Server 2012和2019)上的简单select查询,数据不会返回正确的结果,c#,sql-server,.net-core,dapper,system.data,C#,Sql Server,.net Core,Dapper,System.data,我有一个简单的查询,它在托管在上的web api(.net core 3.1)中运行批处理操作 IIS。问题是,对于某些数据库(通常是大小大于10-20GB的数据库),当结果应该为true时,查询返回false。数据库在一个环境中为SQL Server 2012,在另一个环境中为2019。但在这两种情况下,奇怪的行为都会发生。我的ORM在最新版本中非常简洁。查询如下: SELECT CASE Column WHEN 'S' THEN 1 ELSE 0

我有一个简单的查询,它在托管在上的web api(.net core 3.1)中运行批处理操作 IIS。问题是,对于某些数据库(通常是大小大于10-20GB的数据库),当结果应该为true时,查询返回false。数据库在一个环境中为SQL Server 2012,在另一个环境中为2019。但在这两种情况下,奇怪的行为都会发生。我的ORM在最新版本中非常简洁。查询如下:

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
);
在SSMS 2019中运行相同的查询,结果如预期的那样为真,但在生产和开发环境中的应用程序中,某些数据库的结果有时为假。在一次运行中,结果恰好为false,对于批处理中的所有方法调用,结果都为false(对于批处理,您可以理解为在Web Api中对表中数千个寄存器执行操作)

有人能帮我对付这种奇怪的行为吗

在@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\1\_work\113\s\src\Repositorios\Siac\Repository.cs:line 26
   at ProjectNamespace.Service.Business.Method5(Evento evento, Rule regraValida, DateTime dataExecucao) in C:\agents\1\_work\113\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\1\_work\113\s\src\Servicos\Something\Servico\Business.cs:line 100
   at ProjectNamespace.Service.Business.Method3(List`1 listaEventos, DateTime dataExecucao) in C:\agents\1\_work\113\s\src\Servicos\Something\Servico\Business.cs:line 64
   at ProjectNamespace.Service.Business.Method2(Int32 implantacaoId, DateTime dataInicio, DateTime dataExecucao) in C:\agents\1\_work\113\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\1\_work\113\s\src\Servicos\Something\Servico\GerenciadorServico.cs:line 259" "MOTOR" 26
“ERRO”System.ArgumentNullException:值不能为null。(参数“Value”)
在C:\projects\Dapper\Dapper\SqlMapper.cs中的Dapper.SqlMapper.ReadChar(对象值)处:第1878行
在c:\projects\Dapper\Dapper\SqlMapper.cs中的Dapper.SqlMapper.c_uu显示Class198_0.b_u0(IDataReader r):第2914行
在C:\projects\Dapper\Dapper\SqlMapper.cs中的Dapper.SqlMapper.QueryRowImpl[T](IDbConnection cnn,Row-Row,CommandDefinition&command,Type effectiveType)处:第1199行
在C:\projects\Dapper\Dapper\SqlMapper.cs中的Dapper.SqlMapper.QueryFirstOrDefault[T](IDbConnection cnn,String sql,Object param,IDbTransaction transaction,Nullable`1 commandTimeout,Nullable`1 commandType):第763行
在C:\agents\1\\u work\113\s\src\Repositorios\Siac\Repository.cs中的ProjectNamespace.Repository.RunSimpleQuerz(可为null的`1 codigoTraco,Int32 implantacaoId)处:第26行
在C:\agents\1\\u work\113\s\src\Servicos\Something\Servico\Business.cs中的ProjectNamespace.Service.Business.Method5(Evento Evento,Rule regavalida,DateTime dataExecucao)中:第278行
在C:\agents\1\\u work\113\s\src\Servicos\Something\Servico\Business.cs中的ProjectNamespace.Service.Business.Method4(Evento Evento、Rule regraValida、Dto Dto、RegrantelligencNologica regraCorrente、Null`1 codigoTracoCorrente、Int32 anoCorrente、Int32 semanaCorrente、Int32 quatidadeSemanasPeriodo、List`1 List、DateTime dataExecucao)中
在C:\agents\1\\u work\113\s\src\Servicos\Something\Servico\Business.cs中的ProjectNamespace.Service.Business.Method3(列出'1 listaEventos,DateTime DataExecutaO'):第64行
在C:\agents\1\\u work\113\s\src\Servicos\Something\Servico\Business.cs第35行的ProjectNamespace.Service.Business.Method2(Int32 implantacaoId、DateTime dataInicio、DateTime DataExecutao)中
在C:\agents\1\\u work\113\s\src\Servicos\Something\Servico\GerenciadorServico.cs中的ProjectNamespace.Service.Business.Method1(Int32 implantacaoId、DateTime DataIniciioperacao、DateTime dataMemoria、Nullable`1 Avaliacao)中

ADO.NET和Dapper都只是执行提供的查询;他们无法决定会发生什么,因此:我在这里可以看到两种可能性:1)查询是正确的,在一段时间内,结果不是您期望的结果,而是因为数据不是您期望的结果,或者2)您正在从多个线程访问
Context.Connection
(对于同一连接),这可能导致未定义的行为,包括从并发操作中获取混乱的查询结果

尝试增加sql查询超时?。默认值为30秒。您确定在这种情况下确实收到了一行吗?现在,我正在使用一些日志运行应用程序,并希望使用动态类型querysinglefirstordefault来检查是否收到了一行。我将在sql查询超时之前增加后在这里给出反馈,但我们得到相同的结果。谢谢你的回答,事情就是这样。在我的统一工作类的实现和业务层使用它的方式上存在一些错误。谢谢你的回答!
"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\1\_work\113\s\src\Repositorios\Siac\Repository.cs:line 26
   at ProjectNamespace.Service.Business.Method5(Evento evento, Rule regraValida, DateTime dataExecucao) in C:\agents\1\_work\113\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\1\_work\113\s\src\Servicos\Something\Servico\Business.cs:line 100
   at ProjectNamespace.Service.Business.Method3(List`1 listaEventos, DateTime dataExecucao) in C:\agents\1\_work\113\s\src\Servicos\Something\Servico\Business.cs:line 64
   at ProjectNamespace.Service.Business.Method2(Int32 implantacaoId, DateTime dataInicio, DateTime dataExecucao) in C:\agents\1\_work\113\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\1\_work\113\s\src\Servicos\Something\Servico\GerenciadorServico.cs:line 259" "MOTOR" 26