Bug记录

pyodbc.Error:(‘HY010’,'[HY010] [Microsoft][ODBC

  • python
  • pyodbc
  • sqlserver
class DBManager:
    def __init__(self, server, database, username, password, driver='{SQL Server}'):
        """
        初始化数据库连接管理器
        :param server: 服务器地址
        :param database: 数据库名称
        :param username: 用户名
        :param password: 密码
        :param driver: 数据库驱动,默认为SQL Server
        """
        self.connection_string = f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}'
        logger.info('DBManager initialized with connection string')

    @contextmanager
    def get_connection(self):
        """
        获取数据库连接的上下文管理器
        自动处理连接的创建和关闭
        """
        conn = None
        try:
            conn = pyodbc.connect(self.connection_string)
            logger.info('Database connection established')
            yield conn
        except pyodbc.Error as e:
            logger.error(f'Database connection failed: {str(e)}')
            raise
        finally:
            if conn:
                conn.close()
                logger.info('Database connection closed')

    def execute_query(self, sql, params=None):
        """
        执行SQL查询
        :param sql: SQL语句
        :param params: SQL参数
        :return: 查询结果
        """
        with self.get_connection() as conn:
            cursor = conn.cursor()
            try:
                logger.info(f'Executing SQL: {sql}')
                if params:
                    cursor.execute(sql, params)
                else:
                    cursor.execute(sql)
                # conn.commit()  ---bug位置
                logger.info('SQL executed successfully')
                # 检查是否有数据返回
                if cursor.rowcount == 0:
                    logger.warning('No data returned from the query')
                    return None
                # 获取查询结果
                result = cursor.fetchall()
                print(result)
                return result
            except pyodbc.Error as e:
                logger.error(f'SQL execution failed: {str(e)}')
                conn.rollback()
                raise

    def execute_non_query(self, sql, params=None):
        """
        执行非查询SQL(如INSERT, UPDATE, DELETE)
        :param sql: SQL语句
        :param params: SQL参数
        """
        with self.get_connection() as conn:
            cursor = conn.cursor()
            try:
                logger.info(f'Executing non-query SQL: {sql}')
                if params:
                    cursor.execute(sql, params)
                else:
                    cursor.execute(sql)
                conn.commit()
                logger.info('Non-query SQL executed successfully')
            except pyodbc.Error as e:
                logger.error(f'Non-query SQL execution failed: {str(e)}')
                conn.rollback()
                raise

fetch 操作要在commit之后执行,在fetch之前commit会出现标题的报错。
bug位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值