【问题标题】:Passing Parameters to Stored Procedures using PyODBC使用 PyODBC 将参数传递给存储过程
【发布时间】:2011-10-19 15:51:20
【问题描述】:

我正在使用 pyODBC 连接到 SQL Server 2005 express 数据库。我在 SQLServer express 中创建了一个存储过程,它采用 2 个字符串参数,例如 stored_proc(inpu1, input2) 这些参数的类型是日期时间。我已经使用管理工作室测试了存储过程,它确实返回了适当的结果。但是,当我尝试从 python 调用存储过程(我正在使用 Eclipse)时,我得到了错误。

pyodbc.DataError: ('22018', '[22018] [Microsoft][SQL Native Client]强制转换规范 (0) (SQLExecDirectW) 的字符值无效')2/9/2011 12:00:03 2/ 9/2011 12:20:03

我调用的函数如下:

def GetAlarmFrequencyTime(tstart,tend): 

print tstart, tend  
arguments=(tstart,tend)
local_cursor=conn.cursor()
local_cursor.execute("{call dbo.GetAlarmEventHistoryFrequency_TimeRange(tstart,tend)}")

resultset_rows=local_cursor.fetchall()
print "There are" , len(resultset_rows), "records"
for single_row in resultset_rows:
    print "|" ,single_row[0], "|" ,single_row[1],"|" 

local_cursor.close()

导致问题的行是

local_cursor.execute("{call dbo.GetAlarmEventHistoryFrequency_TimeRange(tstart,tend)}") 

谁能帮助我了解如何将多个参数传递给使用 pyODBC 调用的存储过程。 我是否需要转换 tstart,并首先倾向于日期时间格式,如果需要如何?我已经验证了strptime,但即使这样也没有成功,虽然我可能用错了

【问题讨论】:

  • 我玩了一下,发现 local_cursor.execute("call dbo.GetAlarmEventHistoryFrequency_TimeRange(?,?)}",[dt_start],[dt_end]) 基本上语法似乎是“调用stored_proc(?),[params]。现在我想就是这样,但是当我运行时,我在 Python.exe 中得到一个未处理的 Win32 异常。有没有人在 Windows 上使用 Python 2.7 使用 pyODBC 的经验?

标签: python sql-server-2005 pyodbc


【解决方案1】:

终于搞定了,工作不崩溃

local_cursor.execute("{call dbo.GetAlarmEventHistoryFrequency_TimeRange(tstart,tend)}")

是错误的语法。应该是

local_cursor.execute("{call dbo.GetAlarmEventHistoryFrequency_TimeRange(?,?)}",(tstart),(tend))

要特别注意特殊符号{}和传入参数的方式(tstart),(tend) local_cursor.execute("*{*call dbo.GetAlarmEventHistoryFrequency_TimeRange*(?,?)}",(tstart),(tend)*)

【讨论】:

  • 感谢您的回答。按照上述步骤操作,但我不断收到错误消息:“error_message”:“并非所有参数都在字符串格式化期间转换”
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多