Slexlexception:[Microsoft] [ODBC Microsoft访问驱动程序]查询值和目标字段的数量不一样。 [英] Sqlexception: [Microsoft][ODBC Microsoft access driver] number of query values and destination fields are not the same.

查看:66
本文介绍了Slexlexception:[Microsoft] [ODBC Microsoft访问驱动程序]查询值和目标字段的数量不一样。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

public void insertData()
	{
		String insert;
		String name = txtname.getText();
		String age = txtage.getText();
		String gender = txtgen.getText();
		String status = txtstatus.getText();
		String no = txtno.getText();
		insert = "INSERT INTO Jodoh (jfname, jfage, jfgender, jfstatus, jfno) VALUES ('"+name+", "+age+", "+gender+", "+status+", "+no+"')";

		try
		{
			stmt = con.createStatement();
			stmt.executeUpdate (insert);
		}

		catch (SQLException ex)
		{
			System.err.println ("SQLException: "+ ex.getMessage());
		}

		JOptionPane.showMessageDialog (null, "Your profile have been insert into our Jodoh List");

		txtname.setText("");
		txtage.setText("");
		txtgen.setText("");
		txtstatus.setText("");
		txtno.setText("");
	}





我的尝试:



我尝试将String更改为int但仍然遇到同样的问题。有人可以帮忙吗?由于这是我的第一个项目,我对java的了解并不是很好。



What I have tried:

I tried change the String into int but still had the same problem. Can anyone help? Since this is my first project, my knowledge about java is not very good.

推荐答案

两件事,都是相关的。

1)看起来在您的查询中:

Two things, both related.
1) look at your query:
INSERT INTO Jodoh (jfname, jfage, jfgender, jfstatus, jfno) VALUES ('"+name+", "+age+", "+gender+", "+status+", "+no+"')

假设替换有效,那将生成:

Assuming the replacements worked, that would generate this:

INSERT INTO Jodoh (jfname, jfage, jfgender, jfstatus, jfno) VALUES ('name, age, gender, status, no')



因为SQL将单引号视为字符串分隔符,所以提供了一个字符串参数,并且列出了五个该INSERT列列表。因此错误。

2)您可以通过添加更多单引号来解决此问题:


Because SQL considers single quote as a string delimiter, that is one string parameter supplied, and five listed in the INSERT columns list. Hence the error.
2) You could fix this by adding more single quotes:

INSERT INTO Jodoh (jfname, jfage, jfgender, jfstatus, jfno) VALUES ('"+name+"', '"+age+"', '"+gender+"', '"+status+"', '"+no+"')

会给你更合理的SQL:

Would give you more reasonable SQL:

INSERT INTO Jodoh (jfname, jfage, jfgender, jfstatus, jfno) VALUES ('name', 'age', 'gender', 'status', 'no')

但即使这是一个非常非常糟糕的想法:永远不要连接字符串来构建SQL命令。它让您对意外或故意的SQL注入攻击持开放态度,这可能会破坏您的整个数据库。总是使用参数化查询。



连接字符串时会导致问题,因为SQL会收到如下命令:

But even that is a very, very poor idea: Never concatenate strings to build a SQL command. It leaves you wide open to accidental or deliberate SQL Injection attack which can destroy your entire database. Always use Parameterized queries instead.

When you concatenate strings, you cause problems because SQL receives commands like:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

就SQL而言,用户添加的引号会终止字符串,并且您会遇到问题。但情况可能更糟。如果我来并改为输入:x'; DROP TABLE MyTable; - 然后SQL收到一个非常不同的命令:

The quote the user added terminates the string as far as SQL is concerned and you get problems. But it could be worse. If I come along and type this instead: "x';DROP TABLE MyTable;--" Then SQL receives a very different command:

SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

哪个SQL看作三个单独的命令:

Which SQL sees as three separate commands:

SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全有效的SELECT

A perfectly valid SELECT

DROP TABLE MyTable;

完全有效的删除表格通讯和

A perfectly valid "delete the table" command

--'

其他一切都是评论。

所以它确实:选择任何匹配的行,从数据库中删除表,并忽略其他任何内容。



所以总是使用参数化查询!或者准备好经常从备份中恢复数据库。你定期做备份,不是吗?

And everything else is a comment.
So it does: selects any matching rows, deletes the table from the DB, and ignores anything else.

So ALWAYS use parameterized queries! Or be prepared to restore your DB from backup frequently. You do take backups regularly, don't you?


这篇关于Slexlexception:[Microsoft] [ODBC Microsoft访问驱动程序]查询值和目标字段的数量不一样。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆