我在从django查询SQL Server时遇到了一些奇怪的问题。
当我在一个请求中查询数据库两次时,在某些情况下会出现错误。也就是说,当第一次数据库查询返回大量数据时,我们在第二次查询数据库时会出现错误。
详细信息:
我们正在使用Django的Microsoft SQL Server后端(https://bitbucket.org/Manfre/django-mssql/src)在windows上运行。
我们希望允许用户通过表单过滤某些表("活动")中的数据,将其显示在网站的表上,然后在地图上显示另一个表("框架")的相关数据。
class Frames(models.Model):
...
class Activity(models.Model):
frame_from = models.ForeignKey(Frames, ...)
...
问题是:当我们想从活动中过滤更多的数据(比如说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-但它似乎在新版本的软件包中得到了解决。。。
我该怎么办?
提前感谢
我们在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;',
},
}
}
在"settings.py"文件中是否设置了"use_mars=True"?
http://django-mssql.readthedocs.org/en/latest/settings.html
如果这不起作用,我有一个问题:您在SQL Server中的选择是否涉及带有触发器的表(事务SQL脚本)-在这种情况下,SQL Server将使用静态光标而不是消防水管光标(这正是您所需要的),因此您会得到错误。尝试去掉触发器,在SQL Server中使用一些视图,并从中进行选择,而不是表。