【发布时间】:2020-07-20 05:23:05
【问题描述】:
我有一个这样的存储过程。
CREATE PROCEDURE StudentSproc
(@StudentID VARCHAR(50),
@Name VARCHAR(50))
AS
BEGIN
BEGIN TRAN
BEGIN TRY
INSERT INTO Student(StudentID, Name)
VALUES (@StudentID,@Name)
COMMIT TRAN;
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
END;
我正在尝试从 python 执行它:
db_conn_str = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=' + server + ';PORT=1433;DATABASE=' + database + ';UID=' + username + ';PWD=' + password
cnxn = pyodbc.connect(db_conn_str)
cursor = cnxn.cursor()
st = f"exec master.dbo.StudentSproc @StudentID = ?, @Name = ? "
s_id = "101"
name = "Charles"
params = (s_id, name)
cursor.execute(st, params)
print(f"executed sproc by {st}")
这没有错误并执行存储过程,但它没有更新数据库,我很惊讶。我知道我必须在connect() 调用中使用autocommit=True,但是如果存储过程中有提交,为什么还要这样做呢?
【问题讨论】:
-
你有一个很好的基于假设和猜测的解释。但正如已经解释的那样,您的 sql 代码会捕获错误但不会重新引发错误,因此您的应用程序(和您)无法知道插入是否成功。更糟糕的是,您显然在 MASTER 数据库中创建了一个用户存储过程(显然也是一个表)。在我看来,您对您的连接、您应该使用的数据库以及实际执行的代码有些困惑。
标签: python sql-server stored-procedures pyodbc