2010-11-04 35 views
0

我正在运行以下内容:Windows 7,Python 2.5和SQL Server 2005,SQLNCLI作为提供程序。我有一个表,它的名字是TABLE,它的字段是FIELD0,FIELD1,FIELD2。这是一个Python或SQL服务器错误?

你可以在这里找到SQLNCLI.msi:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d09c1d60-a13c-4479-9b91-9e8b9d835cdc&displaylang=en

我attemting使用存储过程。其目的是更新一行,或者如果它不存在,则插入它。 当它到达插入语句时,所有内容都会出错,但插入成功。下面是代码

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

create procedure [dbo].[TEST0] 
    @FIELD0    varchar(200) 
as 
begin 
    declare @exist varchar(MAX) 

    set @exist = (select top 1 [FIELD0] from [TABLE] where [FIELD0] = @FIELD0) 

    if @exist is null 
    begin 
     insert into [TABLE] ([FIELD0],[FIELD1],[FIELD2]) values (@FIELD0,'FIELD1','FIELD2') 

     select top 1 [FIELD0] from [TABLE] 
     where 
      [FIELD0] = @FIELD0 
     return 10 
    end 
    else 
     select top 1 [FIELD0] from [TABLE] where [FIELD0] = @FIELD0 
end 

要查看错误运行此Python代码的两倍;第一次失败了,但第二次它成功:

from win32com.client import Dispatch 

dbConn = Dispatch("ADODB.Connection") 
dbConn.Open("server=xx.xx.xx.xx; initial catalog=MYDB; user=myuser; password=mypass; provider=SQLNCLI") 

command = Dispatch('ADODB.Command') 
command.ActiveConnection = s.dbConn 
command.CommandText = "[TEST0]" 
command.CommandType = 4 


param0 = command.CreateParameter ('@FIELD0',200,1,200,'VALUE') 
command.Parameters.Append(param0) 
print param0 

(rs, result) = command.Execute() 
while not rs.EOF: 
    dic = {} 
    for field in rs.Fields : 
     dic[str(field.name)] = str(field.value) 
    print dic 
rs.MoveNext() 
+1

我们不打算安装的东西来测试你的代码为您服务!请做一些更多的工作,缩小一小段代码中的错误,然后发布完整的错误信息或缺少完整的错误信息(应该发生什么?发生了什么?你得到了什么错误?你是否尝试在调试器?然后发生了什么?) – katrielalex 2010-11-04 23:47:22

+0

我已经安装了测试用户代码=)的东西。我已经解决了这个问题 – Delta 2010-11-05 00:00:10

+0

什么是错误信息?如果您在存储过程中取消返回10行,它是否仍然会发生?在旁注:这将在高并发下失败。 – 2010-11-05 00:08:37

回答

0

我解决这个问题:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

alter procedure [dbo].[TEST0] 
    @FIELD0    varchar(200) 
as 
begin 
    set nocount on <=============================add this 
    declare @exist varchar(MAX) 

    set @exist = (select top 1 [FIELD0] from [TABLE] where [FIELD0] = @FIELD0) 

    if @exist is null 
    begin 
     insert into [TABLE] ([FIELD0],[FIELD1],[FIELD2]) values (@FIELD0,'FIELD1','FIELD2') 

     select top 1 [FIELD0] from [TABLE] 
     where 
      [FIELD0] = @FIELD0 
    end 
    else 
     select top 1 [FIELD0] from [TABLE] where [FIELD0] = @FIELD0 
    set nocount off <=============================add this 
end