首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:(‘’s 005‘,"[IM005] [unixODBC][Driver Manager] SQL_HANDLE_DBC上的驱动程序的SQLAllocHandle失败(0) (SQLDriverConnect)")

错误:(‘’s 005‘,"[IM005] [unixODBC][Driver Manager] SQL_HANDLE_DBC上的驱动程序的SQLAllocHandle失败(0) (SQLDriverConnect)")
EN

Stack Overflow用户
提问于 2020-06-06 20:16:17
回答 1查看 1K关注 0票数 0

我正在我的pyodbc脚本中运行这段代码,在那里我试图进行并行处理。

代码语言:javascript
复制
templst = [lineitem, orders, partsupp, region, cur_cur, T1, T2]
connstr = [DRIVER={libdbodbc17.so};host=lint16muthab.phl.sap.corp:8766;UID=dba;PWD=sql;CharSet=utf8, DRIVER={libdbodbc17.so};host=localhost:8767;UID=dba;PWD=sql;CharSet=utf8,
           DRIVER={libdbodbc17.so};host=localhost:8768;UID=dba;PWD=sql;CharSet=utf8,
           DRIVER={libdbodbc17.so};host=localhost:8769;UID=dba;PWD=sql;CharSet=utf8, DRIVER={libdbodbc17.so};host=localhost:8770;UID=dba;PWD=sql;CharSet=utf8]

def extract_single(q, cursorconn):
    while True:
        try:
            tableName = q.get_nowait()
            time.sleep(3)
            qry2 = "Select * FROM %s"% (tableName)
            print " extraction done of table:%s done by cursor:%s"%(tableName,cursorconn)
        except Queue.Empty:
            return

def main():
    q = multiprocessing.Queue()
    for item in templst:
        q.put(item) # add items to queue
    process = []
    for i in xrange(5):
        p = multiprocessing.Process(target=extract_single, args=(q, connstr[i]))
        process.append(p)
        p.start()
    for p in process:
        p.join()

if __name__ == '__main__':
    main()

产出如下:

代码语言:javascript
复制
  extraction done of table:lineitem done by cursor:DRIVER={libdbodbc17.so};host=lint16muthab.phl.sap.corp:8766;UID=dba;PWD=sql;CharSet=utf8

表的提取:由cursor:DRIVER={libdbodbc17.so};host=localhost:8767;UID=dba;PWD=sql;CharSet=utf8完成的订单

代码语言:javascript
复制
      extraction done of table:partsupp done by cursor:DRIVER={libdbodbc17.so};host=localhost:8768;UID=dba;PWD=sql;CharSet=utf8

      extraction done of table:region done by cursor:DRIVER={libdbodbc17.so};host=localhost:8769;UID=dba;PWD=sql;CharSet=utf8

      extraction done of table:cur_cur done by cursor:DRIVER={libdbodbc17.so};host=localhost:8770;UID=dba;PWD=sql;CharSet=utf8

     extraction done of table:T2 done by cursor:DRIVER={libdbodbc17.so};host=localhost:8767;UID=dba;PWD=sql;CharSet=utf8

     extraction done of table:T1 done by cursor:DRIVER={libdbodbc17.so};host=lint16muthab.phl.sap.corp:8766;UID=dba;PWD=sql;CharSet=utf8

但是当我将提取函数修改为

代码语言:javascript
复制
def extract_single(q, cursorconn):
    while True:
        try:
            tableName = q.get_nowait()
            time.sleep(3)
            conn = pyodbc.connect(cursorconn, timeout=0)
            cursor = connvar.cursor()
            qry2 = "Select * FROM %s"% (tableName)
            cursor.execute(qry2).fetchall()
            print " extraction done of table:%s done by cursor:%s"%(tableName,cursorconn)
        except Queue.Empty:
            return

我收到错误,无法打开连接和游标,以便执行此查询并将数据转储到文件中。

代码语言:javascript
复制
2Process Process-1:
Traceback (most recent call last):
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn3.py", line 86, in extract_single
Process Process-2:
Traceback (most recent call last):
    connvar = pyodbc.connect(cursorconn, timeout=0)
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
Error: ('IM005', "[IM005] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_DBC failed (0) (SQLDriverConnect)")
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn3.py", line 86, in extract_single
    connvar = pyodbc.connect(cursorconn, timeout=0)
Error: ('IM005', "[IM005] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_DBC failed (0) (SQLDriverConnect)")
Process Process-3:
Traceback (most recent call last):
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn3.py", line 86, in extract_single
    connvar = pyodbc.connect(cursorconn, timeout=0)

为了所有的人脉。请让我知道如何解决这个错误。使用游标对象时获取错误

我希望使用以列表形式存储的游标对象,而不是再次打开新连接,每次打开游标。策展人看起来就像

代码语言:javascript
复制
<pyodbc.Cursor object at 0x7fcd9b47f270> <pyodbc.Cursor object at 0x7fcd9b47f330> <pyodbc.Cursor object at 0x7fcd9b47f390> <pyodbc.Cursor object at 0x7fcd9b47f3f0> <pyodbc.Cursor object at 0x7fcd9b47f450>

因此,我有5个游标对象,表列表与上面相同。

代码语言:javascript
复制
def extract_single(q, cursorconn):
    while True:
        try:
            tableName = q.get_nowait()

            qry2 = "Select count(*) FROM %s"%(tableName)
            cursorconn.execute(qry2)
            rowcnt = cursorconn.fetchone()[0]
            print " rows in tempdsc=",rowcnt
            print " extraction done of table:%s done by cursor:%s"%(tableName,cursorconn)

        except Queue.Empty:
            return



def main():
    q = multiprocessing.Queue()
    for item in tempdsclst:
        q.put(item) # add items to queue
    process = []
    for i in xrange(5):
        p = multiprocessing.Process(target=extract_single, args=(q, curlst[i]))
        process.append(p)
        p.start()
    for p in process:
        p.join()

它给出的错误就像

代码语言:javascript
复制
Process Process-1:
Traceback (most recent call last):
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
Process Process-2:
Traceback (most recent call last):
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn4.py", line 87, in extract_single
    cursorconn.execute(qry2)
Error: ('HY000', 'The driver did not supply an error!')
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn4.py", line 87, in extract_single
    cursorconn.execute(qry2)
Error: ('HY000', 'The driver did not supply an error!')
Process Process-3:
Traceback (most recent call last):
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn4.py", line 87, in extract_single
    cursorconn.execute(qry2)
Error: ('HY000', 'The driver did not supply an error!')
Process Process-4:
Traceback (most recent call last):
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn4.py", line 87, in extract_single
    cursorconn.execute(qry2)
Error: ('HY000', 'The driver did not supply an error!')
Process Process-5:
Traceback (most recent call last):
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/sybopt/software/python/python/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "conn4.py", line 87, in extract_single
    cursorconn.execute(qry2)
Error: ('HY000', 'The driver did not supply an error!')
EN

回答 1

Stack Overflow用户

发布于 2020-06-06 22:26:25

除了您正在遇到的问题之外,基于您先前的问题,我假设cursorconn是一个已经打开的连接,将对每个查询重用。由于它现在似乎只是一个连接字符串(尽管在您的代码中它似乎不是一个实际的字符串,对于列表templst?中的项来说是相同的情况),那么您应该在while True:语句之前进行调用conn = pyodbc.connect(cursorconn, timeout=0),以便可以将相同的连接重用到多个查询中,然后在从函数返回之前关闭连接。

我认为问题在于cursor = connvar.cursor()语句,它应该是:cursor = conn.cursor()。因此,请尝试以下几点:

代码语言:javascript
复制
conn = pyodbc.connect(cursorconn, timeout=0)
while True:
    try:
        tableName = q.get_nowait()
        time.sleep(3) # why is this here?
        cursor = conn.cursor()
        qry2 = "Select * FROM %s"% (tableName)
        cursor.execute(qry2).fetchall()
        print " extraction done of table:%s done by cursor:%s"%(tableName,cursorconn)
        cursor.close() # should probably add this
    except Queue.Empty:
        return
    finally:
        conn.close()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62237516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档