我有一个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在虚拟机上开发项目,但在我看来,如果介质是虚拟的,应该对开发没有影响。
我做错了什么或者我错过了什么?
谢谢。
答案 0 :(得分:2)
this.GetOrdinal("MyDateColumn")
返回名称为“MyDateColumn”的列号。
要使用列名获取DateTime
值,您需要执行以下操作:
this.GetDateTime(this.GetOrdinal("MyDateColumn"));
答案 1 :(得分:0)
您确定数据库中确实有日期列吗? 如果没有,您可以尝试再次生成结果集。