SqlException:将******值'******'转换为数据类型******

时间:2018-10-28 08:53:41

标签: sql-server azure-sql-database azure-web-sites

我有一个使用EF 6针对Azure SQL数据库在Azure中运行的ASP.NET MVC Web应用程序。

昨天我在打开一个使用存储过程获取一些数据的页面时发现了一个错误:

  

System.Data.SqlClient.SqlException(0x80131904):
  将******值'******'转换为数据类型******

时转换失败

在错误消息中是星号,而不是我自己输入的。

该错误发生在单行的控制器操作中:

return JsonConvert.SerializeObject(Uow.StoredProcedures.GetClientLiasonDetails(highlightOnIfi, hasMedicalIssues, medicalSummaryStatusIds, duplicate, azContactUserId).ToList());

我本来希望调用GetClientLiasonDetails,但是由于某种原因,Elmah中的堆栈跟踪(见下文)没有显示出来。假设它进入GetClientLiasonDetails,存储过程将被触发如下:

return DbContext.Database.SqlQuery<ClientLiasonDetailsResult>("dbo.GetClientLiasonDetails @HighlightOnIfi, @HasMedicalIssues, @MedicalSummaryStatusId, @Duplicate, @AzContactUserID", highlightOnIfiParam, hasMedicalIssuesParam, medicalSummaryStatusIdsParam, duplicateParam, azContactUserIdParam);

每次打开页面时都会发生该错误,但是到目前为止,即使以网站用户身份登录,我也无法将其复制到dev数据库中,也无法通过在生产数据库中调用存储过程来进行复制。

数据库已启用透明数据加密,但没有列加密或数据屏蔽。

我尝试查找DMV,尽管我可以看到插入ELMAH错误的SQL,但没有导致该错误的SQL迹象。

系统似乎没有任何其他问题-对存储过程的其他调用都工作正常。


更新1

引起问题的存储过程(GetClientLiasonDetails)使用SQL Server函数(GetClientLiasonFullData)来获取其数据。几年前,当我编写该函数时,它使用string_split,它在我的本地SQL Server中工作,并且在Azure SQL中工作,但在caused an error时是在导出Azure SQL数据库时使用的。

为了解决导出问题,我编写了自己的string_split版本(称为AzStringSplit的函数)。

今天的问题似乎出在AzStringSplit中,因为我刚切换GetClientLiasonFullData来使用内置的string_split而不是AzStringSplit,问题就消失了。


更新2

我正准备发布AzStringSplit的代码,以便有人可以解释它是如何引起问题的,但是随后我很想知道是不是GetClientLiasonFullData的重新编译才解决了该问题,而是而不是对string_split的更改。。。我将功能切换回使用AzStringSplit,它仍然可以正常工作。

因此,通过重新编译函数GetClientLiasonFullData解决了该问题。上面的代码在下面,以防万一有人可以解释它的工作原理,然后导致错误,然后又可以工作。

CREATE FUNCTION [dbo].[GetClientLiasonFullData](
    @HighlightOnIfi VARCHAR(MAX),
    @HasMedicalIssues VARCHAR(MAX),
    @MedicalSummaryStatusId VARCHAR(MAX),
    @Duplicate VARCHAR(MAX),
    @AzContactUserID NVARCHAR(128)
)
RETURNS TABLE
AS
    RETURN

    SELECT      gcld.ClientId,
                gcld.Client,
                anu.FirstName AS AzContactUserFirstName,
                anu.LastName AS AzContactUserLastName,
                gcld.ProgrammeId,
                gcld.Programme,
                gcld.ProgrammeOrder,
                gcld.ParticipantId,
                gcld.ParticipantFirstName,
                gcld.ParticipantLastName,
                gcld.HighlightOnIfi,
                g.Description AS Gender,
                gcld.HasMedicalIssues,
                gcld.MedicalSummaryStatusId,
                mss.Description AS MedicalSummaryStatus,
                CASE WHEN mss.DisplaySortOrder = 1 THEN 1 WHEN Duplicate = 1 THEN 2 ELSE mss.DisplaySortOrder + 1 END AS StatusOrder,
                gcld.HasNotes,
                Duplicate,
                Withdrawn

    FROM        dbo.GetClientLiasonData() gcld

    INNER JOIN  dbo.Gender g
    ON          g.GenderId = gcld.GenderId

    INNER JOIN  dbo.MedicalSummaryStatus mss
    ON          mss.MedicalSummaryStatusId = gcld.MedicalSummaryStatusId

    INNER JOIN  dbo.AspNetUsers anu
    ON          anu.Id = gcld.AzContactUserId

    INNER JOIN  AzStringSplit(@HighlightOnIfi, ',') hoi
    ON          gcld.HighlightOnIfi = hoi.value

    INNER JOIN  AzStringSplit(@HasMedicalIssues, ',') hmi
    ON          gcld.HasMedicalIssues = hmi.value

    INNER JOIN  AzStringSplit(@MedicalSummaryStatusId, ',') mssi
    ON          gcld.MedicalSummaryStatusId = mssi.value

    INNER JOIN  AzStringSplit(@Duplicate, ',') d
    ON          gcld.Duplicate = d.value

    WHERE       (@AzContactUserID IS NULL
    OR          gcld.AzContactUserId = @AzContactUserID);

来自Elmah的堆栈跟踪

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the ****** value '******' to data type ******.
   at System.Data.SqlClient.SqlConnection.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.TryHasMoreRows(Boolean& moreRows)
   at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
   at System.Data.SqlClient.SqlDataReader.Read()
   at System.Data.Entity.Core.Objects.Internal.ShapelessBufferedDataRecord.Initialize(String providerManifestToken, DbProviderServices providerSerivces, DbDataReader reader)
   at System.Data.Entity.Core.Objects.Internal.BufferedDataReader.Initialize(String providerManifestToken, DbProviderServices providerServices, Type[] columnTypes, Boolean[] nullableColumns)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass69`1.<ExecuteStoreQueryReliably>b__68()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass69`1.<ExecuteStoreQueryReliably>b__67()
   at System.Data.Entity.Infrastructure.DbExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery[TElement](String commandText, ExecutionOptions executionOptions, Object[] parameters)
   at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Az.Ems.Web.Controllers.ParticipantsController.OverviewResults(Boolean[] highlightOnIfi, Boolean[] hasMedicalIssues, Int32[] medicalSummaryStatusIds, Boolean[] duplicate, String azContactUserId) in C:\Users\Jon\Source\Repos\EMS\Az.Ems.Web\Controllers\ParticipantsController.cs:line 510
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.<BeginInvokeAction>b__1c()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult)

0 个答案:

没有答案