使用java和SQL查询INSERT INTO将新记录插入MS访问[关闭]
Posted
技术标签:
【中文标题】使用java和SQL查询INSERT INTO将新记录插入MS访问[关闭]【英文标题】:INSERT new record into MS access using java and SQL query INSERT INTO [closed] 【发布时间】:2013-01-10 10:08:10 【问题描述】:我想添加一条新记录来访问数据库,但是 SQL 查询没有应用它,这是我要添加数据的代码!!
public void actionPerformed(ActionEvent e)
JButton b=(JButton)e.getSource();
if(b==c.t.addR)
String aa=Integer.toString(55);
String t=c.t.titlefield.getText();
String d=c.t.datefield.getText();
String p=c.t.progressfield.getText();
String pr=c.t.priorityfield.getText();
String s="Open";
System.out.println(t+"\t"+d+"\t"+p+"\t"+pr+"\t"+s); //error is here
try
c.b.st.executeQuery("INSERT into Records (TaskID,Title,Deadline,Progress,Priority,Status) VALUES("+aa+"','"+t+"','"+d+"','"+p+"','"+pr+"','"+s+")");
catch (SQLException e1)
// TODO Auto-generated catch block
e1.printStackTrace();
这是我遇到的错误
java.sql.SQLException: [Microsoft][ODBC Microsoft Access 驱动程序] 查询表达式中的语法错误(缺少运算符) '55','a','1','1','high','Open'。在 sun.jdbc.odbc.JdbcOdbc.createSQLException(未知来源)在 sun.jdbc.odbc.JdbcOdbc.standardError(未知来源)在 sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(未知来源)在 sun.jdbc.odbc.JdbcOdbcStatement.execute(未知来源)在 sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(未知来源)在 Listener.actionPerformed(Listener.java:27) 在 javax.swing.AbstractButton.fireActionPerformed(未知来源)在 javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)在 javax.swing.DefaultButtonModel.setPressed(未知来源)在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 来源)在 java.awt.AWTEventMulticaster.mouseReleased(未知来源) 在 java.awt.Component.processMouseEvent(Unknown Source) 在 javax.swing.JComponent.processMouseEvent(未知来源)在 java.awt.Component.processEvent(未知来源)在 java.awt.Container.processEvent(未知来源)在 java.awt.Component.dispatchEventImpl(未知来源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源)在 java.awt.LightweightDispatcher.processMouseEvent(未知来源)在 java.awt.LightweightDispatcher.dispatchEvent(未知来源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Window.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.EventQueue.dispatchEventImpl(未知来源)在 java.awt.EventQueue.access$400(未知来源)在 java.awt.EventQueue$2.run(Unknown Source) at java.awt.EventQueue$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.AccessControlContext$1.doIntersectionPrivilege(未知 来源)在 java.security.AccessControlContext$1.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue$3.run(未知源)在 java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.AccessControlContext$1.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue.dispatchEvent(未知源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在 java.awt.EventDispatchThread.run(未知来源)
【问题讨论】:
"...VALUES("+aa+"','"+t+"','"+d+"','"+p+"','"+pr+"','"+s+")"
请让我为你扩展一下:"...VALUES(aaa', 'ttt', 'ddd', 'ppp', 'prpr', 'ss)
你觉得这很奇怪吗?
您的代码对 SQL 攻击不安全。利用PreparedStatement
缓解SQL 注入。
【参考方案1】:
错误必须发生在这一行:
c.b.st.executeQuery("INSERT into Records (TaskID,Title,Deadline,Progress,Priority,Status) VALUES("+aa+"','"+t+"','"+d+"','"+p+"','"+pr+"','"+s+")");
看看它,是因为你的参数周围没有开始和结束引号吗?试试:
c.b.st.executeQuery("INSERT into Records (TaskID,Title,Deadline,Progress,Priority,Status) VALUES('"+aa+"','"+t+"','"+d+"','"+p+"','"+pr+"','"+s+"')");
【讨论】:
谢谢,,,错误删除,但是我面临的另一个小问题,,,我必须手动设置“TaskID”,这是我的主键,我希望它是自动的生成,所以我在java中选择了它的类型,为“AutoNumber”,,,,但是当我跳过“TaskID”时,生成的错误说“主键不能为空”请提出解决方案!!!跨度> @MasoodFarooq 应该在 Access 中而不是在 java 中设置为自动编号。 你介意与我分享 ms.access 到 java 库吗?我想我要试试你箱子里最小的那个。 @MasoodFarooq以上是关于使用java和SQL查询INSERT INTO将新记录插入MS访问[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Access 2003中的SQL:INSERT INTO和多个SELECT查询
MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢