2012-01-02 51 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(); 
     } 
    } 
}