描述:

1.最近在使用Java调用cmd指令执行sqlplus 运行sql文件初始化Oracle数据库时遇到了一个编码问题,目前暂时还未找到处理方法,此处先行记录下,后续找到了解决方法,再进行完善。

测试记录:

plsql运行指令窗口执行sql文件,数据库数据不乱吗

dos下执行sqlplus运行sql文件,数据库数据乱码

Java调用cmd执行,乱码。

尝试过的解决方案:

修改环境变量调整NLS_LANGUAGE的值,但是乱码还是存在

http://itnoteshare.com/note/263/publicNoteDetail.htm

以下是Java调用cmd指令初始化数据库的代码:

public void initPureDatabase(String driver,String url,String username,String password,String sid) {
		Connection conn = null;
		try {
			conn = DBUtil.getConnection(driver,url,username,password);
			//清理数据库
			//clearDatabase(conn);
			//调用指令执行初始化数据
			String currPath = OraDatabaseServiceImpl.class.getResource ("").getFile ();
			currPath = currPath.substring(1, currPath.length());
			currPath = currPath.replace("services/impl/", "files/initpure");
			File file = new File(currPath);
			File[] files = file.listFiles();
			String urlPath = url.substring(url.indexOf("@") + 1);
			urlPath = urlPath.replaceAll(":", "/");
			urlPath = urlPath.replaceFirst("/", ":");
			//sqlplus U_PURE_TEST02/U_PURE_TEST02@127.0.0.1.168.3.80:1521/orcl @D:\eclipseWork\platform-web-new\src\main\webapp\WEB-INF\classes\com\szboanda\common\kit\dba\files\initpure\INITBASE.sql > d:/test.log
			String cmd="sqlplus " + username + "/" + password + "@" + urlPath + " @";
			for (File file2 : files) {
				String filePath = file2.getAbsolutePath();
				cmd = cmd + filePath + " > d:/test.log";
				System.out.println(cmd);
				Runtime run =Runtime.getRuntime();
				run.exec(cmd);
			}
		    conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(null != conn){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

2.后续改变了方案换用ibatis提供的一个jar来执行脚本,没有乱码问题,以下是测试代码:需要下载jar包ibatis-common-2.jar

package com.noteshare.spider.common.util;

import java.sql.Connection;

import com.ibatis.common.jdbc.ScriptRunner;
import com.ibatis.common.resources.Resources;
import com.noteshare.utils.DBUtil;

public class DrTest {
	public static void main(String[] args) {
		try {
			Connection conn = DBUtil.getConnection();
			ScriptRunner runner = new ScriptRunner(conn, false, false);
			runner.runScript(Resources.getResourceAsReader("INITBASE.sql"));
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

==========================================

后续在使用ibatis执行脚本时发现以上代码对sqlserver不兼容,可能是没用心去找他兼容的写法后续换了一个jar包来解决的 

具体方式如下:

替换使用如下jar

<dependency>  
         <groupId>org.mybatis</groupId>  
         <artifactId>mybatis</artifactId>  
         <version>3.3.0</version>  
</dependency>
示例代码:

package com.yhxy.vdc.dbcp.util;  
  
import java.io.BufferedReader;  
import java.io.BufferedWriter;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileWriter;  
import java.io.InputStreamReader;  
import java.io.Reader;  
import java.io.UnsupportedEncodingException;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.SQLPermission;  
  
import org.apache.ibatis.jdbc.ScriptRunner;  
import org.apache.log4j.Logger;  
  
  
public class DbUtil {  
  
    private static Logger LOG =Logger.getLogger(DbUtil.class.getName());  
      
    /** 
     *  
     * @param ip 
     * @param port 
     * @param userName 
     * @param pwd 
     * @param sqlFilePath 
     * @throws Exception  
     */  
    public static void execSqlFileByMysql(String ip,String port,String userName,String pwd,String sqlFilePath) throws Exception{  
          
        String driver = "com.mysql.jdbc.Driver";  
        String url = "jdbc:mysql://"+ip+":"+port;  
          
        Exception error = null;  
        Connection conn = null;  
        try {  
            Class.forName(driver);  
            conn = DriverManager.getConnection(url, userName, pwd);  
            ScriptRunner runner = new ScriptRunner(conn);  
            //下面配置不要随意更改,否则会出现各种问题  
            runner.setAutoCommit(true);//自动提交  
            runner.setFullLineDelimiter(false);  
            runner.setDelimiter(";");////每条命令间的分隔符  
            runner.setSendFullScript(false);  
            runner.setStopOnError(false);  
        //  runner.setLogWriter(null);//设置是否输出日志  
            //如果又多个sql文件,可以写多个runner.runScript(xxx),  
            runner.runScript(new InputStreamReader(new FileInputStream(sqlFilePath),"utf-8"));  
            close(conn);  
        } catch (Exception e) {  
            LOG.error("执行sql文件进行数据库创建失败....",e);  
            error = e;  
        }finally{  
            close(conn);  
        }  
        if(error != null){  
            throw error;  
        }  
    }  
      
      
    public static void execSqlFileBySqlserver(String ip,String port,String userName,  
            String pwd,String sqlFilePath,String dbName) throws Exception{  
        String driver = "net.sourceforge.jtds.jdbc.Driver";  
        String url = "jdbc:jtds:sqlserver://"+ip+":"+port;  
          
          
          
        Exception error = null;  
        Connection conn = null;  
        try {  
            replaceAndCreate(f1,f2,oldDbName,newDbName);  
              
            Class.forName(driver);  
            conn = DriverManager.getConnection(url, userName, pwd);  
            ScriptRunner runner = new ScriptRunner(conn);  
            //下面的配置,不要随意更改,否则导致各种问题  
            runner.setAutoCommit(true);//自动提交  
            runner.setFullLineDelimiter(true);  
            runner.setDelimiter("GO");//每条命令间的分隔符  
            runner.setSendFullScript(false);  
            runner.setStopOnError(false);  
    //      runner.setLogWriter(null);//设置是否输出日志  
            //如果又多个sql文件,可以写多个runner.runScript(xxx),  
            runner.runScript(new InputStreamReader(new FileInputStream(sqlFilePath),"utf8"));  
              
        } catch (Exception e) {  
            LOG.error("执行sql文件进行数据库创建失败....",e);  
            error = e;  
        }finally{  
            close(conn);  
            //删除文件  
            deleteFile(f2);  
        }  
          
        if(error != null){  
            throw error;  
        }  
    }  
      
    private static void close(Connection conn){  
        try {  
            if(conn != null){  
                conn.close();  
            }  
        } catch (Exception e) {  
            if(conn != null){  
                conn = null;  
            }  
        }  
    }  
}  









作者:星辰 时间:2017-02-09 浏览 1101评论 0 赞 0砸 0 标签: oracle 数据库编程
评论
还可以再输入500个字

请您注意

·自觉遵守:爱国、守法、自律、真实、文明的原则
·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·您在NoteShare上发表的作品,NoteShare有权在网站内保留、转载、引用或者删除
·参与本评论即表明您已经阅读并接受上述条款