2015-05-13 71 views
0

我有一點問題,但我不明白這個問題。所以我有一個DataReader我從我的數據庫中讀取我的數據。但問題是,儘管我的數據庫中有匹配的行,DataReader不斷回來,沒有行。datareader不讀取數據

我的數據庫連接:

static private String _connectionString = @"Data Source=(localdb)\v11.0;Initial Catalog=dboVids;User id=g;password=g;Connect Timeout=15;Encrypt=False"; 
     static private SqlConnection _connection; 

     static Connection() 
     { 
      try 
      { 
       _connection = new SqlConnection(_connectionString); 
       Open(); 
      } 
      catch (Exception ex) 
      { 
       switch (ex.HResult) 
       { 
        default: 
         throw; 
       } 
      } 
     } 

我的方法:

static public SqlDataReader WeergevenRolPerUser(string userName) 
      { 
       try 
       { 
        Open(); 
        SqlCommand command = new SqlCommand("select * from [dbo].[fnShowDatabaseRole]('@UserName')", _connection); 
        command.Parameters.AddWithValue("@UserName", userName); 
        SqlDataReader myReader = command.ExecuteReader(); 
        myReader.Read(); 
        return myReader; 
       } 
       catch (Exception ex) 
       { 
        switch (ex.HResult) 
        { 
         default: 
          throw; 
        } 
       } 
      } 

Open()方法:

private static void Open() 
     { 
      try 
      { 
       if (_connection.State != ConnectionState.Open) 
        _connection.Open(); 
      } 
      catch (Exception ex) 
      { 
       switch (ex.HResult) 
       { 
        default: 
         throw; 
       } 
      } 
     } 

這裏就是我所說的DataReader

private void lstUsers_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      SqlDataReader reader = null; 
      try 
      { 
       if (_username != "" && lstUsers.SelectedValue != null) 
       { 
        string user = lstUsers.SelectedValue.ToString(); 
        reader = Database.Users.WeergevenRolPerUser(user); 

        if (reader.Read()) 
        { 
         MessageBox.Show("unreachable"); 
         var rol = reader.GetString(0); 
         if (rol == "gebruiker") 
         { 
          rdbUser.Checked = true; 

         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       switch (ex.HResult) 
       { 
        default: 
         throw; 
       } 
      } 
      finally 
      { 
       if (reader != null) reader.Close(); 
      } 


     } 
+0

沒有足夠的信息。通常情況下,你可以使用Profiler來查看你的sql命令是否擊中了數據庫,所以你完全知道*真正的查詢是什麼(而不是你認爲它是什麼),然後你拿它並在你的數據庫上執行它,看看你*實際*退後。這通常足以告訴你90%的時間發生了什麼 – Will

+0

查詢在數據庫中執行時是否返回結果?你能調試應用程序,而不會拋出任何異常嗎?你也應該使用_using_-Blocks。目前您並未關閉連接。 – Greg

+2

有一個共享的'Connection'對象 - 共享連接*字符串*,但是爲每個需要一個'Command的命令'創建新的'Connection'對象通常是一個糟糕的主意(並且確保你將它們封裝在'using'中或者使用後處理它們)。 –

回答

2

我的猜測是,你是讀者對象上調用.Read()兩次,其中,按MSDN

進展SqlDataReader的下一個記錄。

您在WeergevenRolPerUser這樣做一次,這將讀取你期望要返回的數據,並再次在lstUsers_SelectedIndexChanged正如你發現,將無法讀取任何東西,因爲沒有下一個記錄提前到。

如果我是你,我會更改WeergevenRolPerUser返回User對象。

static public User WeergevenRolPerUser(string userName) 
{ 
    try 
    { 
     using(var connection = new SqlConnection(/* connection string */)) 
     { 
      connection.Open(); 

      using(var command = new SqlCommand("select * from [dbo].[fnShowDatabaseRole]('@UserName')", connection)) 
      { 
       command.Parameters.AddWithValue("@UserName", userName); 

       using(var myReader = command.ExecuteReader()) 
       { 
        while(myReader.Read()) 
        { 
         return new User 
           { 
            Username = myReader.GetString(/* column index */), 
            Role = myReader.GetString(/* column index */) 
           } 
        } 
       } 

       myReader.Close(); 
      } 
     } 
    catch (SqlException ex) 
    { 
     throw; 
    } 
} 
+0

似乎完全合理。我還會注意到,OP將列表視圖事件與數據庫代碼混合在一起,並保持db連接打開時間超過需要,這是非常糟糕的做法 – irreal

+0

什麼異常?請記住,您將使用所需的屬性創建一個名爲「User」的新類,並且需要爲所需的數據提供正確的列索引。 –

+0

「執行讀取器需要一個開放的可用連接,連接的當前狀態是關閉的」 – user3141908