2012-01-02 50 views
3

我忘了在單層應用程序中返回值。如何從SqlDataReader返回單個值?

public int Studentid() 
    { 
     try 
     { 
      SqlConnection con = new SqlConnection(connectionStr); 
      SqlCommand cmd = new SqlCommand("SELECT s_id FROM student where name = + ('" + Request.QueryString.ToString() + "')", con); 
      con.Open(); 
      SqlDataReader dr = null; 
      con.Open(); 
      dr = cmd.ExecuteReader(); 
      if (dr.Read()) 
      { 
       //Want help hear how I return value 
      } 

      con.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
+0

檢查[MSDN](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx) – oleksii 2012-01-02 15:16:21

+0

我想rturn S_ID如果學生的名字是' Request.QueryString.ToString.'Thats all.Thanks。 – 2012-01-02 15:17:11

+0

沒有人會顯示@ShreeKhanal如何避免SQL注入漏洞? – 2012-01-02 15:20:01

回答

17

這是您的方法的一個版本,可以實現您所追求的內容。

public int GetStudentId() 
{ 
    var sql = string.Format("SELECT s_id FROM student where name = '{0}'", Request.QueryString); 
    using (var con = new SqlConnection(connectionStr)) 
    using (var cmd = new SqlCommand(sql, con)) 
    { 
     con.Open(); 
     var dr = cmd.ExecuteReader(); 
     return dr.Read() ? return dr.GetInt32(0) : -1; 
    } 
} 

有沒有必要使用try/catch語句時,你不例外做任何事情,除了重新擲(實際上你用throw ex;,而不是僅僅throw;失去了原來的堆棧跟蹤。另外,在C#using聲明中需要更少的代碼清理你的資源爲你的照顧。

重要

傳遞的查詢字符串直接進入這樣的MEA SQL任何人都可以在數據庫中執行隨機SQL,可能會刪除所有內容(或更糟糕的情況)。請閱讀SQL Injection

+2

+1有關SQL注入的說明 – Krumelur 2012-01-02 16:44:41

-1

想要這樣嗎?

public int Studentid() 
{ 
     int studentId = -1; 
     SqlConnection con = null; 
     try 
     { 
      con = new SqlConnection(connectionStr); 
      SqlCommand cmd = new SqlCommand("SELECT s_id FROM student where name = + ('" + Request.QueryString.ToString() + "')", con); 
      SqlDataReader dr = null; 
      con.Open(); 
      dr = cmd.ExecuteReader(); 
      if (dr.Read()) 
      { 
       studentId = dr.GetInt32(0); 
      } 

      dr.Close(); 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      if(con != null) 
       con.Close(); 
      con = null; 
     } 

     return studentId; 
} 
+2

我知道你剛剛複製了,然後修改了他的代碼,但-1複製了他在過程中的所有錯誤。 – 2012-10-28 18:49:04

2

試試這個:

int s_id = (int) dr["s_id"]; 
0
if (dr.Read()) 
      { 
       //Want help hear how i return value 
       int value = dr.GetInt32("s_id"); 
      } 
1
int studId=0; 
if(rdr.Read()) 
{ 
    studId=rdr.GetInt32(rdr.GetOrdinal("s_id")); 
} 
4

你應該使用using塊,所以你是確保連接,命令和Reader是正確關閉。然後,您可以直接返回if語句中的值,並且在關閉對象之前不必將其存儲在變量中。

您只需打開一次連接。

您應該使用參數化查詢,而不是將值連接到查詢中。

public int Studentid() { 
    try { 
    using (SqlConnection con = new SqlConnection(connectionStr)) { 
     using (SqlCommand cmd = new SqlCommand("SELECT s_id FROM student where name = @Name", con)) { 
     cmd.Parameters.Add("@Name", DbType.VarChar, 50).Value = Request.QueryString.ToString(); 
     con.Open(); 
     using (SqlDataReader dr = cmd.ExecuteReader()) { 
      if (dr.Read()) { 
      return dr.GetInt32(0); 
      } else { 
      return -1; // some value to indicate a missing record 
      // or throw an exception 
      } 
     } 
     } 
    } 
    } catch (Exception ex) { 
    throw; // just as this, to rethrow with the stack trace intact 
    } 
} 
0

返回單個值的最簡單方法是致電ExecuteScalar。你也應該修復你的SQL注入漏洞。你是不是要編碼整個查詢字符串數組,或只是挑出一個值?

public int StudentId() 
{ 
    string sql = "SELECT s_id FROM student WHERE name = @name"; 
    using (var con = new SqlConnection(connectionStr)) 
    { 
     using (var cmd = new SqlCommand(sql, con)) 
     { 
      cmd.Parameters.Add("@name", DbType.VarChar, 256).Value = Request.QueryString["name"]; 
      con.Open(); 
      return (int)cmd.ExecuteScalar(); 
     } 
    } 
}