2014-04-10 68 views
0

你好夥伴開發人員, 我想從函數返回一個Datatable用於我的代碼。 其登錄表,我有我的工作人員,並基於employeerole我做我的進一步導航。 但問題是每當我嘗試啓動查詢,查詢觸發並返回dataTable中的某些值,但是當我嘗試訪問它時,錯誤:「位置0沒有行」彈出。位置0沒有行,C#

我檢查DataTable是否爲null。

的DatabaseConnection類的初始化和對象的創建可以在這裏找到和我的功能(類聲明,構造函數和函數)

public class DatabaseConnection 
{ 
    const string strConnectionString = "DATA SOURCE =dilbert.humber.ca:1521/grok; USER ID =n00993435; PASSWORD= oracle;"; 
    OracleConnection oracleConnection; 
    OracleCommand oracleCommand; 
    string query; 
    OracleDataReader oracleReader; 
    OracleDataAdapter oracleDataAdapter; 
    OracleCommandBuilder oracleCommandBuilder; 
    DataTable dataTable; 

    public DatabaseConnection() 
    { 
     try 
     { 
      oracleConnection = new OracleConnection(strConnectionString); 
      oracleCommand = new OracleCommand(); 
      oracleCommand.Connection = oracleConnection; 
      oracleCommand.Connection.Open(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.StackTrace); 
     } 
    } 
public DataTable Login(string u, string p) 
    { 
     try 
     { 
      string query = "select employeeid, username, password, firstname, lastname, employeerole from login where username='" + u + "' and password='" + p + "'"; 
      oracleCommand.CommandText = query; 
      oracleDataAdapter = new OracleDataAdapter(oracleCommand); 
      dataTable = new DataTable(); 
      oracleDataAdapter.Fill(dataTable); 
      return dataTable; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      return null; 
     } 
     finally 
     { 
      oracleConnection.Close(); 
     } 
    } 
} 

我的實現:

private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     if (txtUName.Text == null || txtUName.Text == "") 
     { 
      MessageBox.Show("Please Enter UserName"); 
     } 
     else if (txtPassword.Text == null || txtPassword.Text == "") 
     { 
      MessageBox.Show("Please Enter Password"); 
     } 
     else 
     { 
      string username = txtUName.Text; 
      string password = txtPassword.Text; 
      DatabaseConnection obj = new DatabaseConnection(); 
      DataTable dt = new DataTable(); 
      dt = obj.Login(username, password); 
      if (dt == null) 
      { 
       MessageBox.Show("User with these credentials not found in our Database. Please contact the Admin"); 
      } 
      else 
      { 
       DataRow row = dt.Rows[0]; 
       string role = row[5].ToString(); 
       if (role == "ADMIN") 
       { 
        Admin madmin = new Admin(); 
        this.Hide(); 
        madmin.Show(); 
       } 
      else if (role == "MANAGER") 
      { 
       BranchManager badmin = new BranchManager(); 
       this.Hide(); 
       badmin.Show(); 
      } 
      else if (role == "EMPLOYEE") 
      { 
       MainBank obj2 = new MainBank(); 
       obj2.Show(); 
       this.Hide(); 

      } 
      else 
      { 
       lblWarning.Visible = true; 
       lblWarning.Text = "Invalid Login Credentials."; 
       txtUName.BackColor = Color.Red; 
       txtPassword.BackColor = Color.Red; 
       txtUName.Focus(); 
      } 
      } 
     } 
    } 

的數據是正確的在Oracle中檢索: enter image description here

我很無語,爲什麼這個錯誤是 彈出。

這是所創建的查詢:"select employeeid, username, password, firstname, lastname, employeerole from login where username='ADMIN' and password='ADMIN'"這對我來說似乎很好,因爲我試圖在編輯器上運行相同的程序,它的工作原理!有什麼我失蹤?

enter image description here

提前感謝!

+1

dt == null僅檢查DataTable是否不爲null。您應該檢查dt.Rows的計數。如果if爲零,則會得到IndexOutOfRangeException –

回答

1

正如消息所述,數據表中沒有行,所以當您嘗試索引0時,它會失敗。

您需要確保從登錄功能正確填充數據表。

爲了避免該錯誤,您可以簡單地檢查一行是否已被返回。

if (dt != null && dt.Rows.Any()) { 
    // it has results. 
} 
+2

在調用Any()之前,必須將'Rows'強制轉換爲DataRow。 –

+0

但是,當我在oracle中嘗試時,它如何返回查詢?你能檢查我的查詢或其實施在哪裏我發射查詢? – Shashank

3

它看起來像沒有從數據庫結果記錄在一個空DataTable,而不是null一個。

檢查以確保在嘗試訪問它之前至少有一行。

if (dt.Rows.Count == 0) 
{ 
    MessageBox.Show("User with these credentials not found in our Database. Please contact the Admin"); 
} 

你那是你的Login方法,它應該大概都在其內部定義的外部定義一些東西,這樣你就可以更放心,沒有其他與數據庫的連接產生負面影響。

這是未經測試,但應該工作。我參數化了你的查詢,並刪除了try/catch。 (如果有任何異常,處理它們在任何事件或方法你打電話叫從Login。)

如果 DataTable不爲空
public DataTable Login(string u, string p) 
{ 
    var dataTable = new DataTable(); 

    var connectionString = "whatever"; // change this obviously :) 
    var query = "select employeeid, username, password, firstname, lastname, employeerole from login where username = :username and password = :password"; 

    using (var oracleConnection = new OracleConnection(connectionString)) 
    { 
     oracleConnection.Open(); 

     using (var oracleCommand = new OracleCommand(query, oracleConnection)) 
     { 
      oracleCommand.Parameters.AddWithValue("username", u); 
      oracleCommand.Parameters.AddWithValue("password", p); 

      using (var oracleDataAdapter = new OracleDataAdapter(oracleCommand)) 
      { 
       oracleDataAdapter.Fill(dataTable); 
      } 
     } 

     oracleConnection.Close(); 
    } 

    return dataTable; 
} 
+0

但是,當我在Oracle中嘗試時,它如何返回查詢?你能檢查我的查詢或其實施在哪裏我發射查詢? – Shashank

+0

如果你直接在你的編輯器中運行它,你會得到一個記錄嗎?嘗試在「登錄」方法的頂部放置一個斷點。仔細檢查參數值。檢查'DataTable'是否有數據。 –

+0

這是創建的查詢:''從登錄名中選擇employeeid,用戶名,密碼,名字,姓氏,employeerole,其中用戶名='ADMIN'和密碼='ADMIN'「' 這個對我來說似乎很好,在編輯器上運行相同,它的工作原理!有什麼我失蹤? – Shashank

0

dt == null只檢查。 你應該檢查dt.Rows.Count == 0。

if (dt == null || dt.Rows.Count == 0) 

如果爲零表示您的查詢未返回任何結果。

+0

但是,當我在oracle中嘗試時,它如何返回查詢?你能檢查我的查詢或其實施在哪裏我發射查詢? – Shashank

+0

@Shashank在dt.Fill之後的Login方法中,你的表是否有數據,你會得到一個異常嗎?我看到你有命令,dataTable和其他類作爲類字段...你還有其他的東西嗎? –

+0

填充方法後,我沒有得到一個例外代碼工作正常,並帶我到代碼的實現 – Shashank

0

謝謝大家! 我找到了答案,這是非常愚蠢的我.. :( 後添加插入查詢我沒有提交..因此,C#代碼計數找到它.. 提交後正確檢索查詢!: ) 感謝一噸快速反應!

All hail Developers!