远程过程调用 (RPC) 协议流不正确

Posted

技术标签:

【中文标题】远程过程调用 (RPC) 协议流不正确【英文标题】:remote procedure call (RPC) protocol stream is incorrect 【发布时间】:2013-06-02 13:13:29 【问题描述】:

我使用实体框架 5.0。我有很多测试。如果我单独运行测试它通过,如果我与其他人同时运行它,它不会通过。测试之间没有联系。每次发送一个相同的查询。它不会被修改。

**query:**

insert [dbo].[Patient]
       ([AddressId],
        [FirstName],
        [LastName],
        [MiddleName],
        [MuthersName],
        [Sex],
        [BirthDate],
        [TAJNumber],
        [Height],
        [Weight],
        [PhoneMobil],
        [PhoneHome],
        [Email],
        [OtherDisease])
values (13 /* @0 */,
        'Peter' /* @1 */,
        'Peter' /* @2 */,
        'Peter' /* @3 */,
        'Maria' /* @4 */,
        1 /* @5 */,
        '1991-07-04T00:00:00' /* @6 */,
        '5464845' /* @7 */,
        170 /* @8 */,
        66 /* @9 */,
        '00456249864' /* @10 */,
        '00456249864' /* @11 */,
        'alma22@mailmetrash.com' /* @12 */,
        null)



select [Id]
from   [dbo].[Patient]
where  @@ROWCOUNT > 0
       and [Id] = scope_identity()



**WARN:** 
System.Data.SqlClient.SqlException (0x80131904): The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 9 ("@6"): The supplied value is not a valid instance of data type datetime2. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.
   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)
   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.ExecuteReader(CommandBehavior behavior)
   at HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledCommand.ExecuteDbDataReader(CommandBehavior behavior)
ClientConnectionId:c184fe10-8d28-4b0b-96bf-395796cd0e29




**exception:**
Test Name:  VM_PatientRegistration_Insert
    Test FullName:  **Insert
    Test Source:    **line 23
    Test Outcome:   Failed
Test Duration:  0:00:01,0018114

Result Message: 
Test method TandoCare.Desktop.Test.ViewModel.PatientRegistrationViewModelTest.VM_PatientRegistration_Insert threw exception: 
System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 9 ("@6"): The supplied value is not a valid instance of data type datetime2. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.
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)
   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.ExecuteReader(CommandBehavior behavior)
   at HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
 --- End of inner exception stack trace ---
    at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
   at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
 --- End of inner exception stack trace ---
    at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at TandoCare.Infrastructure.Data.UnitOfWork.UnitOfWorkBase`1.Save() in **  at TandoCare.Desktop.Test.ViewModel.PatientRegistrationViewModelTest.VM_PatientRegistration_Insert() in *** :line 55

【问题讨论】:

【参考方案1】:

当我尝试插入具有float 数据类型列的新行时,我遇到了这个问题。当我尝试插入 SQL Server 不支持的 InfinityNaN 值时,引发了与您相同的异常。

如果您使用的是实体框架,建议使用HibernatingRhinos assembly。您可以跟踪生成的查询并检测导致问题的参数。

如果您使用TPT (Table-Per-Type),SQL Profiler 将无法帮助您。

【讨论】:

【参考方案2】:

我使用 select 命令发出 SQLCommand,但出现错误:

传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。 RPC 名称无效。

因为我正在调用命令类型为 CommandType.StoredProcedure 的 SQLCommand。

将其更改为 CommandType.Text 解决了我的问题。

System.Data.SqlClient.SqlCommand result = new SqlCommand(GetSQLSelectCommande());
        if (FromDate == default(DateTime) || isEqualDay(FromDate, DateTime.Now))
        
            FromDate.AddMonths(-1);
        
        ToDate = new DateTime(ToDate.Year, ToDate.Month, ToDate.Day, 23, 59, 59);
        result.Parameters.Clear();
        result.CommandType = CommandType.Text;
        result.Parameters.Add("@IdClient", SqlDbType.Int).Value = this.IdClient;
        result.Parameters.Add("@dateDebut", SqlDbType.DateTime).Value = this.FromDate;
        result.Parameters.Add("@dateFin", SqlDbType.DateTime).Value = this.ToDate;
        result.Parameters.Add("@langue", SqlDbType.Int).Value = (Offix.Culture.GetCulture() == Offix.EnumLangue.ofxFrancais ? 5 : 3);

【讨论】:

【参考方案3】:

我认为问题出在您的参数@6 上。格式好像无效。 你有没有尝试过这样的事情来创建日期? :

new DateTime(1991,07,04).ToShortDateString()

【讨论】:

我也读过。但是如果“参数”错误,为什么我单独运行测试时它会起作用?查询是一样的

以上是关于远程过程调用 (RPC) 协议流不正确的主要内容,如果未能解决你的问题,请参考以下文章

JSON-RPC轻量级远程调用协议介绍及使用

RPC一般指远程过程调用协议

远程过程调用协议(RPC)

从 0 到 1:全面理解 RPC 远程调用

RPC远程过程调用协议

RabbitMQ九:远程过程调用RPC