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会出现标题的报错。

1390

被折叠的 条评论
为什么被折叠?



