SqlCeDataReader всегда нулевой - PullRequest
1 голос
/ 05 марта 2012

Эй, ребята, я работаю на Windows Mobile 5.0 (.Net 2.0) и я застрял в маленькой проблеме, где мой читатель всегда нулевой. Моя связь в порядке, и я верю, что все остальное в порядке, единственная проблема с читателем. В моем исключении поймать это говорит

((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;
    }

EDIT Я открываю соединение в Connection.GetConnection (..);

EDIT: 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()

Функция Get Get Connection:

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

EDIT: 3 Код исключения при использовании

SqlCeCommand command = new SqlCeCommand («ВЫБРАТЬ * ИЗ ИЗОБРАЖЕНИЙ, где 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()

Ответы [ 3 ]

2 голосов
/ 05 марта 2012

Вы никогда не наберете следующую строку кода, если 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);
            }
1 голос
/ 07 марта 2012

Проблема закончилась тем, что я использовал System.Data.SqlServerCe 3.5.1.0, когда я переключился на 3.5.0.0, он работал без каких-либо ошибок.И я поместил цикл while вне оператора catch.

Но я все еще раздражен MS, потому что они не показывали никакой ошибки в этом отношении!

0 голосов
/ 06 марта 2012

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;
}

Вы захотите добавить некоторые функциональные возможности для проверки ваших объектов в случае целого числа, допускающего значение Nullable, но по большей части это просто и понятно.

Установите точку останова на Console.WriteLine() и наведите курсор на Message, если возникнет исключение.

...