FormatException - 输入字符串格式不正确

时间:2014-09-18 19:05:21

标签: c# sql string

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

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上是一个新手(充其量),我现在已经打了好几个小时。任何建议将不胜感激。

4 个答案:

答案 0 :(得分:2)

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

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

要解决此问题,您需要确定db列为null时要执行的操作。如果Shape_Group_Id和Shape_Group_Order属性可以为空,那么当然不需要做太多决定,但如果不是,你可能需要重新设计一下。

答案 1 :(得分:1)

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

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

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

这是一个从内存中可能有帮助的片段,它将默认值为空对象,或者DBNull为0。

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

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

答案 2 :(得分:1)

我猜是因为ShapeGroupIDShapeGroupOrder字段允许null值,所以您尝试将null值解析为int,这会导致抛出异常。

更好地使用TryParse:

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

答案 3 :(得分:0)

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

See Here