2012-03-05 4 views
2

안녕하세요, 저는 Windows Mobile 5.0 (.Net 2.0) 에서 일하고 있으며, 독자가 항상 null 인 작은 문제에 갇혀 있습니다. 내 연결은 괜찮아요. 그리고 다른 모든 것들이 괜찮다고 믿습니다. 유일한 문제는 독자입니다. 내 예외 캐치에서 그것은SqlCeDataReader는 항상 null입니다.

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

내 데이터베이스 파일 I 응용 프로그램 외부로 열 손상되지 모든 것이 잘 보이는 말한다. 내 코드는 다음과 같다 :

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

cm.executereader 예외가 발생하지 않는 한
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

다음 몇 줄의 코드를 표시하면 도움이 될 것입니다. –

+0

명시 적으로 연결을 볼 수 없습니까? GetConnection에 있나요? – rrrr

+0

그래, 내 질문을 편집하려고 했어. – raym0nd

답변

1

내가 3.5.0.0으로 전환했을 때 System.Data.SqlServerCe 3.5.1.0을 사용했기 때문에 문제가 발생했습니다. 오류없이 작동했습니다. 그리고 catch 문 외부에 while 루프를 넣습니다.

그러나 나는 그것에 대해 어떤 오류라도 보여주지 않았기 때문에 나는 여전히 MS로부터 짜증이났다!

+1

이 솔루션에는 catch를 사용하지 않고 루프를 이동하는 것과 관련된 ** 모든 작업 **이 있으며 SQL Server Compact 공급자의 버전을 변경하는 것과 관련이 거의 없습니다. –

+0

@JoelCoehoorn 잘못하지 마라. 나는 그 고리를 잡기 바깥쪽으로 옮겼고, 여전히 나에게 오류를 주었다. 그럼 SQL 델의 버전을 변경하고 잘 작동했습니다. – raym0nd

+0

@ raym0nd : 그런 다음 PC와 대상 장치에서 일치하지 않는 바이너리가 있습니다. 아무 문제없이 3.5.1을 사용하는 많은 용도가 있습니다. 적절한 버전에 대해 컴파일하고 동일한 버전을 대상에 배포해야합니다. 그렇지 않으면 이상한 동작이 발생합니다. – ctacke

2

당신은 다음 코드 줄을 공격하지 않을 것이다 :

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

제 문제는 독자가 항상 null이라는 것입니다 !! – raym0nd

+0

명령 유형을 지정하지 않았습니까? – Adam

+0

해야합니까? 나는 명령 유형을 지정할 필요가 없다고 생각한다. – raym0nd

0

Raym0nd 외부에서 아래의 코드를 이동 시도를, I 너는 이걸로 새것 같아.

제공 한이 버전을 살펴보십시오.

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

당신은 당신의 널 (NULL) 정수의 경우 개체를 테스트하기 위해 몇 가지 기능을 추가하기를 원하지만 대부분이기 때문이다 것은 깨끗하고 간단합니다.

예외가 발생하면 Console.WriteLine()에 중단 점을 넣고위로 마우스를 이동하십시오.

+0

도움을 주셔서 감사합니다 ...하지만 System.Data.SqlServerCe 버전 3.5.1.0을 사용했기 때문에이 문제가 발생했습니다. 3.5.0.0을 사용했으며 매력적이었습니다. – raym0nd

관련 문제