C# &引用;指定的OData查询具有无效的实文本“0”;
我正在使用Xamarin.Android和Azure移动应用后端开发一个应用程序。我最近注意到,在某些设备上,函数会导致未处理的异常 这是导致错误的函数。我正在根据设备的位置从本地数据库查询地图标记,该位置作为参数给出C# &引用;指定的OData查询具有无效的实文本“0”;,c#,android,xamarin.android,odata,azure-mobile-services,C#,Android,Xamarin.android,Odata,Azure Mobile Services,我正在使用Xamarin.Android和Azure移动应用后端开发一个应用程序。我最近注意到,在某些设备上,函数会导致未处理的异常 这是导致错误的函数。我正在根据设备的位置从本地数据库查询地图标记,该位置作为参数给出 public static async Task<List<Marker>> GetMarkersAroundPosition(LatLng position) { if (position == null) throw new N
public static async Task<List<Marker>> GetMarkersAroundPosition(LatLng position)
{
if (position == null)
throw new NullPointerException(Resources.System.GetString(Resource.String.dbErrorPositionNullOrEmpty));
//Calculate the latitude at the current longitude
double lonInKm = CalcLat(position.Longitude);
//Fetch the markers from DB
return await Client.GetSyncTable<Marker>().Where(Marker => Marker.Lat < position.Latitude + Constants.LatInKm
&& Marker.Lat > position.Latitude - Constants.LatInKm
&& Marker.Lon < position.Longitude + lonInKm
&& Marker.Lon > position.Longitude - lonInKm).ToListAsync();
}
我已经上传了完整的stacktrace
这只在某些设备上发生。以下是我测试应用程序的物理设备列表:
Works:
Lenovo Tab 4 8 LTE (TB-8504X), 7.1.1
Alcatel Idol 4 (TLC 6055K) 6.0.1
Motorola Moto G5S Plus (XT1805), 7.1.1
Motorola Moto G5 (XT1676), 7.0
Samsung Samsung Galaxy Tab A 9.7 (SM-T550), 7.1.1
Samsung Galaxy Tab 3 10.1 (GT-P5220), 7.1.2 (LineageOS 14.1)
Sony Xperia XZ1 (G8441), 8.0.0
Doesn't:
Motorola Moto X Play (XT1652), 7.1.1
Nokia 6 TA1021, 8.1.0
Samsung Galaxy Note8 (SM-N950F), 8.0.0
Motorola Moto G5 Plus (XT1685), 7.0
OnePlus 3T (A3003) 8.0.0
我真的很迷恋这一点,因为似乎没有一个明确的原因说明为什么该应用程序在某些设备上运行良好,而在其他设备上崩溃
编辑:
这似乎是一个地区问题。我创建了一个小测试应用程序,用于测试论坛上建议的Double.TryParse函数,还使用不同的语言测试了正在开发的应用程序。所有测试结果都表明,如果设备语言设置为芬兰语,应用程序将崩溃,而当语言设置为英语时,应用程序工作完全正常
Microsoft.WindowsAzure.MobileServices.MobileServiceODataException:指定的odata查询具有无效的实文本“60.9852519308129”
根据堆栈跟踪,我找到了引发异常的代码行。您可以按照以下方式检查ParseRealLiteral
方法:
private QueryNode ParseRealLiteral()
{
this.ValidateToken(QueryTokenKind.RealLiteral,()=>“预期的实际文字”);
string text=this.lexer.Token.text;
char last=char.ToUpper(text[text.Length-1]);
如果(last='F'| | last=='M'| | last=='D')
{
//所以终止F/F,M/M,D/D没有效果。
text=text.Substring(0,text.Length-1);
}
对象值=空;
开关(最后一个)
{
案例“M”:
十进制mVal;
if(十进制色(文本,输出mVal))
{
数值=mVal;
}
打破
案例“F”:
浮动fVal;
if(单色色色(文本,输出fVal))
{
值=fVal;
}
打破
案例“D”:
违约:
双dVal;
if(双色锥虫(文本,输出dVal))
{
数值=dVal;
}
打破
}
如果(值==null)
{
this.ParseError(“指定的odata查询具有无效的实文本“{0}”。.FormatInvariant(text)、this.lexer.Token.Position);
}
this.lexer.NextToken();
返回新的ConstantNode(值);
}
根据我的理解,您的输入60.9852519308129(m | f | d)
应根据您的具体详细错误消息按预期工作
07-04 11:01:05.653 I/MonoDroid(29937):位于Microsoft.WindowsAzure.MobileServices.Query.MobileServiceTableQuery`1+
ToListSyncd_u33[T]。MoveNext():0发生未处理的异常
似乎where
子句抛出了异常。我假设它是由特定的存储数据或查询语句引起的,请尝试使用相同的本地SQLite db检查每个设备的此问题。此外,您可以尝试找出它是否可以帮助您诊断此问题
Works:
Lenovo Tab 4 8 LTE (TB-8504X), 7.1.1
Alcatel Idol 4 (TLC 6055K) 6.0.1
Motorola Moto G5S Plus (XT1805), 7.1.1
Motorola Moto G5 (XT1676), 7.0
Samsung Samsung Galaxy Tab A 9.7 (SM-T550), 7.1.1
Samsung Galaxy Tab 3 10.1 (GT-P5220), 7.1.2 (LineageOS 14.1)
Sony Xperia XZ1 (G8441), 8.0.0
Doesn't:
Motorola Moto X Play (XT1652), 7.1.1
Nokia 6 TA1021, 8.1.0
Samsung Galaxy Note8 (SM-N950F), 8.0.0
Motorola Moto G5 Plus (XT1685), 7.0
OnePlus 3T (A3003) 8.0.0