【问题标题】:Input string was not in a correct format error #2输入字符串的格式不正确错误 #2
【发布时间】:2014-11-19 23:54:20
【问题描述】:

我有以下要求:

   string sqlStr = @"Select a.Text, a.TrackKey, a.NoteType, a.TranKey, a.TranType, 
    Case a.TranType when '1110' then 'https://www.cps/SAM/SO/RMA/RMAView.asp?key=' 
     when '502' then 'https://www.cps/SAM/AR/InvInqDetail.asp?Key=' 
     when '511' then 'https://www.cps/SAM/AR/InvInqDetail.asp?Key=' 
     when '801' then 'https://www.cps/SAM/AR/OrdInqDetail.asp?Key='
     when '1101' then 'https://www.cps/SAM/AP/POInqDetail.asp?key=' 
     when '1111' then 'https://www.cps/SAM/PO/TruckDetail.asp?truckkey=' 
     when '835' then 'https://www.cpsm/SAM/SO/RMA/RMAView.asp?key='  End HREF, 
    Case when a.TranType = '1110' then 'M'
     when a.TranType = '502' then 'W'
     when a.TranType = '511' then 'W' 
     when a.TranType = '1101' then 'B'
     when a.TranType = '1111' then 'B'
     when a.TranType = '835' then '('  
     when (a.TranType = '801' and a.NoteType = '9') then '{'
     when (a.TranType = '801' and a.NoteType = '8') then '(' End dataicon      
    From tamTrackrEngine a 
    Where a.CreateDate > DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()), 0) 
    AND (a.EmpKey = {0} OR a.EmpKey IS NULL)
    AND a.Text IS NOT NULL
    Order by a.CreateDate DESC";

    var trackrinfo = db.Database.SqlQuery<TrackrData>(sqlStr, empKey).ToList();

    var TrackrInfo = JsonConvert.SerializeObject(trackrinfo);

    Response.Write(TrackrInfo);
    HttpContext.Response.AppendHeader("Content-Type", "application/json");
    return new EmptyResult(); 

当我运行这段代码时,我得到了错误:

输入字符串的格式不正确。

我已经输入了一个更简单的 sql 查询,并没有任何问题地返回我的结果,所以我认为这与我的查询中的一些引号有关。

这是我的 StackTrace:

[FormatException: 输入字符串格式不正确。] System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args) +10930058 System.String.Format(IFormatProvider provider, String format, Object [] args) +63 System.Data.Entity.Core.Objects.ObjectContext.CreateStoreCommand(String commandText, Object[] 参数) +790 System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal(String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] 参数) +208 System.Data.Entity.Core.Objects.c__DisplayClass631.&lt;ExecuteStoreQueryReliably&gt;b__62() +45 System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction(Func1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) +333 System.Data.Entity.Core.Objects。 c__DisplayClass631.&lt;ExecuteStoreQueryReliably&gt;b__61() +140 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Func1 operation) +189 System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably(String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] 参数) +335 System.Data .Entity.Core.Objects.ObjectContext.ExecuteStoreQuery(String commandText, ExecutionOptions executionOptions, Object[] 参数) +61 System.Data.Entity.Internal.c__DisplayClass131.&lt;ExecuteSqlQuery&gt;b__12() +151 System.Lazy1.CreateValue() +415 System.Lazy@987654325 @1.get_Value() +75 System.Data.Entity.Internal.LazyEnumerator1.MoveNext() +12 System.Collections.Generic.List1..ctor(IEnumerable1 collection) +381 System.Linq.Enumerable.ToList(IEnumerable1 source) +58 SAM3.Controllers.SharedDataController.Trackr() 在 c:\Users\candicesteele \Source\Repos\SAM3\SAM3\Controllers\SharedDataController.cs:273 lambda_method(Closure , ControllerBase , Object[] ) +62 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器, Object[] 参数) +14 System. Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) +157 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 个参数) +27 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__36(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22 System.Web.Mvc.Async.WrappedAsyncResult@ 987654329@1.End() +49 System.Web.Mvc.Async.AsyncContro llerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 System.Web.Mvc.Async.AsyncInvocationWithFilters.b__3c() +50 System.Web.Mvc.Async.c__DisplayClass45.b__3e() +225 System.Web.Mvc.Async.c__DisplayClass45.b__3e() +225 System.Web.Mvc.Async.c__DisplayClass30.b__2f(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web。 Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 System.Web.Mvc.Async.c__DisplayClass28.b__19() +26 System.Web.Mvc.Async.c__DisplayClass1e.b__1b(IAsyncResult asyncResult) +100 System .Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState ) +13 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +36 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +54 System.Web.Mvc.Controller.EndExecuteCore(IAs yncResult asyncResult)+39 System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult,控制器控制器)+12 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +28 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +54 System.Web.Mvc.Controller。 EndExecute(IAsyncResult asyncResult) +29 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.MvcHandler.b__4(IAsyncResult asyncResult, ProcessRequestState innerState) +21 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +36 System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +54 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest( IAsyncResult 结果) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9657896 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

来源错误:

第 273 行 var trackrinfo = db.Database.SqlQuery(sqlStr, empKey).ToList();第 274 行:第 275 行:

【问题讨论】:

  • 你从哪里得到异常?
  • 这是错误行吗?如果是这样,它是 var trackrinfo = db.Database.SqlQuery(sqlStr, empKey).ToList() 的行
  • empKey 的值是多少?
  • 这是一个数字。一个工作示例是 160。

标签: c# sql-server


【解决方案1】:

内部格式会出现问题。根据该堆栈跟踪,它正在调用StringBuilder.AppendFormat。问题与你在SQL语句中的'{'有关。

这完全可以通过使用StringBuilder 进行测试。

下面爆了

System.FormatException : 输入字符串的格式不正确。

var sb = new StringBuilder();
sb.AppendFormat("'{' {0}", 1);

您可以通过将{ 加倍来解决此问题

var sb = new StringBuilder();
sb.AppendFormat("'{{' {0}", 1);

工作得很好。

{{ 应该只输出一个{。加倍它会逃脱它。

【讨论】:

  • @GrantWinney 是的,作为一个代码块可能会更好,即使颜色可能会出错。编辑:没关系,没有换行符=/
【解决方案2】:

我没有尝试这个的环境,但从阅读documentation 看来,您的想法是正确的:

“您可以在 SQL 查询字符串中包含参数占位符,然后提供参数值作为附加参数。”

但是,您查询中的占位符似乎不正确。

sqlStr 字符串中的{0} 替换为@p0,然后再次运行。

【讨论】:

  • 呵呵,刚链接文件就想发这个了。
  • 我仍然遇到同样的错误。我在控制器的其他查询中使用了 {0} 格式的参数,并且没有遇到任何问题。
  • @user2456259 仔细检查String.Format 没有针对其他查询运行。我没有看到{#} 用于 SQL 和 SQL 对象。这应该有效。您也可以尝试构造一个DbParameter 并将其命名为任意名称而不是@p0msdn.microsoft.com/en-us/library/…
  • 没问题格兰特。据我所知,它们是相同的,并且我使用了一个没有 case 语句的查询,其参数作为 {0} 传递,没有任何问题。
  • 如果我从查询中删除 case 语句,它们运行没有问题。
【解决方案3】:

我不确定这部分:

a.EmpKey = {0}

看起来您可能在某个时候尝试过使用 string.format() 构建此查询。在任何情况下,这对我来说都不是有效的 SQL(int 不会有 {/},如果这些是您要比较的值的一部分,它们应该在 's 中。)

【讨论】:

  • 我在我的 SQL Server Management Studio 中运行代码并且没有收到任何错误,所以我认为它在 C# 中运行时会以某种方式运行。
  • 看起来它适用于 string.Format,因为它位于 EmpKey 上,并且 empKeyvariable 正在使用该字符串传递给方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多