Более симпатичный запрос вызывает исключение EndOfStreamException - PullRequest
0 голосов
/ 27 апреля 2020

Для очень конкретного c запроса я получаю исключение конца потока.

Это всегда происходит для одного и того же запроса - и этот запрос можно легко выполнить как запрос SQL, но

, но, используя dapper и его запрос на соединение, он как-то кажется неудачным

Я получаю EndOfStreamException: Attempted to read past the end of the stream.

This exception was originally thrown at this call stack:
    Npgsql.NpgsqlReadBuffer.Ensure.__EnsureLong|0()

Я не уверен, почему я получаю это исключение и где оно идет не так - это только возвращает и выдает ошибку для одного указанного c запроса с указанным набором c параметров.

Я не уверен, что понимаю, вызвана ли эта ошибка фактическим запросом SQL или параметрами, анализируемыми в нем, поскольку мой querySingle выполняется как

    IDictionary<string, object> insertedEntityRegistration = connection.QuerySingle(insertNewRegistrationSql, parameters);

Full stacktrace:

   at Npgsql.NpgsqlReadBuffer.<>c__DisplayClass34_0.<<Ensure>g__EnsureLong|0>d.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Npgsql.NpgsqlConnector.<>c__DisplayClass160_0.<<DoReadMessage>g__ReadMessageLong|0>d.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Npgsql.NpgsqlDataReader.<NextResult>d__44.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Npgsql.NpgsqlDataReader.NextResult()
   at Npgsql.NpgsqlCommand.<ExecuteReaderAsync>d__102.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult()
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior)
   at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at Dapper.SqlMapper.ExecuteReaderWithFlagsFallback(IDbCommand cmd, Boolean wasClosed, CommandBehavior behavior) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1051
   at Dapper.SqlMapper.QueryRowImpl[T](IDbConnection cnn, Row row, CommandDefinition& command, Type effectiveType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1177
   at Dapper.SqlMapper.QuerySingle[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 781
   at Dapper.SqlMapper.QuerySingle(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 687

Я полностью потерян из-за того, что здесь идет не так - поскольку запрос может выполняться без dapper без каких-либо проблем, я не понимаю, почему это происходит при выполнении с dapper.

все параметры есть - все они имеют значения, сопоставляются с правыми.

Есть ли возможность отладить сгенерированный запрос? Что может вызвать эту проблему?

Сам запрос похож на

INSERT INTO table (a,b,c,d,e,f,g,h)
                    VALUES (1, tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'), 'Application', tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'),
                'name','mail',4511,4511)
                    RETURNING a,b,c,d,e,f,g,h;

1 Ответ

0 голосов
/ 27 апреля 2020

Для INSERT операторов необходимо использовать Dapper Execute , а не QuerySingle().

Например, в вашем случае:

var insertSqlStatement = "your INSERT query here";
var affectedRows = connection.Execute(insertSqlStatement,  new {ParameterName = "ParemeterValue"});
...