在这里运行查询,良好的设计?

Tom*_*len 1 c# asp.net

很抱歉在ASP.net上发布了这么多nubbin问题,我慢慢得到了它.

我在我的页面上执行查询(工作):

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">

    // When the registration form is submitted
    protected void regSubmit(object sender, EventArgs e)
    {
        // No erros so far
        Boolean anyError = false;
        string errorMessages = "";

        // Take all form values
        string username = txtUsername.Text;
        string password1 = txtPassword1.Text;
        string password2 = txtPassword2.Text;
        string emailAdd = txtEmail.Text;

        // Verify that username is unique
        using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConn"].ToString()))
        {
            SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM tblUsers WHERE username = '" + username + "'", cn);
            cn.Open();
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            rdr.Read();
            int result = int.Parse(rdr[0].ToString()); //read a value
        }


        statusLabel.Text = username;
    }
</script>
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是最好的做法,我是否必须为我运行的每个查询都有一个"使用"块和内部结构,或者有更简单的方法吗?此外,我是否需要关闭任何东西或垃圾人照顾它?

在经典ASP我会有一个

adoCon.execute("DELETE FROM TABLE")
Run Code Online (Sandbox Code Playgroud)

或者a

rsCommon.open("SELECT * FROM TABLE"), adoCon
do until rsCommon.EOF

rscommon.movenext
loop
rsCommon.close
Run Code Online (Sandbox Code Playgroud)

发现目标!感谢您的任何帮助!这对我来说似乎更简单直观.

jim*_*lan 7

汤姆,

你在这里发现了一些不好的东西(抱歉这么直率).我会看看以下内容:

  • 参数化您的查询以减轻SQL注入攻击
  • 将您的逻辑分离到DAL和BLL层(或者至少,将其隔离以便在可能的情况下重用于类)

此外,Boolean anyError = false;永远不会使用,但我假设这是以后使用.

从好的方面来说,使用块的想法是好的,所以保持这一点.您可以在线查找参考资料,以帮助解耦逻辑和参数化查询.

顺其自然

吉姆