2012-10-19 162 views
1

我想檢查用戶是否有效,它給我例外,當用戶有效時它的工作沒有問題,但如果用戶無效有一些問題。異常拋出位置0沒有行

的例外是:沒有一行位置0

這裏是代碼的一部分,

public bool CheckUserExistAndReporter(string user) 
{ 
    int reporterDnnId = -1; 
    SMSFunctionController mysms = new SMSFunctionController(); 
    DataSet uds = mysms.GetUsersUnitByUserName(user); 

    reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]); 
    if (reporterDnnId > 0) 
    { 
     bool isValidUser = true; 
     return isValidUser; 
    } 
    //else 
    //{ 
     //bool isValidUser =false; 
     //return isValidUser; 
    // } 
    return false; 
} 

然後我在這裏呼籲thatone。

   if (!CheckUserExistAndReporter(user)) 
       { 
        ErrorLog(messageIn); 
        msgOut = "ugyldig Bruker";//Invalid User. 

       } 

什麼是錯誤?

回答

2

您還應該在訪問行[0]中的userId之前對行進行計數。

public bool CheckUserExistAndReporter(string user) 
{ 
    bool isValidUser = false; 

    SMSFunctionController mysms = new SMSFunctionController(); 
    DataSet uds = mysms.GetUsersUnitByUserName(user); 

    if (uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count>0) 
    { 
     // do further validation 
     var reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]); 
     if (reporterDnnId > 0) 
     { 
      isValidUser = true;   
     } 
    } 
    return isValidUser; 
} 
3
Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]); 

您正在通過索引訪問行。如果用戶無效,則可能沒有行,因此索引超出範圍。

如果你所關心的是從數據庫返回的記錄,你可以這樣做:

bool isValid = uds.Tables[0].Rows.Count > 0; 

更健壯的檢查將是:

bool isValid = false; 
if(uds.Tables[0].Rows.Count > 0 && (int)uds.Tables[0].Rows[0]["DnnUserID"] != default(int)){ 
    isValid = true; 
} 

清理了一點:

var rows = uds.Tables[0].Rows; 
bool isValid = rows.Count > 0 && (int)rows[0]["DnnUserID"] != default(int); 

或者,如果您需要轉換(鑄造更便宜,並將工作,除非值不是Int32):

var rows = uds.Tables[0].Rows; 
bool isValid = rows.Count > 0 && Convert.ToInt32(rows[0]["DnnUserID"]) != default(int); 
+0

是的。如何在用戶無效時顯示?它需要進入調用函數的If條件中 –

+0

用幾個示例更新了我的答案。 –

+0

萬一uds爲空或uds不包含任何表的情況下,您的代碼將拋出異常。 –

2

你可以像這樣

if(uds.Tables[0].Rows.Count>0) 
{ 
    reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]); 
} 
4

你的方法是mysms.GetUsersUnitByUserName(user)返回一個空表。可能沒有實現選擇的標準,這就是爲什麼當你嘗試訪問它時。你正在收到錯誤。它更好,如果你可以在訪問數據行之前添加一個檢查。就像是。

if(uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count > 0) 
    reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]); 
+0

如果uds爲空,您的代碼將拋出空引用異常。如果uds不是null,但是uds中沒有表,那麼if的第二部分會拋出錯誤。 –

+0

在後期你的第一部分如果還會拋出異常。索引超出限制的例外。 –

+0

@muhammadkashif,爲了安全起見,是的,應該這樣做。但是OP要求排除沒有行的例外。所以我的假設是他的方法是創建一個新的DataSet並返回一個空表。否則他會有一個NRE。目前他的錯誤是「位置0沒有行」。 – Habib

2

我覺得問題就在這一行reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]);。在繼續處理代碼之前,您必須檢查if (uds.Tables[0].Rows.Count > 0)

if (uds.Tables[0].Rows.Count > 0) 
{ 
    reporterDnnId = Convert.ToInt32(uds.Tables[0].Rows[0]["DnnUserID"]); 
    ... 
2

先找出氣象數據集包含任何記錄或無法再繼續

if (uds.Tables[0].Rows.Count > 0) 
    { 
    // retrieve id and return it 
    } 
    else 
    { 
    return something which indicates record not found 
    } 
6

閱讀我覺得這是一個比別人更好所有的答案後,把下面如果你的代碼。

if(uds != null && uds.Tables.Count > 0 && uds.Tables[0].Rows.Count>0)