SqlCeResultSet问题

时间:2009-12-10 08:46:06

标签: ado.net compact-framework c#-2.0 sql-server-ce

我有一个SmartDevice项目(。NetCF 2.0 ),配置为在美国Windows Mobile 5.0 Pocket PC R2仿真器上进行测试。我的项目使用 SqlCe 3.0 。了解SmartDevice项目对设备的内存“更加谨慎”我正在使用 SqlCeResultSets 。结果集是强类型的,由Visual Studio 2008使用自定义工具 MSResultSetGenerator 自动生成。

我遇到的问题是结果集无法识别任何列名。字段的自动生成代码不起作用。在我正在使用的客户端代码中

    InfoResultSet rs = new InfoResultSet();
    rs.Open();
    rs.ReadFirst();
    string myFormattedDate = rs.MyDateColumn.ToString("dd/MM/yyyy");

当模拟器上的执行到达rs.MyDateColumn时,应用程序将抛出 System.IndexOutOfRangeException

调查堆栈跟踪

    at System.Data.SqlServerCe.FieldNameLookup.GetOrdinal()
    at System.Data.SqlServerCe.SqlCeDataReader.GetOrdinal()

我测试了 GetOrdinal 方法(在我的自动生成的类中继承了 SqlCeResultSet ):

    this.GetOrdinal("MyDateColumn"); // throws an exception
    this.GetName(1); // returns "MyDateColumn"
    this.GetOrdinal(this.GetName(1)); //throws an exception  :) 

[编辑添加]

该表存在且填充了数据。 使用类型化的DataSet就像魅力一样。 重新生成SqlCeResultSet并不能解决问题,问题仍然存在。

问题基本上是我无法通过它的名称访问列。 可以使用列序号通过

this.GetDateTime(1)
访问数据。 应用程序无法执行
this.GetOrdinal("MyDateColumn")

此外,我已将Visual Studio 2008更新为Service Pack 1。 另外我正在使用Windows XP SP 2在虚拟机上开发项目,但在我看来,如果介质是虚拟的,应该对开发没有影响。

我做错了什么或者我错过了什么?

谢谢。

2 个答案:

答案 0 :(得分:2)

this.GetOrdinal("MyDateColumn")返回名称为“MyDateColumn”的列号。

要使用列名获取DateTime值,您需要执行以下操作:

this.GetDateTime(this.GetOrdinal("MyDateColumn"));

答案 1 :(得分:0)

您确定数据库中确实有日期列吗? 如果没有,您可以尝试再次生成结果集。