Pyodbc连接字符串SQL Server身份验证

4

我知道这个问题在网上已经被问了很多次,导致有很多不同的解决方案,但都没有对我起作用。

我的情况是,我正在尝试使用服务帐户用户名和密码连接到 MS Sql 数据库,仅使用 Windows 身份验证并不适用于我的任务。

这是我提供的连接字符串:

databaseConnection = 'DRIVER={SQL Server}; SERVER=ServerName; Database=DatbaseName; UID=UserId; PWD=password;'

当我尝试运行脚本时,我收到了以下错误:

    dbConnection = pyodbc.connect(DATABASE.databaseConnection)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver]
[SQL Server]Cannot open database "XXXX" requested by the login. The login failed.
(4060) (SQLDriverConnect); [42000] [Microsoft][ODBC SQL Server Driver]
[SQL Server]Cannot open database "XXXX" requested by the login. The login failed. (4060)')

这个连接字符串有什么错误吗?我已经复制粘贴用户名和密码到SQL Server管理工具并成功登录数据库,所以它们应该是正确的。


2
你试过 User Id=myUsername; Password=myPassword; 吗? - Yevgen Yampolskiy
1
@YevgenYampolskiy 将属性更改为用户ID和密码无效。收到无效属性的错误。 - Marquis Blount
你是在尝试使用Windows服务进行连接吗? - circuitBurn
@þăדᴚῖↄқ,我已经解决了,谢谢。 - Marquis Blount
1
想和大家分享你的解决方案吗?我在解决一个类似的问题时发现了这个问题。 - circuitBurn
显示剩余2条评论
5个回答

4

我之前也遇到过这个问题,我通过进入微软 SQL Server 管理工具并手动将数据库连接到与登录数据库的用户帐户进行修复。

步骤如下:

  • 打开 Microsoft SQL Server 管理工具并连接到您的服务器。
  • 前往登录,并在正确的用户上右键单击,然后转到属性。
  • 在左上角有一个面板(标题为“选择页面”)。 转到用户映射。
  • 在显示的表格中,输入您正在使用的数据库旁边用户的名称(第二列中的用户)。

除此之外,请查看底部的面板。 在其所说的 Database role membership for:{database name}处,确保您选中了 db_datareaderdb_datawriter 两项。


1
“去登录”是什么意思?我在SSMS中已经连接到了我的服务器,但我不知道在哪里登录? - Mrmoleje
在对象资源管理器中展开数据库,然后转到“安全性”->“登录”。 - Sam Krygsheld

1

这是一种使用SQLAlchemy建立连接字符串的方法(参见https://www.sqlalchemy.org/):

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from db import Db

#Get localhost DB
engine = create_engine('mssql+pyodbc://myDbUser:myDbPassword@localhost:1433/MyDatabase?driver=SQL+Server+Native+Client+11.0?trusted_connection=no')

DBSession = sessionmaker(bind=engine)

session = DBSession()
db = Db(session)
print "the widget number is: "+db.widgetNumber

0
重要的参数是“用户名和密码”设置的位置,我将其替换为“Trusted_Connection=yes”,这样就可以使用登录到Windows的用户帐户。
import pyodbc

conn_str = ("Driver={SQL Server};"
                           "Server=<server-name>;"
                            "Database=<db-name>;"
                            "Trusted_Connection=yes")

conn = pyodbc.connect(conn_str)

cursor = conn.cursor()

0

在odbc数据源中配置MSSQL服务器,并使用以下pyodbc连接命名。我的userdsn名称为MyConnection。

import pyodbc

cnxn = pyodbc.connect('DSN=MyConnection')
cursor = cnxn.cursor()
cursor.execute("SELECT TOP (1000) [DepartmentID]      ,[Name]      ,[GroupName]      ,[ModifiedDate]  FROM ["
               "AdventureWorks2019].[HumanResources].[Department]")
rows = cursor.fetchall()
for row in rows:
    print(row.DepartmentID, row.Name)

这对我来说是有效的。如果有其他方法,请告诉我。


0

我遇到了同样的问题,问题出在数据库名称上。

我把数据库名称放在括号中,像[DB_NAME]一样,但是当我把括号去掉变成DB_NAME时,它就正常工作了。

请尝试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接