[Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度 ----> 解决方法

现在在弄单机的软件,是需要到数据库相连的。我这里选择了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修改后,都改为长文本了。

[Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度 ----> 解决方法

这个问题困扰了我一晚,终于搞掂啦。

你可能感兴趣的:(java,odbc,无效的字符串或缓冲区长度)