【问题标题】:Casting problem in SubSonic 3SubSonic 3中的投射问题
【发布时间】:2010-02-05 20:16:56
【问题描述】:

当保存具有整数主键的行时,VB 版本会抛出以下异常: '未找到类型'十进制'的公共成员'ChangeTypeTo'。'

这发生在 ActiveRecord.VB 文件第 3406 行:

        Public Sub SetKeyValue(value As Object) Implements IActiveRecord.SetKeyValue
        If value IsNot Nothing AndAlso value IsNot DBNull.Value Then
            Dim settable = value.ChangeTypeTo(Of Integer)()

我可以把最后一行改成:

Dim settable = CInt(value)  'value.ChangeTypeTo(Of Integer)()

这将解决问题,直到我重新编译 .tt 文件。

我的问题是,如何在 ActiveRecord.tt 文件中更改它? tt文件中的代码如下所示:

Dim settable = value.ChangeTypeTo(Of <#=tbl.PK.SysType#>)()

感谢任何帮助。

谢谢

【问题讨论】:

    标签: activerecord subsonic3


    【解决方案1】:

    我也遇到了 VB 模板的各种问题。看来 Subsonic 开发人员的重点是 C#。最后我选择在另一个项目中使用 C# 模板,并从我的 VB 主应用程序中引用它。您尝试进行的更改的问题在于您尝试将通用方法替换为具体方法,这并不是更好。 &lt;#=tbl.PK.SysType#&gt; 引用主键的类型。如果您只有整数主键,您可以将模板编辑为Dim settable = CInt(value)。否则,您需要 GetType 以了解 value 的类型,然后需要 select case 以及到达该方法的每种类型的适当转换。

    【讨论】:

    • 然而,错误代码的测试部分是将整数主键转换为十进制。为什么不向后搜索?
    • 感谢您的意见。你是对的,VB 模板似乎有问题。我按照你的建议做了,我在我的解决方案中添加了一个 C# 类库项目并使用了 C# 模板。我将我的参考(我在一个单独的项目中也有 VB 模板)更改为 C# 项目,现在它可以完美运行了。再次感谢。通用
    【解决方案2】:

    生成的代码是正确的。您试图将十进制值转换为整数,这是没有意义的。在这种情况下,编辑模板不是解决方案,您需要修复应用程序的逻辑。

    【讨论】:

    • 感谢您回答我的问题,但是,我没有使用任何小数。该值是插入后返回的 Id。数据库(SQL 2005)将键定义为 Int,Subsonic activeRecord 的 ID 属性为 Integer,但在 Sub SetKeyValue(您可以在上面的代码中看到的 Sub)中,值是 Decimal。同样,它插入记录,当它返回新的 ID(主键)时,就会发生异常。这是我在代码中所做的: Cust = New BV.bv_Customer copyTextboxesToCust() Cust.Save() 任何提示我可能做错了什么?谢谢gm
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多