1

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

当我在单个请求中查询 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 错误:

“Microsoft OLE DB Provider for SQL Server”错误:无法创建新连接,因为处于手动或分布式事务模式。

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 - 但它似乎在新版本中得到了解决包裹...

我能做些什么呢?

提前致谢

4

2 回答 2

0

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

解决方案如下:

SQLOLEDB并且MARS效果不佳,我打算更改所有文档和默认设置以假设将使用本机客户端驱动程序。尝试使用本机客户端;"SQLNCLI10""SQLNCLI11".

DATABASES = {
    'default': {
        'ENGINE': 'sqlserver_ado',
        'NAME': 'mydb',
        'HOST': r'localhost',
        'USER': '',
        'PASSWORD': '',
        'OPTIONS': {
            'provider': 'SQLNCLI10',
            'extra_params': 'DataTypeCompatibility=80;MARS Connection=True;',
        },
    }
}
于 2012-09-13T16:20:49.437 回答
0

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

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

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

于 2012-08-28T09:42:03.527 回答