【问题标题】:FormatException - Input string was not in a correct formatFormatException - 输入字符串的格式不正确
【发布时间】:2014-09-18 19:05:21
【问题描述】:

在我的 SQL Server Management Studio 中,我创建的其中一个表 (ACTION_LOCATION_MAP) 具有以下设计:

在我的一个函数中,我正在调用一个存储过程,以检索所有具有匹配 ActionId 的记录,这些记录是我传递给函数的。

存储过程:

CREATE PROCEDURE [dbo].[GetMapCoordinates]
@ActionId NVARCHAR(20)
AS
SET NOCOUNT ON;
BEGIN
    SELECT * FROM ACTION_LOCATION_MAP
    WHERE ActionId = @ActionId
END

函数(C#):

public IEumerable<MapCoordinate> GetActionMapCoordinates(string id)
{
    /* Here a call is made to the stored procedure and the matching records are
       returned. Truncating other parts of the code for brevity. */
    ....
    cm.Parameters.Add(new SqlParameter("@ActionId", SqlDbType.NVarChar, 20) { Value = id });
    SqlDataReader dr = cm.ExecuteReader();
    while (dr.Read())
    {
        var coordinate = new MapCoordinate
        {
            Map_Location_Id    = int.Parse(dr["MapLocationId"].ToString()),
            Action_Id          = dr["ActionId"].ToString(),
            Location_Title     = dr["LocationTitle"].ToString(),
            Location_Latitude  = decimal.Parse(dr["Latitude"].ToString()),
            Location_Longitude = decimal.Parse(dr["Longitude"].ToString()),
            Shape_Group_Id     = int.Parse(dr["ShapeGroupId"].ToString()),
            Shape_Group_Order  = int.Parse(dr["ShapeGroupOrder"].ToString())
        };
        coordinates.Add(coordinate);
    }
    // rest of the code truncated
}

调用该函数时,出现以下错误:

Input string was not in a correct format. System.FormatException

   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at (/* namespace intentionally hidden */).GetActionMapCoordinates(String id)
   at (/* namespace intentionally hidden */).LocationController.MapCoordinatesById(String id)
   at lambda_method(Closure , Object , Object[] )
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
   at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)"}

我的预感是十进制值可能没有被正确转换,但作为 SQL 的新手(充其量),我已经为此苦苦挣扎了好几个小时。任何建议将不胜感激。

【问题讨论】:

  • 简单问题..你用过调试器吗..?它在哪一行抛出错误..
  • 看起来是解析问题。尝试在对 Parse () 的调用中使用与 ddbb 中存储的数字格式相对应的 CultureInfo 参数。否则从查询中删除列,直到找到违规的列;-)
  • 另外,不要在查询中使用 *,这是邪恶的

标签: c# sql string


【解决方案1】:

我认为问题在于您在最后两列之一中有一个空值。在这种情况下,dr["Column"].ToString() 将返回一个无法解析的字符串。

请注意,堆栈跟踪提到 System.Number.ParseInt32,它指向您的最后两列。

要解决这个问题,你需要决定当 db 列为空时要做什么。如果 Shape_Group_Id 和 Shape_Group_Order 属性是可以为空的,那么当然没有什么要决定的,但如果不是,您可能需要重新设计一下。

【讨论】:

  • +1,因为我同意并且我在我的文章中引用了您的答案。
  • @MelvinSmith 但您的代码无法编译 -- dr.IsDBNull 接受一个 int 参数。
  • @phoog - 你成功了。谢谢!
【解决方案2】:

我的猜测是,由于 ShapeGroupIDShapeGroupOrder 字段允许 null 值,您试图将 null 值解析为 int ,这会导致抛出异常。

更好地使用 TryParse:

int x;
if (TryParse(dr["ShapeGroupId"].ToString(),ref x )
{
 Shape_Group_Id =x;
}

【讨论】:

  • phoog 打败了你,但我赞成一个很好的答案。谢谢!
【解决方案3】:

正如您所暗示的,您可能正在尝试使用 Int32.Parse() 解析十进制值,因此请通过调试找出答案。

否则,我也建议不要只转换为String,而是立即转换为Int,因为SQL驱动程序可能已经有对象格式的数字。

http://msdn.microsoft.com/en-us/library/system.convert.toint32(v=vs.110).aspx

这是一个来自内存的 sn-p,它可能会有所帮助,它将默认值为 null 对象或 DBNull 为 0。

Map_Location_Id    = dr["MapLocationId"] != DBNull.Value ?
                           System.Convert.ToInt32(dr["MapLocationId"]) : default(int),

注意:更新,因为 phoog 指出了一个好点,空值处理,添加代码来处理它。

【讨论】:

  • +1 用于提及 DBNull.Value。我为类似的问题苦恼了一段时间,直到我发现来自数据读取器的空值是 DBNull.Value 和 DBNull.Value != null。
【解决方案4】:

您需要添加 CultureInfo.InvariantCulture 作为第二个参数,否则您可以添加 NumberFormatInfo 自定义格式。 var value = Decimal.Parse(number, CultureInfo.InvariantCulture);

See Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多