在我的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上是一个新手(充其量),我现在已经打了好几个小时。任何建议将不胜感激。
答案 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)
我猜是因为ShapeGroupID
和ShapeGroupOrder
字段允许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);