2011-05-16 8 views
0

이 여기 SqlDataReader에 문제가 있습니다!

코드입니다, 내가 8 시간 전에 거기를 게시 할 수 없기 때문에, 내가 직면하고있어 문제, 새로운 질문을 만들었습니다, 이전 물었다 question에 대한 응답입니다 :

if (context.Request.QueryString["id"] != null) 
{ 
     int id = int.Parse(context.Request.QueryString["id"].ToString()); 
     string connectionString = "Data Source=tarun-PC\\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=True"; 
     string commandString = "Select fsImage from WHATSNSTORE_FEATURED_STORES where imageId=" + id; 

     SqlConnection oConnection = new SqlConnection(connectionString); 
     SqlCommand oCommand = new SqlCommand(commandString, oConnection); 

     if (oConnection.State != ConnectionState.Open) 
     { 
      oConnection.Open(); 
     } 

     SqlDataReader myDataReader = oCommand.ExecuteReader(); 

     //myDataReader.Read(); 

     try 
     { 
      if (myDataReader.Read()) 
      { 
       context.Response.ContentType = "image/jpg"; 
       context.Response.BinaryWrite((byte[])myDataReader["fsImage"]); 
      } 
     } 
     catch (Exception ex) 
     { 

     context.Response.Write(ex.Message); 
     } 

내 표

지금
create table WHATSNSTORE_FEATURED_STORES 
(
    imageId int primary key identity, 
    fsImage image 
) 

유일한 문제는,이 데이터의 존재가 없다는 것을 나타내는 if(myDataReader.Read()) 부분을 스킵하면서 디버깅!

어떻게 문제를 해결할 수 있습니까?

+0

오류가 있습니까? _context.Response.Write (ex.Message); _ 뭔가 있습니까? 해당 라인에 beakpoint를 놓고 앱이 거기에 발걸음을 내딛었는지 확인하십시오 ... 데이터가 필요하다는 것을 의미하는 데이터가 없다면 – Marco

+0

을 입력하십시오. – Avitus

+0

@Marco가 if()없이 코드를 실행할 때 "잘못된 데이터가 없을 때 읽으려는 시도"입니다. 다시 SSMS에서 쿼리를 실행했습니다. 원하는 결과를 얻는 중! – cSharpNovice

답변

1

독자가 비어 있으면 검색어가 결과를 반환하지 않았다는 의미입니다.

코드를 보면 이미지가 데이터베이스에서 누락되었다고 말할 수 있습니다. 아마도 브라우저에서 빈 이미지를 스트리밍하거나 HTTP 404 오류를 반환 할 수 있습니다.

[업데이트]

가 가

당신이 생성 된 SQL 문자열을 확인 했 ? id을 SQL 문자열에 추가하면 문자열로 다시 캐스트됩니다. id가 1000 이상인 경우 정수의 지역화 된 표현을 얻을 수 있습니다 (즉, 1000 대신 1.000). 그러면 SSMS의 쿼리가 페이지가 표시되지 않는 동안 결과를 반환하는 이유가 설명됩니다.

원문 대답 : 사용하는 것으로 나타났습니다 int.Parse; 대신 int.TryParse을 사용할 수 있습니다. 값이 유효한 int이 아니면 false을 반환합니다. 또한 문자열 연결을 통해 SQL을 작성합니다. 이것은 나쁜 관행으로 간주됩니다. 매개 변수를 사용해야합니다. 다른 최상의 방법은 연결 및 판독기를 using 문으로 묶는 것입니다. 그렇게하면 연결이 끊어지고 리더가 더 이상 필요하지 않을 때 (특히 예외가 발생할 경우) 닫힙니다. 마지막으로, 연결 문자열을 web.config 파일로 이동하는 것이 좋습니다.

+0

임시로 그냥 기능을 올바르게 사용하는지 확인하기 위해 빌드합니다. 일반적으로 최종 버전에서는 좋은 습관을 유지하려고합니다. 고마워요 :) – cSharpNovice

+0

@cSharpNovice 귀하의 사용자 이름은 달리 제안 :) 어쨌든, 나는 내 대답을 업데이 트했습니다. 문제가 해결되면 알려 주시기 바랍니다. –

+0

하하, 이것은 임시 id 일뿐입니다. 원래 ID로 로그인하는 데 문제가 있습니다! :) – cSharpNovice

0

하나의 값만 필요하기 때문에 독자 대신 oCommand.ExecuteScalar를 사용해야합니다. 그 후에 반환 된 값이 null인지 아닌지 확인할 수 있습니다.

+0

이 더 좋은 접근 방법은 아무 것도 해결하지 못합니다. –

+0

@Brian, 아니지만 오류를 찾기가 더 쉬울 수도 있습니다. –

+0

ExecuteScalar()를 사용했지만 반환 된 객체에 null 값이 있습니다! – cSharpNovice

0

디버거가 올바르게 설정 되었습니까? 프로세스에 연결하고 배포 된 .dbg 파일이 디버깅 된 bin 디렉터리의 .dll 파일과 일치하지 않습니까? bool에 myDataReader.Read()를 할당하여 데이터베이스 정보가 있는지 확인하려고 했습니까?

+0

예, bool 변수에 값을 할당했습니다. bool 변수의 값은 false이지만, 내 DB에 데이터가 있기 때문에 이것이 틀린 이유는 모르겠습니다! – cSharpNovice

+0

@cSharpNovice : 확실히 연결 문자열이나 쿼리에 문제가 있습니다. 질의에서 돌아 오는 정보가 없다면 이것은 프로그래밍상의 문제가 아닙니다. –

+0

@cSharpNovice : ID가 마치 –