在c#中用户代码未处理OleDbException

时间:2015-10-26 16:06:30

标签: c# asp.net oledbexception

这是cs文件:

public int CheckExisting(String sqlDbQry, String sTable)
    {
        Qry = sqlDbQry;
        con = new OleDbConnection(connectionstr);
        if (con.State == ConnectionState.Open)
            con.Close();
        con.Open();
        cmd = new OleDbCommand(Qry, con);
        dr = cmd.ExecuteReader();
        while (dr.Read())
            rQry = Convert.ToInt32(dr[0].ToString());
        con.Close();
        return rQry;
    }

这是我的另一个cs:

protected void btnsub_Click(object sender, EventArgs e)
        {
            if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Email='" + Textemail.Text.Trim() + "'", "Temp") > 0)
            {
                lblmail.Text = "Your EmailId already Registered, Please Login!";
                return;
            }
            if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Phone_num='" + Textphone.Text.Trim() + "'", "Temp") > 0)
            {
                lblmail.Text = "Mobile number already exists, Please Login!";

                return;
            }
}

当我输入输入详细信息并点击提交时,它会显示类似的错误

以下是Screenshot

的错误

任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

您正在从标有“email”的文本框中手动构建sql字符串。电子邮件地址通常包含“@”。因为您正在构建原始SQL查询,所以您将“@”直接放入查询中。 OleDb将其解释为SQL参数,并期望您提供它,而不是,这是导致错误的原因。如果任何文本框包含'(单引号),您将收到类似的错误。

您应该使用OleDbCommandOleDbParameter来传递参数,而不是发送原始字符串。这也将修复其他人提到的sql注入攻击漏洞。

答案 1 :(得分:0)

我无法编辑你的帖子,所以我在这里做。

public int CheckExisting(String sqlDbQry, String sTable)
{
    try
    {
        Qry = sqlDbQry;
        con = new OleDbConnection(connectionstr);
        if (con.State == ConnectionState.Open)
            con.Close();
        con.Open();
        cmd = new OleDbCommand(Qry, con);
        dr = cmd.ExecuteReader();
        while (dr.Read())
            rQry = Convert.ToInt32(dr[0].ToString());
        con.Close();
        return rQry;
    }
    catch (OleDbException ex)
    {
        string message = ex;
        //put your message on a texbox or alert handler error on the web
        //or while debugging use a breakpoint on the exception handler
        //use log
        Console.WriteLine(message);
    }
}

答案 2 :(得分:0)

  

请记住,对于OleDb,参数是位置的,而不是命名的。您可以为参数命名,但不能在命令中使用@语法(它会引发有关需要声明标量变量的错误)...正确的语法是使用? ...它将按照您添加它们的顺序获取参数。

     

另外,我更喜欢.AddWithValue语法,我认为它更具可读性。

答案 3 :(得分:-1)

protected void btnsub_Click(object sender, EventArgs e)
    {
        if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Email='" + this.Textemail.Text.Trim() + "'", "Temp") > 0)
        {
            lblmail.Text = "Your EmailId already Registered, Please Login!";
            return;
        }
        if (objAdmin.CheckExisting("SELECT COUNT(*) FROM registration where Phone_num='" + this.Textphone.Text.Trim() + "'", "Temp") > 0)
        {
            lblmail.Text = "Mobile number already exists, Please Login!";

            return;
        }

}

  

只要把this.Textemail.Text和this.Textphone.Text,我希望它对你有所帮助。

相关问题