2017-12-13 9 views
0

私はC#とNpgsqlで初心者ですが、特定のテーブルで検索しようとしていますが、例外が発生しています。C#メソッドで例外を返すSELECTクエリ

のSystem.InvalidOperationException:例外ベロー

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

'NO行が利用できない'

私は同じことをしましたが、PgAdmin4を使用して、と私は1つのラインを持っています。まさに私が欲しいもの。

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

@ bradbury9彼は 'using(NpgsqlConnection ...) 'を使用しているため' NpgsqlConnection'を閉じる必要はありません – styx

1

代わり.Read()続いHasRowsをチェックするためwhileを使用するので、コードは次のようになります:

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

私は1つのレコードが捉えられていると思います。 – bradbury9

+0

明らかであるときには、1つの行だけが必要であると私は示唆しません。 – Crowcoder

+0

@Crowcoder:もし1行しか期待していないのであれば、なぜ 'TOP 1'を使わないのでしょうか?1行しか期待していなければ' N'行を取り出す必要はないと思います。 –

関連する問題