[Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column 1.

探讨了在使用SQLServer数据库及微软JDBC驱动时遇到的字段重复读取异常问题,提供了解决方案,包括调整字段读取顺序或更换为jtds驱动。


org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not initialize a collection:


java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column 1.
 at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
 at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
 at com.microsoft.jdbc.base.BaseResultSet.validateColumnIndex(Unknown Source)
 at com.microsoft.jdbc.base.BaseResultSet.getInt(Unknown Source)
 at com.microsoft.jdbc.base.BaseResultSet.getInt(Unknown Source)
 at org.apache.commons.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:236)
  . . . . . .省略掉的这一部分是堆栈信息

 

使用SQLServer 数据库时,可能发生此异常,原因是微软自己的jdbc驱动不支持同一个记录的字段的重复读取,因为微软加入了text,image这种类型的支持,就限制了字段的回读功能.

 

(我在使用hibernate级联查询的时候出现了这种异常lazy=false的级联查询)

 

解决方法:按照顺序(从左到右的顺序)读取字段,例如(getString(1),getString(2),getString(3)....);当然这个是微软jdbc驱动的一个bug,我们也可以不用他的驱动,自己到网上下载jtds.jar驱动,使用这种驱动就不会出现上面的异常了.

 


 

<think>好的,我需要帮助用户解决如何从SQL Server表中读取每列数据并存储到对应的集合中。首先,我得理解用户的需求。用户希望将表中的每一列数据分别存入不同的列表或数组,比如列1的数据存到List1,列2到List2,依此类推。这可能用于后续的数据处理或展示。 接下来,我需要考虑使用什么编程语言。用户之前提到了Java和Python的示例,但问题中没有明确指定,所以可能需要提供两种语言的解决方案。不过用户最后的提问可能更偏向于Python,因为引用了Python相关的引用[2]。不过为了全面,我可以都涵盖。 首先,对于Python部分,引用[2]提到使用pandas库读取数据列并转换为列表。pandas的read_sql方法可以方便地将整个表读入DataFrame,然后每一列可以用df['列名'].tolist()转换为列表。这应该是一个有效的方法。不过用户可能需要更基础的代码,不使用pandas的话,可以使用pyodbc直接读取,然后遍历每一列,将数据分别存入不同的列表。例如,获取游标的description来获取列信息,然后按列索引提取数据。 对于Java部分,引用[1]中用户遇到的问题是ArrayList重复显示最后一条记录,这可能是因为在循环中错误地重复使用了同一个对象,导致每次添加的都是同一个引用。正确的做法应该是在每次迭代时创建新的对象,比如在读取每一行时,为每一列创建新的列表,并将值添加到对应的列表中。使用JDBCResultSet,遍历每一行,然后按列索引或名称获取值,分别添加到不同的ArrayList中。 还需要考虑数据类型的问题,比如SQL中的不同数据类型如何正确转换为Java或Python中的类型。例如,在Java中,ResultSet的getString、getInt等方法需要根据列的数据类型调用,而在Python中,通常会自动处理,但可能需要手动转换。 另外,性能方面,如果数据量很大,一次性读取所有数据到内存可能会影响性能,需要考虑分页读取或者流式处理,但用户的问题中没有提到数据量,所以假设是一般情况下的处理。 最后,整理步骤,给出代码示例,并确保语法正确。同时,生成相关问题,可能涉及性能优化、异常处理、数据类型转换等。</think>从SQL Server表中读取每列数据并存储到对应集合的实现步骤如下: ### Python实现方案 1. 使用`pyodbc`建立数据库连接 2. 执行SQL查询获取结果集 3. 通过游标描述信息获取列结构 4. 创建与列数对应的空列表 5. 遍历结果集逐列存储数据 ```python import pyodbc # 建立连接 conn = pyodbc.connect('DRIVER={SQL Server};SERVER=服务器;DATABASE=数据库;UID=用户;PWD=密码') cursor = conn.cursor() # 执行查询 cursor.execute("SELECT * FROM 表名") # 获取列信息 columns = [column[0] for column in cursor.description] # 创建列对应的列表集合 data_lists = [[] for _ in range(len(columns))] # 遍历结果集填充数据 for row in cursor: for i in range(len(columns)): data_lists[i].append(row[i]) # 转换为字典形式访问(可选) column_dict = {col: data_lists[i] for i, col in enumerate(columns)} # 关闭连接 cursor.close() conn.close() ``` ### Java实现方案 ```java import java.sql.*; import java.util.ArrayList; public class SQLReader { public static void main(String[] args) { String url = "jdbc:sqlserver://服务器:端口;databaseName=数据库"; String user = "用户名"; String password = "密码"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM 表名")) { ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); ArrayList<ArrayList<Object>> columnData = new ArrayList<>(); for (int i = 1; i <= columnCount; i++) { columnData.add(new ArrayList<>()); } while (rs.next()) { for (int i = 1; i <= columnCount; i++) { Object value = rs.getObject(i); columnData.get(i-1).add(value); } } } catch (SQLException e) { e.printStackTrace(); } } } ``` ### 关键注意事项 1. 数据类型映射需确保SQL类型与目标语言类型兼容[^2] 2. 大数据量时应使用分页查询避免内存溢出 3. 连接资源必须显式关闭防止泄漏[^1] 4. 建议使用预编译语句防止SQL注入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值