Django SQL Server错误:“无法创建新连接,因为在手动或分布式事务模式下。”

时间:2012-08-28 08:35:45

标签: sql-server django sql-server-2008 django-models django-mssql

我从django查询SQL Server时遇到一些奇怪的问题。

当我在单个请求中查询db两次时,我在某些情况下遇到错误。也就是说,当第一个db查询返回大量数据时,我们在第二次查询db时会出错。

详细信息:

我们在Windows上运行的Django(https://bitbucket.org/Manfre/django-mssql/src)使用Microsoft SQL Server后端。

我们希望允许用户通过表格过滤来自某些表格(“活动”)的数据,将其显示在网站的表格中,然后在地图上显示来自另一个表格(“框架”)的相关数据。

class Frames(models.Model):
...

class Activity(models.Model):
frame_from = models.ForeignKey(Frames, ...)
...

问题是:当我们想要从Activity中过滤大量数据时(假设200个x 6列),我们不能在表Frames上的同一请求中进行其他查询(在Django settings.py中打开了MARS) ):

result = Aktywnosci.objects.filter(qset1) 

总是好的,但是

path = Frames.objects.filter(qset2) 

当上一个查询返回大量数据时,会引发OLE DB错误:

  

'用于SQL Server的Microsoft OLE DB提供程序'错误:不能   因为在手动或分布式事务模式下创建新连接。

PS。来自settings.py的数据库设置:

# Database for this installation. 
DATABASES = {
'default':{
    'ENGINE': 'django.db.backends.sqlserver_ado', 
    'NAME': '***',                      
    'USER': '***',                      
    'PASSWORD': '***',                  
    'HOST': '***',                      
    'PORT': '',                        
    'OPTIONS' : {
        'provider': 'SQLOLEDB',
        'use_mars': True,                    
          }
}
}

PS2。我在djang-mssql的谷歌代码页面上遇到了这个问题:http://code.google.com/p/django-mssql/issues/detail?id=79 - 但似乎在新版本的软件包中解决了......

我该怎么办?

提前致谢

2 个答案:

答案 0 :(得分:0)

“settings.py”文件中是否设置了“use_mars = True”?

http://django-mssql.readthedocs.org/en/latest/settings.html

如果这不起作用,我有一个问题:您在SQL Server中的选择是否包含带有触发器的表(transact SQL脚本) - 在这种情况下,SQL Server将使用静态游标而不是firehose游标(这就是你所需要的)因此你会得到你的错误。尝试摆脱触发器,在SQL Server中使用一些视图并从中选择而不是表。

答案 1 :(得分:0)

我们得到了来自Michael Manfre的bitbucket:https://bitbucket.org/Manfre/django-mssql/issue/13/ole-db-provider-for-sql-server-error的解决方案 - 非常感谢你。

解决方案如下:

" SQLOLEDBMARS不能很好地工作,我打算更改所有文档和默认值,以假设将使用本机客户端驱动程序。尝试使用本机客户端; "SQLNCLI10""SQLNCLI11"

DATABASES = {
    'default': {
        'ENGINE': 'sqlserver_ado',
        'NAME': 'mydb',
        'HOST': r'localhost',
        'USER': '',
        'PASSWORD': '',
        'OPTIONS': {
            'provider': 'SQLNCLI10',
            'extra_params': 'DataTypeCompatibility=80;MARS Connection=True;',
        },
    }
}