把文件存入数据库的问题

fskjb01 2009-11-07 11:25:29
我想把一个文件存入数据库代码如下:

public void saveArticles(){
checkConn();
String sql="insert into articles (article,time,zuoze) values(?,?,?)";
System.out.println(new Date().getTime());

File f=new File("src/net/BaseDao.java");
Reader rd=null;
try {
rd=new BufferedReader(new FileReader(f));

} catch (FileNotFoundException e) {
e.printStackTrace();
}

int num=exeUpdt(sql, new Object[]{rd,new java.sql.Timestamp(new Date().getTime()),"bbs02"});
if(num==1){
System.out.println("成功传入了一条数据");
}else{
System.out.println("插入失败!");
}

closer();
}


exeUpdt方法代码如下:

public int exeUpdt(String sql,Object[] params){
int count=0;
try {
pstmt= conn.prepareStatement(sql);
if(params !=null){
for(int i=0;i<params.length;i++){
if(params[i] instanceof Reader){
pstmt.setCharacterStream(i+1, (Reader) params[i]);
continue;
}
pstmt.setObject(i+1, params[i]);

}
}
count= pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}

return count;
}

pstmt.setCharacterStream(i+1, (Reader) params[i])
在JUNIT4测试时不通过pstmt.setCharacterStream(i+1, (Reader) params[i]);

java.lang.AbstractMethodError: net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setCharacterStream(ILjava/io/Reader;)V
at net.BaseDao.exeUpdt(BaseDao.java:48)
at net.Manager.saveArticles(Manager.java:114)
at test.ManageTest.saveTest(ManageTest.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

请问该如何修改呢
...全文
104 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjun88019014 2009-11-07
  • 打赏
  • 举报
回复
对于大文本串全部的读或者取,全部使用InputStream字节流,不要使用Reader字符流,

字节流是通用的
wifewifewife 2009-11-07
  • 打赏
  • 举报
回复

net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setCharacterStream(ILjava/io/Reader;)V

是不是类型转换错误?
swandragon 2009-11-07
  • 打赏
  • 举报
回复
调试一下程序,看看
pstmt.setCharacterStream(i+1, (Reader) params[i]);
97095639 2009-11-07
  • 打赏
  • 举报
回复
字符格式问题 setCharacterStream
whut0802 2009-11-07
  • 打赏
  • 举报
回复

public class IniTest {
private Connection conn;
private Statement st;
private PreparedStatement pstatement;
private String driver;
private String url;
private String user;
private String password;

public void initParma(String paramFile) {
Properties pro = new Properties();
try {
pro.load(new FileInputStream(paramFile));
driver = pro.getProperty("driver");
url = pro.getProperty("url");
password = pro.getProperty("password");
user = pro.getProperty("user");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public void createTable() {
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
File file = new File("d:/1.txt");
FileInputStream fis = new FileInputStream(file);
pstatement = conn.prepareStatement("insert into text_table values(null,?,?)");
pstatement.setString(1, "书名");
pstatement.setBinaryStream(2, fis, (int) file.length());
int count=pstatement.executeUpdate();
System.out.println("插入了"+count+"条数据");

}

catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

finally {
if (pstatement != null) {
try {
pstatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

public static void main(String[] args) {
IniTest iniTest = new IniTest();
iniTest.initParma("d:/mysql.ini");
iniTest.createTable();
}

}

属性文件mysql.ini没有给出
Jamin_Ma 2009-11-07
  • 打赏
  • 举报
回复
java.lang.AbstractMethodError: //抽象方法错误!

LZ的方法是:
net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setCharacterStream(ILjava/io/Reader;)

参考:
http://jtds.sourceforge.net/doc/net/sourceforge/jtds/jdbc/JtdsPreparedStatement.html
的方法

第一次接触这样的存储问题。


期待高手

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧