使用Entity Framework的Sqlite - 错误:“指定的转换无效”

3

该字段类型为货币类型,如果我在该字段中输入'0'或'1',则会出现以下错误:

System.Reflection.TargetInvocationException:

Exception has been thrown by the target of an invocation. --->
System.InvalidCastException: Specified cast is not valid.

 at System.Data.SQLite.SQLiteDataReader.VerifyType(Int32 i, DbType typ)
 at System.Data.SQLite.SQLiteDataReader.GetBoolean(Int32 i)

 --- End of inner exception stack trace ---

以下内容来自模型设计师:

<Property Name="Amount" Type="decimal" Precision="53" />  

====

    <EdmScalarPropertyAttribute(EntityKeyProperty:=False, IsNullable:=True)>
<DataMemberAttribute()>
Public Property Amount() As Nullable(Of Global.System.Decimal)
    Get
        Return _Amount
    End Get
    Set(ByVal value As Nullable(Of Global.System.Decimal))
        OnAmountChanging(Value)
        ReportPropertyChanging("Amount")
        _Amount = StructuralObject.SetValidValue(value)
        ReportPropertyChanged("Amount")
        OnAmountChanged()
    End Set
End Property

Private _Amount As Nullable(Of Global.System.Decimal)
Private Partial Sub OnAmountChanging(value As Nullable(Of Global.System.Decimal))
End Sub

Private Partial Sub OnAmountChanged()
End Sub

获取错误的代码:

 Dim Query = From c In EnData.Transactions Where c.TranID = 660 ' this tran is the amount 0

        For Each tran In Query 'Error here

        Next

我添加了一些代码,这是你要找的吗? - Ezi
你能展示一下你设置金额的代码吗? - arviman
我还没有设置它。只是通过执行一个简单的查询“Dim Q = (From e in myContext.Transaction)”就出现了错误。 - Ezi
@Ezi展示出现错误的代码部分以及与该部分相关的所有代码。 - Petr Abdulin
你确定sqlite数据库中的“Amount”字段是十进制类型吗?如果你在Amount字段中存储“2”或“42”,你的代码能正常工作吗? - rene
是的,它是一个十进制字段,'2'或'42'也会导致错误。 - Ezi
2个回答

4

我遇到了问题...不是amount字段的问题。另外一列是一个位类型,有时它不喜欢我写的false或true的方式。这就引起了问题。

解决方法是使用1代表true和0代表false,这样总是没问题的。


1
使用EF 6.02和SQLite 1.0.91,这仍然在发生,因此浪费了一天的时间。非常感谢!!! - Aymen

0

我编写Microsoft SQL Server的SQL。如果以下示例对于 SqLite 无效,请告诉我,我将删除此答案。

问题:什么是:StructuralObject.SetValidValue(value)?这是自定义函数吗?如果是,请定义一下。

也许修改您的VB代码以执行以下操作会有所帮助:

Public Property Amount() As System.Decimal
    Get
        Return _Amount
    End Get
    Set(ByVal value As Global.System.Decimal)
        OnAmountChanging(Value)
        ReportPropertyChanging("Amount")
        If value = 0 Then
          _Amount = 0.00M
        Else If value = 1 Then
          _Amount = 1.00M
        Else
          _Amount = StructuralObject.SetValidValue(value)
        End If
        ReportPropertyChanged("Amount")
        OnAmountChanged()
    End Set
End Property

通常,我更喜欢将“最真实”的情况放在顶部,但我的VB技能不是很好。
希望这可以帮到你。

这是自动生成的代码,这里没有空值问题。 - Ezi
@Ezi:更新了代码以测试1和0。也许SQLiteSetValidValue将输入解释为整数布尔值。上面指示的值应该将1和0强制转换为双精度(M代表货币)。 - user153923
谢谢你的帮助,请看一下问题描述中的编辑。我已经找到了问题所在。 - Ezi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接