1

我試圖使用參數化查詢與數據閱讀器,當我得到此錯誤消息「無效嘗試讀取時,沒有數據存在。」錯誤 - 「無數據存在時無效嘗試讀取」。雖然使用SQLDataReader即使數據存在

但數據是有讀者!

enter image description here

以下是代碼執行此任務的

using (ConnectionManager connectionManager = new ConnectionManager()) 
{ 
    string query = @"SELECT * FROM LoginTab WHERE [email protected] " + 
       "AND [email protected]"; 

    List<SqlParameter> sqlParameterCollection = new List<SqlParameter>(); 
    sqlParameterCollection.Add(new SqlParameter("@username", SqlDbType.NVarChar) { Value = userName }); 
    sqlParameterCollection.Add(new SqlParameter("@password", SqlDbType.NVarChar) { Value = password }); 

    SqlDataReader sqlDataReader = connectionManager.ExecuteReader(query, CommandType.Text, sqlParameterCollection); 

    String roles = sqlDataReader[0].ToString(); 
    return roles; 
} 

的ExecuteReader函數在另一個類中定義的線。

public SqlDataReader ExecuteReader(String strcmd, CommandType type, List<SqlParameter> Parametercollections) 
{ 
    connnection = new SqlConnection(Connnectionstring); 
    command = new SqlCommand(strcmd, connnection); 
    command.CommandType = type; 
    foreach (SqlParameter paras in Parametercollections) 
    { 
     command.Parameters.Add(paras); 
    } 
    try 
    { 
     connnection.Open(); 
     reader = command.ExecuteReader(); 
    } 
    catch (SqlException E) 
    { 

    } 
    finally 
    { 

    } 

    return reader; 
} 

這裏有什麼問題?

+1

讀者定義在哪裏?這可能是一個範圍問題,或者讀者可能會在您嘗試閱讀時關閉它。 – Tim

+1

不是解決方案,但應該刪除try/catch/finally,以便了解任何異常。 –

回答

7

當您撥打SqlCommand.ExecuteReader()時,它給出的SqlDataReader最初定位在之前的的第一條記錄。在嘗試訪問任何數據之前,您必須撥打SqlDataReader.Read()才能移到第一條記錄。 SqlDataReader.Read()返回true如果它能夠移動到第一條記錄;如果沒有記錄,則返回false

if (sqlDataReader.Read()) 
{  
    String roles = sqlDataReader[0].ToString(); 
    return roles; 
} 
else 
{ 
    // The user name or password is incorrect; return something else or throw an exception. 
} 
+0

好,但我仍然對OP的代碼中讀者的定義感興趣...... – Tim

+0

可能是一個領域。不好! –

+0

謝謝邁克爾。解決了這個問題。 – Ananth

1

您應該檢查SqlDataReader.HasRows是真實的,或事先與SqlDataReader.Read()直到它返回false

using(SqlDataReader sqlDataReader = connectionManager.ExecuteReader()) 
{ 
    String roles=null; 
    if (sqlDataReader.Read()) 
    roles = sqlDataReader[0].ToString(); 
    return roles; 
} 

您需要使用usingsqlDataReader.Close()在退出時釋放由讀寫器連接鎖定。

+0

謝謝奧列格+1。確切的問題是我從來沒有調用sqlDataReader.Read()來將讀者定位到第一條記錄 – Ananth

相關問題