现在在弄单机的软件,是需要到数据库相连的。我这里选择了Access或者Excel这些比较通用的来作为数据库。但在连接数据库时已经成功,但就是出现在select语句里面报错,如下:
java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
先贴贴我的查询语句的描述:
@Override
public List<LungCancer> search(String scope, String prop) {
System.out.println(scope+"---->" + prop);
// TODO Auto-generated method stub
try {
String sql = "SELECT * FROM " + m_sheet + " WHERE "+ scope + " = ?"; // m_sheet是数据库表的名称,或者excel里面sheet的名字
m_pstmt = m_conn.prepareStatement(sql);
m_pstmt.setString(1, prop);
ResultSet rs = m_pstmt.executeQuery();
if (rs.next()) {
List<LungCancer> list = new ArrayList<LungCancer>();
int i = 0;
do {
LungCancer lc = new LungCancer();
lc.setM_id(rs.getInt(1));
lc.setM_snp(rs.getString(2));
lc.setM_value(rs.getDouble(3));
lc.setM_cancer(rs.getString(4));
lc.setM_pop_src(rs.getString(5));
lc.setM_pmid(rs.getString(6));
list.add(lc);
} while (rs.next());
m_pstmt.close();
m_conn.close();
return list;
}
return null;
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
LungCancer是我自己建的类,属于它自己的属性:
package ckj.gzhmc.yang.vo;
public class LungCancer {
private int m_id;
private String m_snp;
private double m_value;
private String m_cancer;
private String m_pop_src;
private String m_pmid;
public int getM_id() {
return m_id;
}
public void setM_id(int m_id) {
this.m_id = m_id;
}
public String getM_snp() {
return m_snp;
}
public void setM_snp(String m_snp) {
this.m_snp = m_snp;
}
public double getM_value() {
return m_value;
}
public void setM_value(double m_value) {
this.m_value = m_value;
}
public String getM_cancer() {
return m_cancer;
}
public void setM_cancer(String m_cancer) {
this.m_cancer = m_cancer;
}
public String getM_pop_src() {
return m_pop_src;
}
public void setM_pop_src(String m_pop_src) {
this.m_pop_src = m_pop_src;
}
public String getM_pmid() {
return m_pmid;
}
public void setM_pmid(String m_pmid) {
this.m_pmid = m_pmid;
}
public String toString(){
return m_id + ": " + m_snp + ": " +m_value + ": " +m_cancer + ": " +m_pop_src + ": " +m_pmid ;
}
}
网上很多帖子都说,是因为64位的系统所造成,但我觉得这应该不会的吧。
后来想想之前某个老师说过,select * from 这句里面,*代表所有属性,可能就是这里出了问题。所以决定把所有属性都列举出来,哈哈,问题就解决了。
修改上面sql的语句即可:
String sql = "SELECT [id],[snp],[value],[cancer],[Population and Source],[pmid] FROM lung WHERE " + scope + " = ?"
除此之外,我还修改了属性的类型。之前属性都设置为了短文本,后来在ACCESS修改后,都改为长文本了。
这个问题困扰了我一晚,终于搞掂啦。