使用python ctypes.windll.ODBCCP32.SQLConfigDataSource添加ODBC用户DSN

时间:2019-05-30 20:00:29

标签: python sql odbc dsn

我正在尝试在python中添加新的ODBC数据源,并在网上找到了此代码,该代码似乎可以与python 2一起使用(正如其他人所提到的,但我没有尝试过),但不适用于python 3(我正在使用3.6) 。该代码运行无误,但没有向系统添加新的DSN(始终返回0)。

我到处搜索,发现有人提到这可能是由于编码问题造成的,因此我尝试将属性部分更改为具有不同编码的字节(nul.join(attrib)),但它们均无效。

这是代码的一部分:

ODBC_ADD_DSN = 1        # Add data source, user DSN only
ODBC_CONFIG_DSN = 2     # Configure (edit) data source
ODBC_REMOVE_DSN = 3     # Remove data source
ODBC_ADD_SYS_DSN = 4    # add a system DSN
ODBC_CONFIG_SYS_DSN = 5 # Configure a system DSN
ODBC_REMOVE_SYS_DSN = 6 # remove a system DSN

def add_dsn(name, driver, **kw):
    nul, attrib = '', []
    kw['DSN'] = name
    for attr, val in kw.items():
        attrib.append('%s=%s' % (attr, val))

    return ctypes.windll.ODBCCP32.SQLConfigDataSource(0, ODBC_ADD_DSN, driver, nul.join(attrib))

#
if __name__ == "__main__":
    print (add_dsn('test', 'SQL Server', server='(local)', description = 'Testing'))

任何人都可以提供有关如何解决此问题的帮助或提供使用python添加新的ODBC数据源的解决方案。谢谢!

1 个答案:

答案 0 :(得分:0)

要使用python 3连接到SQL Server,我使用以下语句,并且可以毫无错误地获取数据。

import pyodbc
import pandas as pd
cnxn = pyodbc.connect(driver='{SQL Server}', server='YourServer', database='YourDBName',               
               trusted_connection='yes')
cursor = cnxn.cursor()

然后可以使用pd.read_sql命令检索任何数据。

print(pd.read_sql("SELECT * FROM [fruits]",cnxn))

数据库输出:

  fruiteater       Fruit1  Fruit2       Fruit3 Fruit4       Fruit5  Fruit6
      Aaron       Orange    Pear        Apple   None         None    None
         Bob        Apple  Orange  Blueberries  Peach        Mango  Banana
      Carter         Pear  Orange        Apple   None         None    None
       David  Blueberries    None         None   None         None    None
     Earnest        Mango  Orange         Pear  Apple  Blueberries    None
       Frank  Raspberries    None         None   None         None    None