我从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 - 但似乎在新版本的软件包中解决了......
我该怎么办?
提前致谢
答案 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的解决方案 - 非常感谢你。
解决方案如下:
" 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;',
},
}
}