player927
萌新第一次写插件,目标是一个Discuz积分转换iConomy的游戏币的,我先写了一个单体转换的命令,涉及4次连接mysql。初始化程序还没做,但是已经有思路了。
但是现在问题是每次都是在导出discuz积分到bal变量的时候就MysqlException跳出了,提示错误了
主文件代码如下:
package org.ucraft;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/


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 org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;


/**
*
* @author S.N.Mendelev
*/
public class main extends JavaPlugin {
FileConfiguration config = getConfig();
    int c=0;
public static void main(String[] ag)
{
}
@Override
public void onEnable(){
getServer().getPluginManager().registerEvents(new MyListener(), this);
config.addDefault("url", "jdbc:mysql://localhost:3306/ultrax");
config.addDefault("prefix", "pre");
config.addDefault("icotab", "iconomy");
config.addDefault("unm", "root");
config.addDefault("password", "root");
config.addDefault("extcredit", "2");
config.options().copyDefaults(true);
saveConfig();
getLogger().info("优快工作室荣誉出品 www.ucraft.org,唯一正版mcbbs账号:player927");
getLogger().info("DirectX积分对iConomy兑换插件已成功加载");
}
@Override
    public void onDisable(){
getLogger().info("积分兑换插件已被卸载。");
}
    @Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
if(cmd.getName().equalsIgnoreCase("xu")){
sender.sendMessage("你的生命中的一秒已经转移给长者!");
c=c+1;
sender.sendMessage("从服务器启动至今,已经有"+String.valueOf(c)+"秒转移给长者");
return true;
}
if(cmd.getName().equalsIgnoreCase("dxico")){
    if (args.length<1){
        sender.sendMessage("错误:没有指定玩家");
        sender.sendMessage("用法:/dxico <你的用户名>");
        return false;
    }
    int uid=-1,row=1+config.getInt("extcredit"),bal=0;
            try{
            Class.forName("com.mysql.jdbc.Driver");
            sender.sendMessage("成功加载MySQL驱动!");
        }catch(ClassNotFoundException e1){
            sender.sendMessage("找不到MySQL驱动!");
        }
        String url;
    url = config.getString("url");
     Connection conn;
     try {
     conn = DriverManager.getConnection(url,  config.getString("unm"),config.getString("password"));
     Statement stmt = conn.createStatement();
     sender.sendMessage("已连接到数据库,准备进行同步...");
     sender.sendMessage("正在匹配你的用户名和uid...");
        String sql = "select * from "+config.getString("prefix")+"_common_member";   
        ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()){
                if(rs.getString(3) == null ? args[0] == null : rs.getString(3).equals(args[0])){
                    uid=rs.getInt(1);
                    break;
                }
            }
            if(uid==-1){
                sender.sendMessage("错误:未找到指定用户");
                return false;
            }
            rs.close();
            stmt.close();
            conn.close();            
     conn = DriverManager.getConnection(url,  config.getString("unm"),config.getString("password"));
     Statement stmta = conn.createStatement();
        String sqln = "select * from "+config.getString("prefix")+"_common_member_count";   
        sender.sendMessage("正在导出你的论坛积分...");
        ResultSet rs1 = stmta.executeQuery(sqln);
            while (rs1.next()){
                if(uid==rs1.getInt(1)){
                    bal=rs1.getInt(row);
                    break;
                }
            }
            rs1.close();
            stmta.close();
            conn.close();   
     conn = DriverManager.getConnection(url,  config.getString("unm"),config.getString("password"));
     Statement stmtb = conn.createStatement();
        String sqlm = "select * from "+config.getString("icotab");   
        ResultSet rs2 = stmta.executeQuery(sqlm);
        sender.sendMessage("正在将论坛积分导入游戏币...");
        String sql2 = "update "+config.getString("icotab")+" set balance=? where username=?";
            PreparedStatement pst = conn.prepareStatement(sql2);
            pst.setString(1,String.valueOf(bal)+".00");
            pst.setString(2,args[0]);
            pst.executeUpdate();        
            rs2.close();
            stmtb.close();
            conn.close();   
     conn = DriverManager.getConnection(url,  config.getString("unm"),config.getString("password"));   
        Statement stmtc = conn.createStatement();
        String sqlp = "select * from "+config.getString("prefix")+"_common_member_count";
        ResultSet rs3 = stmta.executeQuery(sqlp);
        sender.sendMessage("正在将游戏币回导至论坛积分...");
        String sql3 = "update "+config.getString("prefix")+"_common_member_count set extcredits"+config.getInt("extcredit")+"=? where uid=?";
            PreparedStatement pst1 = conn.prepareStatement(sql3);
            pst1.setString(1,String.valueOf(bal));
            pst1.setString(2,String.valueOf(uid));
            pst1.executeUpdate();        
            rs3.close();
            stmtc.close();
            conn.close();   
        sender.sendMessage("转换完成!");
        return true;
     }catch(SQLException e){
         sender.sendMessage("[错误]:与数据库连接异常,请联系服主或技术OP!");
         return false;
     }
}
return false;
}
}
现在是“正在导出你的论坛积分...”显示之后就Exception报错了,("[错误]:与数据库连接异常,请联系服主或技术OP!"),请问这个代码哪里有问题
这是config.yml:
  1. ## YAML Template.
  2. ---
  3. ##你数据库的地址,格式为:"jdbc:mysql://"+你数据库的IP地址+":"+端口号+"/"+数据库名称;
  4. ##默认IP为localhost(本机),端口号3306,数据库名称ultrax。
  5. url: jdbc:mysql://localhost:3306/ultrax
  6. ##你Discuz的数据表名称前缀,一般为pre,如果同一个数据库中运行了多个论坛,请修改
  7. prefix: pre
  8. ##你iconomy插件的表名称,默认是iconomy,参见iconomy的config.yml
  9. icotab: iconomy
  10. ##你MySQL数据库的用户名和密码
  11. unm: root
  12. password: root
  13. ##你discuz对应游戏币的积分编号,默认为2,extcredit几就是几
  14. extcredit: 2
复制代码




2021.12 数据,可能有更多内容萌新第一次写插件,目标是一个Discuz积分转换iConomy的游戏币的,我先写了一个单体转换的命令,涉及4次连接mysql。初始化程序还没做,但是已经有思路了。
但是现在问题是每次都是在导出discuz积分到bal变量的时候就MysqlException跳出了,提示错误了
主文件代码如下:
package org.ucraft;


/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/


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 org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;


/**
*
* @author S.N.Mendelev
*/
public class main extends JavaPlugin {
FileConfiguration config = getConfig();
    int c=0;
public static void main(String[] ag)
{
}
@Override
public void onEnable(){
getServer().getPluginManager().registerEvents(new MyListener(), this);
config.addDefault(&quot;url&quot;, &quot;jdbc:mysql://localhost:3306/ultrax&quot;);
config.addDefault(&quot;prefix&quot;, &quot;pre&quot;);
config.addDefault(&quot;icotab&quot;, &quot;iconomy&quot;);
config.addDefault(&quot;unm&quot;, &quot;root&quot;);
config.addDefault(&quot;password&quot;, &quot;root&quot;);
config.addDefault(&quot;extcredit&quot;, &quot;2&quot;);
config.options().copyDefaults(true);
saveConfig();
getLogger().info(&quot;优快工作室荣誉出品 www.ucraft.org,唯一正版mcbbs账号:player927&quot;);
getLogger().info(&quot;DirectX积分对iConomy兑换插件已成功加载&quot;);
}
@Override
    public void onDisable(){
getLogger().info(&quot;积分兑换插件已被卸载。&quot;);
}
    @Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
if(cmd.getName().equalsIgnoreCase(&quot;xu&quot;)){
sender.sendMessage(&quot;你的生命中的一秒已经转移给长者!&quot;);
c=c+1;
sender.sendMessage(&quot;从服务器启动至今,已经有&quot;+String.valueOf(c)+&quot;秒转移给长者&quot;);
return true;
}
if(cmd.getName().equalsIgnoreCase(&quot;dxico&quot;)){
    if (args.length&lt;1){
  sender.sendMessage(&quot;错误:没有指定玩家&quot;);
  sender.sendMessage(&quot;用法:/dxico &lt;你的用户名&gt;&quot;);
  return false;
    }
    int uid=-1,row=1+config.getInt(&quot;extcredit&quot;),bal=0;
   try{
   Class.forName(&quot;com.mysql.jdbc.Driver&quot;);
   sender.sendMessage(&quot;成功加载MySQL驱动!&quot;);
  }catch(ClassNotFoundException e1){
   sender.sendMessage(&quot;找不到MySQL驱动!&quot;);
  }
  String url;
    url = config.getString(&quot;url&quot;);
  Connection conn;
  try {
  conn = DriverManager.getConnection(url,config.getString(&quot;unm&quot;),config.getString(&quot;password&quot;));
  Statement stmt = conn.createStatement();
  sender.sendMessage(&quot;已连接到数据库,准备进行同步...&quot;);
  sender.sendMessage(&quot;正在匹配你的用户名和uid...&quot;);
  String sql = &quot;select * from &quot;+config.getString(&quot;prefix&quot;)+&quot;_common_member&quot;;   
  ResultSet rs = stmt.executeQuery(sql);
   while (rs.next()){
    if(rs.getString(3) == null ? args[0] == null : rs.getString(3).equals(args[0])){
  uid=rs.getInt(1);
  break;
    }
   }
   if(uid==-1){
    sender.sendMessage(&quot;错误:未找到指定用户&quot;);
    return false;
   }
   rs.close();
   stmt.close();
   conn.close();   
  conn = DriverManager.getConnection(url,config.getString(&quot;unm&quot;),config.getString(&quot;password&quot;));
  Statement stmta = conn.createStatement();
  String sqln = &quot;select * from &quot;+config.getString(&quot;prefix&quot;)+&quot;_common_member_count&quot;;   
  sender.sendMessage(&quot;正在导出你的论坛积分...&quot;);
  ResultSet rs1 = stmta.executeQuery(sqln);
   while (rs1.next()){
    if(uid==rs1.getInt(1)){
  bal=rs1.getInt(row);
  break;
    }
   }
   rs1.close();
   stmta.close();
   conn.close();   
  conn = DriverManager.getConnection(url,config.getString(&quot;unm&quot;),config.getString(&quot;password&quot;));
  Statement stmtb = conn.createStatement();
  String sqlm = &quot;select * from &quot;+config.getString(&quot;icotab&quot;);   
  ResultSet rs2 = stmta.executeQuery(sqlm);
  sender.sendMessage(&quot;正在将论坛积分导入游戏币...&quot;);
  String sql2 = &quot;update &quot;+config.getString(&quot;icotab&quot;)+&quot; set balance=? where username=?&quot;;
   PreparedStatement pst = conn.prepareStatement(sql2);
   pst.setString(1,String.valueOf(bal)+&quot;.00&quot;);
   pst.setString(2,args[0]);
   pst.executeUpdate(); 
   rs2.close();
   stmtb.close();
   conn.close();   
  conn = DriverManager.getConnection(url,config.getString(&quot;unm&quot;),config.getString(&quot;password&quot;));   
  Statement stmtc = conn.createStatement();
  String sqlp = &quot;select * from &quot;+config.getString(&quot;prefix&quot;)+&quot;_common_member_count&quot;;
  ResultSet rs3 = stmta.executeQuery(sqlp);
  sender.sendMessage(&quot;正在将游戏币回导至论坛积分...&quot;);
  String sql3 = &quot;update &quot;+config.getString(&quot;prefix&quot;)+&quot;_common_member_count set extcredits&quot;+config.getInt(&quot;extcredit&quot;)+&quot;=? where uid=?&quot;;
   PreparedStatement pst1 = conn.prepareStatement(sql3);
   pst1.setString(1,String.valueOf(bal));
   pst1.setString(2,String.valueOf(uid));
   pst1.executeUpdate(); 
   rs3.close();
   stmtc.close();
   conn.close();   
  sender.sendMessage(&quot;转换完成!&quot;);
  return true;
  }catch(SQLException e){
   sender.sendMessage(&quot;[错误]:与数据库连接异常,请联系服主或技术OP!&quot;);
   return false;
  }
}
return false;
}
}现在是“正在导出你的论坛积分...”显示之后就Exception报错了,(&quot;[错误]:与数据库连接异常,请联系服主或技术OP!&quot;),请问这个代码哪里有问题
这是config.yml:

代码:

  1. ## YAML Template.
  2. ---
  3. ##你数据库的地址,格式为:"jdbc:mysql://"+你数据库的IP地址+":"+端口号+"/"+数据库名称;
  4. ##默认IP为localhost(本机),端口号3306,数据库名称ultrax。
  5. url: jdbc:mysql://localhost:3306/ultrax
  6. ##你Discuz的数据表名称前缀,一般为pre,如果同一个数据库中运行了多个论坛,请修改
  7. prefix: pre
  8. ##你iconomy插件的表名称,默认是iconomy,参见iconomy的config.yml
  9. icotab: iconomy
  10. ##你MySQL数据库的用户名和密码
  11. unm: root
  12. password: root
  13. ##你discuz对应游戏币的积分编号,默认为2,extcredit几就是几
  14. extcredit: 2




player927
本帖最后由 player927 于 2017-9-3 18:35 编辑

20查看0回复惨案,求人回答。。。帮我解决问题我立马给2人气+20金粒,决不食言

JackC92
你这个代码有点长= =不太好看(懒),你可以试试先自己进行调试,一部分一部分的执行,看看哪里出了问题。

a8105
完整贴出报错
以及你需要复习下如何查看报错

wt6654499
那我消灭一下零回复吧。。。。。

ddyy163
本帖最后由 ddyy163 于 2017-9-13 15:07 编辑

public class main extends JavaPlugin throws SQLException{
……
}

然后去掉  有SQLException的代码块的trycatch
让服务器自己打印报错,不然你都不知道到底哪里有问题

要学会调试

贪食狐
你你为何不试试sqlibrary呢。。

第一页 上一页 下一页 最后一页