2017-12-13 16 views
0

나는 C# 및 Npgsql에서 초보자이며 특정 테이블에서 검색을 시도하지만 예외가 발생합니다. 예외 벨로C# 메서드에서 예외를 반환하는 SELECT 쿼리

public User Login(Account c) 
{ 
    User usr = new User(); 
    using (NpgsqlConnection con = new NpgsqlConnection(strConnection)) 
    { 
     try 
     { 
      con.Open(); 
      NpgsqlCommand command = new NpgsqlCommand(); 
      command.Connection = con; 
      command.CommandText = "SELECT name FROM public.user WHERE c_id IN (SELECT id FROM public.account WHERE [email protected] AND [email protected])"; 
      command.Parameters.AddWithValue("Email", c.Email); 
      command.Parameters.AddWithValue("Password", c.Password); 
      NpgsqlDataReader dr = command.ExecuteReader(); 

      if (dr.HasRows) 
      { 
       usr.Name = dr["name"].ToString(); 
      } 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    }  
    return usr; 
} 

:

System.InvalidOperationException은 :

나는 PgAdmin4를 사용하여 같은 일을하지만를했고, 나는 한 줄을 가지고 '어떤 행은 사용할 수 없습니다'. 정확히 내가 뭘 원하는지.

SELECT name FROM public.user WHERE c_id IN (SELECT id FROM public.account WHERE email='[email protected]' AND password='user05'); 

어떻게 수정합니까?

+0

사용 프로파일 러 C# 프로젝트에서 실행중인 정확한 쿼리를 검사합니다. – EvZ

+0

맨 아래 쿼리에서 * name * 대신 ** nome **을 선택했는데 오타가 있습니까? 또한 * 암호 * 대 ** 센나 **. – Dan

+0

@EvZ 데이터베이스 관련 예외는 있지만 .net 예외는 아닙니다. 아마도 필드에 접근하기 전에 datareader에서'.Read()'를 호출하지 않았기 때문일 것입니다. styxs 대답을 확인하십시오. – bradbury9

답변

2

당신은 dr.Read(); 다음과 같이있는 동안 전화를해야 : 나는 당신을 제안

if (dr.HasRows) 
{ 
    dr.Read(); 
    usr.Name = dr["name"].ToString(); 
} 
+0

Havent는 npgsql로 작업했지만 IDataReaders로 작업 한 후에 다른 데이터베이스에서'.Close()'를 호출해야합니다. 다른 문제처럼 보입니다. – bradbury9

+0

이제 효과가있었습니다. 감사! –

+0

@brdbury9 그가'used (NpgsqlConnection ...) '를 사용했기 때문에'NpgsqlConnection'을 닫을 필요가 없습니다 – styx

1

대신 .Read() 다음 HasRows을 확인하기 위해 while을 사용하므로 코드는 다음과 같습니다

while(dr.Read()) 
{ 
    usr.Name = dr["name"].ToString(); 
    // Assign rest of values if there any 
} 
+0

나는 단지 하나의 기록이 스펙터클 한 것 같아요. – bradbury9

+0

명백한 점은 한 행만 있어야한다는 것이 아닙니다. – Crowcoder

+0

@Crowcoder : 만약 하나의 행만을 원한다면'TOP 1'을 쓰지 말고 하나의 행만을 원한다면'N' 행을 가져올 필요가 없다고 생각하십시오. –