2016-11-29 44 views
0

我已经在我的代码的另一部分使用SqlDataAdapter命中了数据库,但我只需要一个阅读器为我返回一行,并且此代码不能正常工作。有人可以看到我犯了什么错误吗?SqlDataReader在asp.net页面中使用C#不能正确执行

我只是试图从我返回的第一列中分配一个标签值。当它跑到下面时,我无法让它弹出。

private void loadProcInfo(string procid) 
{ 
    try 
    { 
     SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString); 
     SqlCommand query = new SqlCommand("SELECT * FROM dbo.Book1 WHERE ID ='" + procid +"'", con); 

     //ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('"+query+"');", true); 

     using (SqlDataReader procinfoload = query.ExecuteReader()) 
     {      
      if (procinfoload.Read()) 
      { 
       ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('IT WORKED');", true); 
       Id.Text = procinfoload.GetValue(0).ToString(); 
      } 
      else 
      { 
       ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('not success!');", true); 
      } 
     } 

     con.Close(); 
    } 
    catch (Exception ex) 
    { 
     ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + ex + "');", true); 
     //MessageBox.Show(ex.Message); 
    } 
} 
+2

使用'SQL parameters' – Hackerman

+0

你总是应该在你的问题包括错误消息,而不是假设我们知道问题是什么。 – mason

回答

3

尝试执行读取器之前打开连接。

con.Open(); 
2

主要问题是代码在使用该命令之前未打开连接。但还有其他问题。

  • 您没有参数化您的查询,这暴露您的代码可能的SQL注入攻击。
  • 如果发生异常,则不会将连接包装在使用块中,否则连接将保持打开状态直到发生垃圾回收。这是不好的做法。

代码:

private void loadProcInfo(string procid) 
{ 
    try 
    { 
     using(SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString)) 
     using(SqlCommand query = new SqlCommand("SELECT * FROM dbo.Book1 WHERE ID = @bookId", con)) 
     { 
      // added parameter 
      query.Parameters.Add(new SqlParameter("@bookId", SqlDbType.Int){Value = procid}); 
      con.Open(); // missing 
      //ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('"+query+"');", true); 
      using (SqlDataReader procinfoload = query.ExecuteReader()) 
      {      
       if (procinfoload.Read()) 
       { 
        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('IT WORKED');", true); 
        Id.Text = procinfoload.GetValue(0).ToString(); 
       } 
       else 
       { 
        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('not success!');", true); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + ex + "');", true); 
     //MessageBox.Show(ex.Message); 
    } 
}