这个Java JDBC程序有什么问题?
这个Java JDBC程序有什么问题 我已经编写了一个方法,它接受一个ResultSet并打印它的所有记录 我的SQL查询是:这个Java JDBC程序有什么问题?,java,mysql,sql,database,jdbc,Java,Mysql,Sql,Database,Jdbc,这个Java JDBC程序有什么问题 我已经编写了一个方法,它接受一个ResultSet并打印它的所有记录 我的SQL查询是: Set @counter := 0, @counterQty := 0, @counterAvb := 0, @counterIss := 0, @counterRep := 0 ,@counterDes := 0; Select * From (SELECT (Select (@counter := (@counter + 1) ) ) 'Sr.No.
Set @counter := 0, @counterQty := 0, @counterAvb := 0, @counterIss := 0, @counterRep := 0 ,@counterDes := 0;
Select *
From (SELECT
(Select (@counter := (@counter + 1) ) ) 'Sr.No.',
testt.BookName,
testt.BookQty,
testt.Code,
testt.Available,
testt.Issued,
testt.Repair,
testt.Destroyed,
(@counterQty := @counterQty + testt.BookQty ) TotalQty,
(@counterAvb := @counterAvb + testt.Available ) TotalAvb,
(@counterIss := @counterIss + testt.Issued ) TotalIss,
(@counterRep := @counterRep + testt.Repair ) TotalRep,
(@counterDes := @counterDes + testt.Destroyed ) TotalDest
From (Select a.b_name BookName, a.b_qty BookQty, a.b_acc_id Code,
SUM(case when b.status='A' then 1 else 0 end) as Available,
SUM(case when b.status='I' then 1 else 0 end) as Issued,
SUM(case when b.status='R' then 1 else 0 end) as Repair,
SUM(case when b.status='D' then 1 else 0 end) as Destroyed
From tbl_book_info a left join tbl_books b on a.b_acc_id = b.accid
GROUP BY a.b_name, a.b_qty, a.b_acc_id order by a.b_acc_id
)testt
)Main;
当我在MySQL Workbench中执行此查询时,它返回:
+--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+
| Sr.No. | BookName | BookQty | Code | Available | Issued | Repair | Destroyed | TotalQty | TotalAvb | TotalIss | TotalRep | TotalDest |
+--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+
| 1 | Java book | 3 | 10001 | 0 | 0 | 1 | 2 | 3 | 0 | 0 | 1 | 2 |
| 2 | Cpp Book | 5 | 10002 | 3 | 1 | 0 | 1 | 8 | 3 | 1 | 1 | 3 |
| 3 | Cpp 1.17 | 5 | 10003 | 3 | 1 | 0 | 1 | 13 | 6 | 2 | 1 | 4 |
| 4 | Visual Basic | 4 | 10004 | 4 | 0 | 0 | 0 | 17 | 10 | 2 | 1 | 4 |
+--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+
4 rows in set (0.25 sec)
但当我在Java中执行此查询并打印ResultSet的所有数据时,它会返回如下结果:
1 2 3 4 5 6 7 8 9 10 11 12 13
+--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+
| Sr.No. | BookName | BookQty | Code | Available | Issued | Repair | Destroyed | TotalQty | TotalAvb | TotalIss | TotalRep | TotalDest |
+--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+
0 Cpp 1.17 5 10003 3 1 0 1 0 0 0 0 0
0 Cpp Book 5 10002 3 1 0 1 0 0 0 0 0
0 Java book 3 10001 0 0 1 2 0 0 0 0 0
0 Visual Basic 4 10004 4 0 0 0 0 0 0 0 0
+--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+
我的问题是:
为什么第1、9、10、11、12和13列为零(0)
表结构
我的打印代码:
Connection con = getDbConnObj();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery( sql );
printRsLast(rs);
public void printRsLast(ResultSet rs){
/* +---1----+-----2--------+----3----+--4----+-----5-----+----6---+---7----+-----8-----+-----9----+----10----+----11----+----12----+-----13----+
| Sr.No. | BookName | BookQty | Code | Available | Issued | Repair | Destroyed | TotalQty | TotalAvb | TotalIss | TotalRep | TotalDest |
rs= +--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+
| 1 | Java book | 3 | 10001 | 1 | 0 | 0 | 2 | 3 | 1 | 0 | 0 | 2 |
|...........................................................................................................................................|
|...........................................................................................................................................|
|...........................................................................................................................................|
+--------+--------------+---------+-------+-----------+--------+--------+-----------+----------+----------+----------+----------+-----------+ */
String separator = " ";
try{
rs.beforeFirst();
int n=0;
p("$$$ RS Attr. are : \n\n Sr.No. | BookName | BookQty | Code | Available | Issued | Repair | Destroyed | TotalQty | TotalAvb | TotalIss | TotalRep | TotalDest , Row are...\n");
while(rs.next()){
n++;
String nm , m;
m = rs.getInt(1)+ separator + rs.getString(2)+ separator + rs.getInt(3)+ separator + rs.getInt(4)+ separator + rs.getInt(5)+ separator + rs.getInt(6)+ separator + rs.getInt(7)+ separator + rs.getInt(8)+ separator + rs.getInt(9)+ separator +
rs.getInt(10)+ separator + rs.getInt(11)+ separator + rs.getInt(12)+ separator + rs.getInt(13);
p(m+"\n");
}
p("\nTotal Rows = "+n);
} catch(Exception e){
p("\n!!! Excep in 'printRsLast(ResultSet rs), msg = '"+e.getMessage());
}
}
public Connection getDbConnObj() {
// Creating 'Connection' class' Reference Variable ...
Connection con = null;
String url = "jdbc:mysql://localhost:3306/librarydb";
String dbUname = "root";
String dbPass = "";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection(url, dbUname, dbPass);
} catch (Exception e) {
con = null;
} finally {
return con;
}
}
这两件事我都试过了
(一)
(二)
但不幸的是,这两种方法都不适用于我……您没有向我们展示如何在Java代码中构造字符串
sql
,因此我不得不猜测
似乎sql
包含了从Select*
开始的查询,没有行Set@counter:=0…
。如果我将sql
设置为该值,我就能够重现您的输出。也许您也尝试过将Set
行放入查询中,结果生成了一个错误,所以您将其取出了
您需要做的是执行Set@counter:=0…
行,然后运行查询。换言之,替换这些行
Connection con = getDbConnObj();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery( sql );
printRsLast(rs);
与
我对您的代码进行了此修改,它生成了您想要的输出。您没有向我们展示如何在Java代码中构造字符串
sql
,因此我不得不猜测
似乎sql
包含了从Select*
开始的查询,没有行Set@counter:=0…
。如果我将sql
设置为该值,我就能够重现您的输出。也许您也尝试过将Set
行放入查询中,结果生成了一个错误,所以您将其取出了
您需要做的是执行Set@counter:=0…
行,然后运行查询。换言之,替换这些行
Connection con = getDbConnObj();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery( sql );
printRsLast(rs);
与
我对您的代码进行了此修改,它生成了您想要的输出。请提供您的Java代码的详细信息。例如,Java代码中缺少查询,这可能就是问题所在。这个问题很可能是因为你使用了变量。我无法用一个简化的例子重现你的问题。对我来说很好。正如@Mark所说,请用a来回答你的问题。如果我提供的答案不起作用,请解释为什么不起作用。它是否给出了错误的结果(如果是,结果是什么)?它是否给出了异常(如果是,是什么异常,堆栈跟踪是什么)?是否发生了其他事情,如果是,发生了什么?简单地说“它不工作”并不能帮助我帮助你。请提供一个Java代码的示例。例如,Java代码中缺少查询,这可能就是问题所在。这个问题很可能是因为你使用了变量。我无法用一个简化的例子重现你的问题。对我来说很好。正如@Mark所说,请用a来回答你的问题。如果我提供的答案不起作用,请解释为什么不起作用。它是否给出了错误的结果(如果是,结果是什么)?它是否给出了异常(如果是,是什么异常,堆栈跟踪是什么)?是否发生了其他事情,如果是,发生了什么?简单地说“它不起作用”对我帮助你没有帮助。。。。请记住在打开连接时启用
allowmultiquerys
。@GordThompson:我不需要这样做。您认为我为什么会这样做?因为如果我将allowmultiquerys
保留为其默认值(false),则my将失败。(IIRC,这是一个SQL语法错误。)@GordThompson:我尝试在测试代码中放入allowMultiQueries
,并组合两个SQL字符串,但这给了我一个错误ResultSet is from UPDATE。没有数据。
。我不知道getmoresults()
方法,它可能已经修复了这个错误。然而,这种方法可能是JDBCAPI中更“奇特”的一部分,考虑到询问者似乎对JDBC没有太多的经验,可能最好还是坚持使用“核心”API,我在回答中尝试过这样做。。。。请记住在打开连接时启用allowmultiquerys
。@GordThompson:我不需要这样做。您认为我为什么会这样做?因为如果我将allowmultiquerys
保留为其默认值(false),则my将失败。(IIRC,这是一个SQL语法错误。)@GordThompson:我尝试在测试代码中放入allowMultiQueries
,并组合两个SQL字符串,但这给了我一个错误ResultSet is from UPDATE。没有数据。
。我不知道getmoresults()
方法,它可能已经修复了这个错误。然而,这种方法可能是JDBCAPI中更“奇特”的一部分,考虑到询问者似乎对JDBC没有太多的经验,可能最好还是坚持使用“核心”API,我在回答中尝试过这样做。
sql = "Set @counter := 0...
....
....
)Main;"
rs = st.executeQuery(sql); // Executing these Entire Stmt to get the Tabular Data...
printRsLast(rs);
Connection con = getDbConnObj();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery( sql );
printRsLast(rs);
Connection con = getDbConnObj();
Statement st = con.createStatement();
st.execute("Set @counter := 0 ...");
ResultSet rs = st.executeQuery( sql );
printRsLast(rs);