问题是:
无法从表中获取刚刚插入的数据。从错误消息看起来它看不到第一列。我知道列就在那里并插入了数据。我检查了数据库。我检查了列Number
是否在名称中有一些隐藏空格。不,它没有。
尝试: 调试每一行,一切都很好,同时将数据插入数据库。 发现问题几乎就在代码的末尾:
rs1.next();
String s1 = rs1.getString(1);
我试着写
rs1.first();
String s1 = rs1.getString(1);
或
rs1.first();
String s1 = rs1.getString("Number");
下面我发布了正常工作的最终代码,我可以将数据插入表格并显示在浏览器上。
package mypackage;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.LinkedList;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
@Path("/query")
public class CList {
private LinkedList<SMember> contacts;
public CList() {
contacts = new LinkedList();
}
@GET
@Path("/{CList}")
public Response addCLocation(@QueryParam("employeeId") String eId) throws SQLException{
String dataSourceName = "DBname";
String dbURL = "jdbc:mysql://localhost:3306/" + dataSourceName;
String result = "";
Connection con = null;
PreparedStatement ps0 = null, ps = null;
ResultSet rs = null, rs1 = null;
String id = eId;
try {
try{
//Database Connector Driver
Class.forName("com.mysql.jdbc.Driver");
//Connection variables: dbPath, userName, password
con = (Connection)
DriverManager.getConnection(dbURL,"someusername","somepassword");
System.out.println("We are connected to database");
//SQL Statement to Execute
System.out.print(id);
s = con.prepareStatement("SELECT 1 FROM CList WHERE Number=?");
s.setString(1, eId);
rs = s.executeQuery();
//Parse SQL Response
if(!rs.next()) {
SMember sm = new SMember();
ps = (PreparedStatement) con.prepareStatement("INSERT
INTO Contact_List (Number, First_Name, Last_Name, Phone_Number) " +
"VALUES (?,?,?,?)");
ps.setString(1,sm.getEmployeeID());
ps.setString(2,sm.getFirstName());
ps.setString(3,sm.getLastName());
ps.setString(4,sm.getPhone());
ps.executeUpdate();
ps = con.prepareStatement("SELECT Number, First_Name,
Last_Name, Phone_Number FROM CList
WHERE Number=" + eId);
rs1 = ps.executeQuery();
while(rs1.next()){
result = "[Added contact to contact list.
Number: " + rs1.getString(1) +
"][First_Name: " + rs1.getString(2) +
"][Last_name: " + rs1.getString(3) +
"][Phone_Number: " + rs1.getString(4) +
"]\n";
}
}
else {
result = "[Contact is already on the list]";
}
}
catch(Exception e) {
System.out.println("Can not connect to database");
e.printStackTrace();
}
finally {
//Close Database Connection
ps0.close();
ps.close();
con.close();
}
}
catch(Exception e) {
System.out.println(e);
}
//Return the Result to Browser
return Response.status(1000).entity(result).build();
}
表格
1234号码是唯一的,这是我想要的号码。
您会看到号码应该是唯一的。到目前为止,我正在从SMember类中获取数据,并且它总是使相同数据不相关。我的问题的目的只是为了解决我几秒钟前插入的信息。
此外,还有SMember类,我没有在这里发布,在其构造函数中我初始化了数字,名字,姓氏和电话号码。测试目的。 我提出了所有建议的更改,但问题仍然存在。
答案 0 :(得分:1)
您收到此错误是因为您的第一个查询错误,它返回一个空的结果集。
首先,
rs = s.executeQuery("SELECT 1 FROM CList WHERE Number='id'");
您的代码中的上述行不正确它应该是这样的:
**rs = s.executeQuery("SELECT 1 FROM CList WHERE Number="+id);**
然后将向数据库触发正确的查询。
其次,以下代码存在问题
if(rs.next() == false) {
SMember sm = new SMember();
ps = (PreparedStatement) con.prepareStatement("INSERT
INTO CList (Number, First_Name, Last_Name,
Phone_Number) VALUES ('"+sm.getEmployeeID()+"',
'"+sm.getFirstName()+"', '"+sm.getLastName()+"',
'"+sm.getPhone()+"')",
Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
在上面的代码中,您应该初始化SMember,当前在查询中的对象它们将变为null也是当您使用PreparedStatement时,您应该使用如下查询:
**ps = (PreparedStatement) con.prepareStatement("INSERT INTO CList (Number, First_Name, Last_Name,Phone_Number) VALUES (?,?,?,?)",Statement.RETURN_GENERATED_KEYS);
ps.setString(1,sm.getEmployeeID());
ps.setString(2,sm.getFirstName());
ps.setString(3,sm.getLastName());
ps.setString(4,sm.getPhoneNumber());**
答案 1 :(得分:1)
Query语句可能是一个问题“SELECT 1 FROM CList WHERE Number ='id'”,在select语句中,您的id被视为String.we需要替换为value。
- &gt;尝试这样{“SELECT 1 FROM CList WHERE Number =”+ id},
- &gt;还有一件事“从表名中选择1”将打印1,因为没有符合您条件的行。
所以我的建议是
{"SELECT * FROM CList WHERE Number="+id}
试试这个!!
答案 2 :(得分:1)
这里有几个问题。
您的问题的解决方案是您不让数据库生成密钥,这就是您以后无法请求生成密钥的原因。
查看代码的这一行:
ps = (PreparedStatement) con.prepareStatement("INSERT INTO CList (Number, First_Name, Last_Name, Phone_Number) VALUES ('"+sm.getEmployeeID()+"', '"+sm.getFirstName()+"', '"+sm.getLastName()+"', '"+sm.getPhone()+"')", Statement.RETURN_GENERATED_KEYS);
您稍后想要将Number
列的值检索为生成的密钥。但是,您确实传递了该列的值,即sm.getEmployeeID()
的返回值。如果传递一个值,它将不会生成(假设此列在数据库中定义为自动递增。
然而,修复此问题并不能解决所有问题,因为您的代码存在很多问题。让我列出我可以直接发现的那些:
INSERT INTO CList (Number, First_Name, Last_Name,Phone_Number) VALUES (?,?,?,?)
之类的固定字符串,而不是像执行它一样创建查询字符串,然后在执行它之前在语句上设置值。这样一来,没有人可以通过该语句弄乱你的数据库(阅读SQL注入,只是google它以查看你将要介绍的问题)。eId
参数。您也应该在select语句中使用它来查看它是否已经存在于您的数据库中(此处也使用预准备语句),以及稍后当id尚未存在于数据库中时的insert语句中。编辑:由于你的代码有点混乱,我已经清理了一下这个东西并修复了我可以直接找到的问题。检查这是否对您有所帮助:
public Response addCLocation(String eId) throws SQLException {
String dataSourceName = "DBname";
String dbURL = "jdbc:mysql://localhost:3306/" + dataSourceName;
String result = "";
Connection con = null;
Statement s = null;
PreparedStatement ps = null;
ResultSet rs = null, rs1 = null;
String id = eId;
try {
try {
// Database Connector Driver
Class.forName("com.mysql.jdbc.Driver");
// Connection variables: dbPath, userName, password
con = DriverManager.getConnection(dbURL, "someusername", "somepassword");
System.out.println("We are connected to database");
s = con.createStatement();
// SQL Statement to Execute
System.out.print(id);
PreparedStatement alreadyThere = con.prepareStatement("SELECT 1 FROM CList WHERE Number = ?");
alreadyThere.setString(1, eId);
System.out.println("0");
// Parse SQL Response
int i = 0;
if (rs.next() == false) {
SMember sm = new SMember();
ps = con
.prepareStatement("INSERT INTO Contact_List (Number, First_Name, Last_Name, Phone_Number) VALUES (?,?,?,?)");
ps.setString(1, sm.getEmployeeID());
ps.setString(2, sm.getFirstName());
ps.setString(3, sm.getLastName());
ps.setString(4, sm.getPhone());
ps.executeUpdate();
}
else {
result = "[Contact is already on the list]";
}
}
catch (Exception e) {
System.out.println("Can not connect to database");
e.printStackTrace();
}
finally {
// Close Database Connection
s.close();
ps.close();
con.close();
}
}
catch (Exception e) {
System.out.println(e);
}
// Return the Result to Browser
return Response.status(200).entity(result).build();
}
答案 3 :(得分:0)
“SELECT 1 FROM CList WHERE Number ='id'”
看起来您正在尝试实际选择Number值为'id'的记录。当您尝试对空结果集执行“rs.next()”命令时,这可能会导致错误。您是否正在尝试执行类似
的操作“SELECT 1 FROM CList WHERE Number ='”。 ID 。 “'”? “id”是变量吗?