【问题标题】:"Optional feature not implemented (106) (SQLBindParameter)" error with pyodbcpyodbc 出现“未实现可选功能 (106) (SQLBindParameter)”错误
【发布时间】:2013-11-27 10:39:29
【问题描述】:

我被逼疯了,试图弄清楚这一点。我是第一次使用 Python,并尝试将从 twitter 收集的数据写入 Access 2010 数据库。

我使用的命令是:

cursor.execute('''insert into core_data(screen_name,retweet_count) values (?,?,)''', (sname,int(rcount)))

返回的错误信息是:

Traceback (most recent call last):  File "C:/Documents and Settings/Administrator/PycharmProjects/clientgauge/tw_scraper.py", line 44, in <module>
cursor.execute('''insert into core_data(screen_name,retweet_count) values (?,?,)''', (sname,int(rcount))) 
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented  (106) (SQLBindParameter)')

我尝试了将数据传递到数据库的各种排列方式。如果我删除 int(rcount) 条目,它将发布第一个值 sname,没有任何问题。但是,一旦我尝试传入多个参数,问题就开始了。

我觉得我错过了一些非常基本的东西,但我找不到任何与我正在尝试做的事情看起来相似的例子,而且我正在尝试做的事情并不困难。 ..用户错误可能:)

任何帮助将不胜感激。

干杯, 凯夫

完整代码为:

from twython import Twython
import pyodbc
ACCESS_DATABASE_FILE = 'C:\\data\\ClientGauge.accdb'
ODBC_CONN_STR = 'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s;' %ACCESS_DATABASE_FILE
cnxn = pyodbc.connect(ODBC_CONN_STR, autocommit=True)
cursor = cnxn.cursor()
APP_KEY = '<removed>'
APP_SECRET = '<removed>'
# Authenticate on twitter using keys above
t = Twython(APP_KEY, APP_SECRET, oauth_version=2)
# Obtain new access token for this session
ACCESS_TOKEN = t.obtain_access_token()
# Authenticate using new access token
t = Twython(APP_KEY, access_token=ACCESS_TOKEN)
# Carry out search
search = t.search(q='<removed>', #**supply whatever query you want here**
         count=1, result_type='recent')
tweets = search['statuses']
for tweet in tweets:
sname=tweet['user']['screen_name']
rcount=int(tweet['retweet_count'])
fcount=tweet['favorite_count']
coord=tweet['coordinates']
tzone=tweet['user']['time_zone']
cdate=tweet['created_at']
htags=tweet['entities']['hashtags']
sql = "insert into core_data(screen_name,retweet_count,favourited_count) values (?,?,?)", (str(sname),rcount,fcount)
print(sql)
cursor.execute('''insert into core_data(screen_name,retweet_count) values (?,?)''', (sname,rcount))
cursor.commit()
cnxn.close()

我正在使用 MS Access 2010、pyodbc-3.0.7.win32-py3.3.exe、Python 3.3 和 PyCharm。

不要评判我的编码能力 :) Python 对我来说是新的。您将能够看到我已经尝试将 INSERT 语句设置为最初的字符串 (sql),并且我正在使用以下方法调用游标:

cursor.execute(sql)

不幸的是,这对我也不起作用!如果我用 1 之类的数字替换第二个参数......它仍然不起作用。令人沮丧。

【问题讨论】:

  • @MartijnPieters Access 的 ODBC 驱动程序确实支持参数查询。请参阅下面的答案。
  • @GordThompson:这就是为什么我说“看起来像”并要求 OP 尝试不用额外的逗号。

标签: python ms-access-2010 pyodbc pypyodbc


【解决方案1】:

我在这个驱动程序和pyodbc上遇到了同样的错误,结果证明将整数转换为浮点数解决了这个问题:

row = [1, 2, "foo"]
row = [float(x) if type(x) is int else x for x in row] #Convert all int items to floats
cursor.execute("insert into table1 (a,b,c) values (?,?,?)",row).commit()

【讨论】:

  • 这对我有用 - 我正在传递一个整数并转换为浮点数使其工作
【解决方案2】:

您的参数列表中有一个额外的逗号,这让您感到困惑。以下代码在 Python 2.7 下适用于我:

import pyodbc
sname = 'Gord'
rcount = 3
cnxn = pyodbc.connect(
        'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' +
        'DBQ=C:\\Users\\Public\\Database1.accdb;')
cursor = cnxn.cursor()
sql = "insert into core_data(screen_name,retweet_count) values (?,?)"
params = (sname, int(rcount))
cursor.execute(sql, params)
cursor.commit()
cnxn.close()

编辑:

在 Python 3.x 下运行时,pyodbc 与 Access ODBC 交互时,原来有一个带有整数参数的reported issue。一种可能的解决方法是尝试下载和安装 pypyodbc,然后尝试此代码(在 Python 3.5.2 下对我有用):

import pypyodbc
sname = 'Gord'
rcount = 3
cnxn = pypyodbc.connect(
        'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' +
        'DBQ=C:\\Users\\Public\\Database1.accdb;')
cursor = cnxn.cursor()
sql = "insert into core_data(screen_name,retweet_count) values (?,?)"
params = (sname, rcount)
cursor.execute(sql, params)
cursor.commit()
cnxn.close()

【讨论】:

  • 嗨,戈德,感谢您的回复,我之前尝试过没有额外的逗号(但在某处看到,添加了一个示例)。如果没有逗号,我仍然会收到同样的错误。
  • @user3041333 请编辑您的问题,向我们展示您的连接字符串。此外,您使用的 Python 和 pyodbc 版本可能是相关的。
  • - 更新了问题。谢谢你的坚持:)
  • 我尝试了您的示例,但它不适用于我的设置。我认为它一定是 ODBC 不兼容。你运行的是哪个版本?
  • @KevThomas 我目前正在运行 Python 2.7.5,我的初始测试是在 pyodbc-3.0.6-py2.7 下进行的。我已经用您可以尝试的另一个选项更新了我的答案。
【解决方案3】:

此错误通常与 ODBC SQL 驱动程序版本有关。 请在此处查看issue

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,但对我来说这与驱动程序配置有关。

    我在 ODBC 驱动程序配置中启用了快速选择,我确认这是我收到此错误的原因。

    发布此内容以防万一其他人修改了他们的驱动程序设置,并且建议的解决方案与我的情况不同。

    【讨论】:

      猜你喜欢
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多