给出一个字符串:“ 5.2m * 5.7m” 返回类型为Decimal; 并致电
Set objconn = New ADODB.Connection
Set objrs = New ADODB.RecordSet
objconn.Open ConnStr
strsql = "DECLARE @Num tinyint " & _
"SELECT @Num=Number from FNOLTracker.HandlerList WHERE Name='Joe Bloggs' " & _
"IF @Num IS NULL " & _
"BEGIN " & _
"SELECT 'Not There' AS Result " & _
"END " & _
"ELSE " & _
"BEGIN " & _
"SELECT 'There' AS Result " & _
"END"
With objrs
.Open strsql, objconn, adOpenStatic, adLockReadOnly, adCmdText
MsgBox .Fields(0)
End With
将给出关于位置上的字符'm'的语法错误; 经过一番测试,同样适用于“ d”; 为了提供一些背景信息,使用m的原因是为了避免另一个错误,即double * decimal的乘法,因为它将默认将浮点值解释为double。
我的问题是:为什么会这样?解决双十进制问题的最佳方案是什么?通过(decimal)5.7强制转换的值我知道是十进制或使用Convert.ToDecimal(5.7)?parse()到底知道多少?(我没有找到有关msdn的文档)
答案 0 :(得分:0)
我的问题是:为什么会这样?
发生这种情况是因为DynamicExpression
使用了自定义的表达式解析器。它类似于C#,但不是C#。并非在C#中有效的所有内容都可以正常工作,并且在C#中有效的某些内容也可以不同地工作。
什么是解决double * decimal问题的最佳方案?通过(decimal)5.7强制转换的值我知道是十进制还是使用Convert.ToDecimal(5.7)?
发布,但不使用此语法。使用的语法是type(expr)
,而不是(type)expr
,请参见下文。
parse()到底知道多少?(我没有找到有关msdn等的文档)
http://ak-dynamic-linq.azurewebsites.net/GettingStarted上提供了原始文档的副本。我尚未验证整个文档是否未修改,但已将以下内容与原始文档进行了比较。
引用:
表达式语言允许使用语法
type(expr)
或type"string"
进行显式转换,其中 type 是类型名称,可以选择后跟?
和 expr 是表达式,或者 string 是字符串文字。此语法可用于执行以下转换:
- 提供的两种
Type.IsAssignableFrom
之间在一个或两个方向上都是正确的。- 提供两种或两种接口类型之间的接口类型。
- 在任何值类型的可为空和不可为空的形式之间。
- 字符串和具有静态TryParse方法的任何类型之间。
- 属于
SByte
,Byte
,Int16
,UInt16
,Int32
,UInt32
,{ {1}},Int64
,UInt64
,Decimal
,Single
,Double
,任何 enum 类型,以及这些类型的 nullable 形式。