2012-03-05 98 views
2

嘿,伙计们我正在使用Windows Mobile 5.0(.Net 2.0) ,并且我陷入了一个小问题,我的阅读器始终为空。我的联系很好,我相信其他一切都很好,唯一的问题是读者。 在我的异常俘获它说SqlCeDataReader始终为空

((System.Data.SqlServerCe.SqlCeException)(e)) : {"The operation completed successfully."} 
InnerException: Could not evaluate expression 

我的数据库文件未损坏我打开它的应用程序之外,一切都看起来很好。 我的代码如下:

public static List<Image> GetAll(BOI caller) 
    { 
     List<Image> images = new List<Image>(); 
     SqlCeConnection c = Connection.GetConnection(caller.ConnectionString); 

     if (c != null) 
     { 
      SqlCeCommand command = new SqlCeCommand("SELECT * FROM Images", c); 

      SqlCeDataReader reader = null; 
      try 
      { 
       reader = command.ExecuteReader(); <<<<< reader is null <<<<<<< 
      } 
      catch (Exception e) 
      { 
       while (reader != null && reader.Read()) 
       { 
        Image temp = new Image((int)reader["imageKey"], 
           (String)reader["filename"], 
           (byte[])reader["image"], 
           (reader["labelKey"] == DBNull.Value ? null : (int?)reader["labelKey"]), 
           (int)reader["priority"]); 
        temp.SetDBName(caller.ConnectionString); 

        images.Add(temp); 
       } 
      } 
     } 

     return images; 
    } 

编辑 我打开我的Connection.GetConnection连接(..);

编辑:2 的e.StackTrace:

at System.Data.SqlServerCe.SqlCeDataReader.ProcessResults(Int32 hr) 
    at System.Data.SqlServerCe.SqlCeDataReader.FillMetaData(SqlCeCommand command) 
    at System.Data.SqlServerCe.SqlCeCommand.InitializeDataReader(SqlCeDataReader reader, Int32 resultType) 
    at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options) 
    at System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.SqlServerCe.SqlCeCommand.ExecuteReader() 
    at Oralys.BOI.DataAccess.ImageMapper.GetAll(BOI caller) 
    at Oralys.BOI.BOI.get_Images() 
    at Oralys.BOI.BOI_Controller.FetchAllImages() 
    at IdeoVoiceMobile.RunProfile.InitBOI() 
    at IdeoVoiceMobile.RunProfile..ctor() 
    at IdeoVoiceMobile.Program.startProfile() 
    at IdeoVoiceMobile.Program.Main() 

获取连接函数:

public static SqlCeConnection GetConnection(string connectionString) 
    { 
     SqlCeConnection conn = null; 
     try 
     { 
      if (connections.Count == 0) 
      { 
       OpenConnection(connectionString); 
      } 
      conn = connections[connectionString]; 
     } 
     catch (System.Exception) 
     { 
     } 
     return conn; 
    } 

编辑:3 异常代码使用时

SqlCeCommand command = new SqlCeCommand("SELECT * FROM Images Where imageKey=6", c);

ExceptionCode: 0xc0000005 
ExceptionAddress: 0x0115438c 
Reading: 0x00000000 
Faulting module: sqlceqp35.dll 
Offset: 0x0001438c 

    at NativeMethods.GetKeyInfo(IntPtr pIUnknown, IntPtr pTx, String pwszBaseTable, IntPtr prgDbKeyInfo, Int32 cDbKeyInfo, IntPtr pError) 
    at SqlCeDataReader.FillMetaData(SqlCeCommand command) 
    at SqlCeCommand.InitializeDataReader(SqlCeDataReader reader, Int32 resultType) 
    at SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options) 
    at SqlCeCommand.ExecuteReader(CommandBehavior behavior) 
    at SqlCeCommand.ExecuteReader() 
    at ImageMapper.GetAll(BOI caller) 
    at BOI.get_Images() 
    at BOI_Controller.FetchAllImages() 
    at RunProfile.InitBOI() 
    at RunProfile..ctor() 
    at Program.startProfile() 
    at Program.Main() 
+2

显示接下来的几行代码会有帮助 – 2012-03-05 16:06:34

+0

我看不到你明确地打开连接?这是在'GetConnection'中吗? – rrrr 2012-03-05 16:08:19

+0

是要编辑我的问题写这个。 – raym0nd 2012-03-05 16:08:47

回答

1

问题结束了,因为我使用System.Data.SqlServerCe 3.5.1.0当我切换到3.5.0.0它工作没有任何错误。 我把while循环放在catch语句之外。

但我仍然从MS恼怒,因为他们没有显示任何错误!

+1

这个解决方案具有**所有的功能,可以将循环移到catch外面,并且可以很少或者与更改sql server compact provider的版本无关。 – 2012-03-07 22:50:47

+0

@JoelCoehoorn没有你的错。我把这个循环移到catch的外面,它仍然给我一个错误。然后我改变了SQL DLL的版本,它工作正常。 – raym0nd 2012-03-08 14:49:17

+0

@ raym0nd:然后你在PC和目标设备上有不匹配的二进制文件。有很多使用3.5.1的使用没有任何问题。你必须根据正确的版本进行编译并将相同的版本部署到目标上,否则你会得到奇怪的行为。 – ctacke 2012-03-08 15:33:01

2

你永远不会打下面的代码行,除非cm.executereader抛出一个异常:

while (reader != null && reader.Read()) 

尝试将下面的代码catch语句

  while (reader != null && reader.Read()) 
      { 
       Image temp = new Image((int)reader["imageKey"], 
          (String)reader["filename"], 
          (byte[])reader["image"], 
          (reader["labelKey"] == DBNull.Value ? null : (int?)reader["labelKey"]), 
          (int)reader["priority"]); 
       temp.SetDBName(caller.ConnectionString); 

       images.Add(temp); 
      } 
+0

我的问题是读者总是空! – raym0nd 2012-03-05 16:11:03

+0

我注意到你没有指定一个命令类型? – Adam 2012-03-05 16:14:54

+0

我必须吗?我不认为我需要指定命令类型。 – raym0nd 2012-03-05 16:17:49

0

Raym0nd之外,我猜猜你是新来的。

看看你提供的这个版本。

public static List<Image> GetAll(BOI caller) { 
    List<Image> images = new List<Image>(); 
    using (SqlCeCommand cmd = new SqlCeCommand("SELECT * FROM Images", Connection.GetConnection(caller.ConnectionString))) { 
    try { 
     cmd.Connection.Open(); 
     using (SqlCeReader reader = cmd.ExecuteReader()) { 
     while (reader.Read()) { 
      object imageKey = reader["imageKey"]; 
      object filename = reader["filename"]; 
      object image = reader["image"]; 
      object labelKey = reader["labelKey"]; 
      object priority = reader["priority"]; 
      Image img = new Image((interface)imageKey, (string)filename, (byte[])image, (int?)labelKey, (int)priority); 
      img.SetDBName(caller.ConnectionString); 
      images.Add(img); 
     } 
     } 
    } catch (SqlCeException err) { 
     Console.WriteLine(err.Message); 
     throw err; 
    } finally { 
     cmd.Connection.Close(); 
    } 
    } 
    return images; 
} 

你要添加一些功能在你的空整数的情况下,以测试你的对象,但大部分是干净和简单。

Console.WriteLine()上划一个断点,如果发生异常,则将鼠标悬停在Message上。

+0

感谢帮助...但问题是因为我使用System.Data.SqlServerCe版本3.5.1.0我使用3.5.0.0,它的工作就像一个魅力。 – raym0nd 2012-03-07 18:42:38