2012-01-02 13 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

+0

は、私が学生の名前が 'の場合はS_IDをrturnしたいですRequest.QueryString.ToString.'Thats all.Thanks。 –

+0

誰も@ShreeKhanalにSQLインジェクションの脆弱性を回避する方法を示しませんか? –

答えて

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; 
    } 
} 

あなたが再スロー以外の例外を除いて何もしない(実際にあなたがthrow ex;を使用してだけではなくthrow;によって、元のスタックトレースを失った時に/キャッチを試みる使用する必要はありません。また、 C#using文は少ないコード行であなたのためにリソースをクリーンアップの世話をする。そのMEAのようなSQLに直接クエリ文字列を渡す

重要

誰でもあなたのデータベースにランダムなSQLを実行し、潜在的にすべてを削除する(または悪化させる)ことができます。 SQL Injectionにお読みください。

+2

SQLインジェクションについての注意点 – Krumelur

-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です。 –

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ブロックを使用する必要があります。次に、ifステートメント内から値を返すだけで、オブジェクトを閉じるまで変数に変数を格納する必要はありません。

接続を1回だけ開く必要があります。

クエリに値を連結する代わりに、パラメータ化されたクエリを使用する必要があります。

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(); 
     } 
    } 
} 
関連する問題