java.sql.SQLException:[Microsoft][ODBC Microsoft Access驱动程序]查询值和目标字段的数目不相同

java.sql.SQLException:[Microsoft][ODBC Microsoft Access驱动程序]查询值和目标字段的数目不相同,java,jdbc,Java,Jdbc,我正在尝试创建一个JAVA代码,其中的代码将检查数据库中是否有任何现有数据,如果没有发现,则将用户输入的数据插入数据库 try { username1=request.getParameter("txt1"); password1=request.getParameter("p1"); nickname1=request.getParameter("nick_name1"); email1=request.getParameter

我正在尝试创建一个JAVA代码,其中的代码将检查数据库中是否有任何现有数据,如果没有发现,则将用户输入的数据插入数据库

try {

        username1=request.getParameter("txt1");
        password1=request.getParameter("p1");
        nickname1=request.getParameter("nick_name1");
        email1=request.getParameter("email_1");
        phone_no1=request.getParameter("phone_no_1");
        date1=request.getParameter("date");
        month1=request.getParameter("month");
        year1=request.getParameter("year");
        school1=request.getParameter("school_1");
        class1=request.getParameter("class_1");
        section1=request.getParameter("section_1");

        // username1, password1, nickname1, email1, phone_no1 - should be unique //

        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        con=DriverManager.getConnection("jdbc:odbc:harshan_web");

        if (con != null)
        {

            st=con.createStatement();

           ResultSet rs=st.executeQuery("select * from account_registration where username='"+username1+"' or password='"+password1+"' or nickname='"+nickname1+"' or email='"+email1+"' or phone='"+phone_no1+"'");


                if (rs.next())
                {

                u1 = rs.getString("username");
                p1 = rs.getString("password");
                n1 = rs.getString("nickname");
                e1 = rs.getString("email");
                ph1 = rs.getString("phone");
                invalid_data = "";


            if (username1.equals(u1))
            { u2="Username "; }
            else
            { u2=""; }
            if (password1.equals(p1))
            { p2="Password "; }
            else
            { p2=""; }
            if (nickname1.equals(n1))
            { n2="Nickname "; }
            else
            { n2=""; }
            if (email1.equals(e1))
            { e2="Email-ID "; }
            else
            { e2=""; }
            if (phone_no1.equals(ph1))
            { ph2="Phone-Number "; }
            else
            { ph2=""; }

            invalid_data=""+u2+""+p2+""+n2+""+e2+""+ph2+" has/have already been used! Try Again.";
            response.sendRedirect("index.jsp?invalid_data="+invalid_data+""); 

            }                   
                else
                {

                st.executeUpdate("insert into account_registration values('"+username1+"','"+password1+"','"+nickname1+"','"+date1+"','"+month1+"','"+year1+"','"+school1+"','"+class1+"','"+section1+"','"+email1+"','"+phone_no1+"')");
                response.sendRedirect("reg_complete.html"); 

                }
        }

        else
        {                
            response.sendRedirect("error.html");                
        }

        /* TODO output your page here. You may use following sample code. */

    } catch (Exception e) {} 
      finally {            
        out.close();
    }
它显示如下异常

java.sql.SQLException:[Microsoft][ODBC Microsoft Access驱动程序]查询值和目标字段的数目不相同

我不知道那是什么意思。这是SQL语句还是JAVA的问题

实际上,我在数据库中添加了一个自动编号字段。如果我在insert SQL语句的第一个结束括号前添加了一个额外的
,'
,它会给出另一个异常,即SQL语法中的字段类型错误。
我主要认为错误是针对自动编号字段的,因为该字段不能包含除数据库生成的值以外的任何值。

引入一个try-catch块并获取异常以确认,如果是rs。接下来,光标必须位于最后一个字段之前,如果其中没有数据,它将返回false,所以应该是安全的。

您得到的异常似乎是因为您的insert语句:

try {

        username1=request.getParameter("txt1");
        password1=request.getParameter("p1");
        nickname1=request.getParameter("nick_name1");
        email1=request.getParameter("email_1");
        phone_no1=request.getParameter("phone_no_1");
        date1=request.getParameter("date");
        month1=request.getParameter("month");
        year1=request.getParameter("year");
        school1=request.getParameter("school_1");
        class1=request.getParameter("class_1");
        section1=request.getParameter("section_1");

        // username1, password1, nickname1, email1, phone_no1 - should be unique //

        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        con=DriverManager.getConnection("jdbc:odbc:harshan_web");

        if (con != null)
        {

            st=con.createStatement();

           ResultSet rs=st.executeQuery("select * from account_registration where username='"+username1+"' or password='"+password1+"' or nickname='"+nickname1+"' or email='"+email1+"' or phone='"+phone_no1+"'");


                if (rs.next())
                {

                u1 = rs.getString("username");
                p1 = rs.getString("password");
                n1 = rs.getString("nickname");
                e1 = rs.getString("email");
                ph1 = rs.getString("phone");
                invalid_data = "";


            if (username1.equals(u1))
            { u2="Username "; }
            else
            { u2=""; }
            if (password1.equals(p1))
            { p2="Password "; }
            else
            { p2=""; }
            if (nickname1.equals(n1))
            { n2="Nickname "; }
            else
            { n2=""; }
            if (email1.equals(e1))
            { e2="Email-ID "; }
            else
            { e2=""; }
            if (phone_no1.equals(ph1))
            { ph2="Phone-Number "; }
            else
            { ph2=""; }

            invalid_data=""+u2+""+p2+""+n2+""+e2+""+ph2+" has/have already been used! Try Again.";
            response.sendRedirect("index.jsp?invalid_data="+invalid_data+""); 

            }                   
                else
                {

                st.executeUpdate("insert into account_registration values('"+username1+"','"+password1+"','"+nickname1+"','"+date1+"','"+month1+"','"+year1+"','"+school1+"','"+class1+"','"+section1+"','"+email1+"','"+phone_no1+"')");
                response.sendRedirect("reg_complete.html"); 

                }
        }

        else
        {                
            response.sendRedirect("error.html");                
        }

        /* TODO output your page here. You may use following sample code. */

    } catch (Exception e) {} 
      finally {            
        out.close();
    }
st.executeUpdate("insert into account_registration values('"+username1+"','"+password1+"','"+nickname1+"','"+date1+"','"+month1+"','"+year1+"','"+school1+"','"+class1+"','"+section1+"','"+email1+"','"+phone_no1+"')");

检查要插入到表中的任何数据字段中是否有单引号字符,如果有,则将其转义。这可能会混淆查询的解析方式。

Add
e.printStackTrace()在catch块中查看是否正在抑制异常。我已经添加并调试了。但错误依然存在。我现在已经编辑了我的代码-我添加了它显示的异常:java.sql.SQLException:[Microsoft][ODBC Microsoft Access Driver]查询值和目标字段的数量不同。我已经添加并调试了。但错误依然存在。我现在编辑了我的代码-我添加了它显示的异常:java.sql.SQLException:[Microsoft][ODBC Microsoft Access Driver]查询值和目标字段的数量不相同。是否在插入值字段中传递额外的“,”。另外,最好确定导致问题的行—首先提取原始sql并在db client上执行以进行验证。对不起。你说的逃逸是什么意思。那么代码应该是什么样子的呢。值(“+username+”,“+password1+”,…@Harshan01不,您需要在每段数据周围加引号。您在表单中输入的实际值是什么?这些值中有没有单引号?没有。它们都只是简单的文本,如名称,例如:John、Gates等@Harshan01我会直接在SQL中尝试insert语句,以确保其有效。@Harshan01您可以创建一个查询,然后转到SQL视图在Access中写入/运行查询。