有谁知道MARS(多个活动结果集)的任何缺点?有没有人知道为什么人们应该避免使用MARS,比如游标比MARS更有用的情况.
我正在将实体框架与NHibernate进行比较,我想知道在使用SQL Server时,在NHibernate上启用或禁用MARS支持会产生什么影响(如果有的话)?
MARS =多个活动结果集
该实体Framwork文件规定如下:
Load
在foreach
(C#)或For Each
(Visual Basic)枚举期间调用方法时,实体框架会尝试打开新的数据读取器.除非通过multipleactiveresultsets=true
在连接字符串中指定启用了多个活动结果集,否则此操作将失败.有关详细信息,请参阅在MSDN上使用多个活动结果集(MARS).您还可以将查询结果加载到List集合中,该集合关闭数据读取器并使您能够枚举集合以加载引用的实体.
NHibernate有同样的问题吗?
简短的问题:我发现我需要使用MARS而不是ADO/OLEDB,这是正确的吗?
更长的解释:
我刚刚发现我的ODBC代码(使用"Driver = {SQL Native Client}",MFC CDatabase代码)需要有MARS("MARS_Connection = yes;"),因为虽然我在打开RecordSet时没有发出多个SELECT,但我做了获取一批行,然后需要打开另一个RecordSet来发出一个新的SELECT,然后返回到下一批的第一个RecordSet.没有MARS我得到ODBC错误"连接忙于另一个命令的结果".一切都很公平.
但是,我的代码与ADO/OLEDB("Provider = SQLNCLI",#import msado15.dll)相同,而不是ODBC.在同样的情况下,我没有必须指定"MarsConn = yes".
我感到困惑/惊讶.这是正确/预期的,还是我错过了什么?
如何在MIPS中将整数读入局部变量?可能吗?问题要求我使用将整数变量指定为局部变量的概念.#我的教科书中的一个问题.顺便说一下,不是作业!
Thanx提前!:d
ServiceStack ORMLite很棒,我通常避免使用ORM心态,而是更喜欢构建数据库,因为构建数据库而不是1:1类模型是有意义的.也就是说,有几件事我似乎遇到了困难,我确信这只是我无知的光芒.
第一:
有没有办法使用ORMLite管理多个结果集?我知道可以使用Dapper使用QueryMultiple方法,但无论出于何种原因,我都有时间搞清楚如何使用ServiceStack的内置Dapper实现.
第二:
有没有办法使用ORMLite在存储过程调用中返回输出参数?
理想情况下,我想避开MARS和输出参数,理想情况下我想生活在一个理想的世界:)
我正在使用.NET framework 4.5,SQL Server 2008 R2和ServiceStack 3.9.46.
stored-procedures sql-server-mars servicestack dapper ormlite-servicestack
我编写的大多数应用程序都不使用MultipleActiveResultSets=True
,但我已经在其中几个和一些教程中看到启用了该选项。
这个SO 问题涉及相同的主题,但它已经很老了,我相信在此期间情况发生了很大变化。
OP 争论执行一些非查询,同时执行ExecuteReader
. 在这种情况下,我认为这是一个糟糕的设计,因为它可能会被一些批处理样式的操作取代,也许是一个存储过程,以最大限度地减少往返次数。
当将 Entity Framework 与 ASP.NET Core 一起使用并收到与已在范围内执行某些内容的数据上下文相关的异常时,我将其视为错误,并没有考虑启用 MARS。
读了这MS文档文章我看到一个要注意的各个方面,如选项(ANSI_NULLS
,DATE_FORMAT
,LANGUAGE
,TEXTSIZE
),安全性上下文,当前的数据库,状态变量(@@ERROR
,@@ROWCOUNT
,@@FETCH_STATUS
,@@IDENTITY
)与MARS工作时启用。
此外,如果确实需要,10 年以上意味着功能更强大的服务器能够保持更多连接(缓存应该有助于减少这种需求)。
所以我想知道在使用现代 ASP.NET Core 应用程序 (3.0+) 时是否必须考虑启用 MARS。
问题:在使用 ASP.NET Core 3.0 和 SQL Server 2019+ 时,我什么时候应该使用 MultipleActiveResultSets=True?
我对详尽的分析不感兴趣,但有几个合适的上下文来证明是否使用 MARS 是合理的。
ASP.NET Core 应用程序中的一个典型示例是将数据库上下文作为范围(每个请求从连接池获取一个数据库连接,进行更改,通常每个请求/范围一个事务)。到目前为止,我已经将与每个连接的多个查询相关的错误视为我自己的错误,以避免 MARS,但我这样做了,但我没有真正理解原因。
sql-server sql-server-mars entity-framework-core asp.net-core
从我们的Web应用程序打开到SQL Server 2005的连接时,我们偶尔会看到此错误:
无法在此批处理中调用"模拟会话安全上下文",因为同时批处理已调用它.
我们使用MARS和连接池.
该异常源自以下代码:
protected SqlConnection Open()
{
SqlConnection connection = new SqlConnection();
connection.ConnectionString = m_ConnectionString;
if (connection != null)
{
try
{
connection.Open();
if (m_ExecuteAsUserName != null)
{
string sql = Format("EXECUTE AS LOGIN = {0};", m_ExecuteAsUserName);
ExecuteCommand(connection, sql);
}
}
catch (Exception exception)
{
connection.Close();
connection = null;
}
}
return connection;
}
Run Code Online (Sandbox Code Playgroud)
我发现了一篇MS Connect文章,该文章表明,在发送EXECUTE AS LOGIN命令之前,如果先前的命令尚未终止,则会导致错误.然而,如果连接刚刚打开,怎么会这样呢?
这可能与连接池与MARS奇怪地交互有关吗?
更新:从短期来看,我们已经通过在发生这种情况时清除连接池来实现一种解决方法,以消除不良连接,因为它会不断地回复给各个用户.(现在这种情况每天发生5-10次,只有少量的同时用户,所以这很烦人.)但如果有人有任何进一步的想法,我们仍然在寻找一个真正的解决方案......
c# asp.net connection-pooling sql-server-2005 sql-server-mars
我有一项使用MARS更新/插入7000多行的服务.有一个更好的方法吗?
using .NextResult
和Multiple
活动结果集之间有什么区别?
sqlReader.NextResult();
while (sqlReader.Read())
{
MessageBox.Show("From third SQL - " +
sqlReader.GetValue(0) + " - " +
sqlReader.GetValue(1));
}
Run Code Online (Sandbox Code Playgroud)
火星
private static string GetConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrive it from a configuration file.
return "Data Source=(local);Integrated Security=SSPI;" +
"Initial Catalog=AdventureWorks;MultipleActiveResultSets=True";
}
Run Code Online (Sandbox Code Playgroud) c# ×3
sql-server ×2
ado ×1
ado.net ×1
asp.net ×1
asp.net-core ×1
assembly ×1
dapper ×1
mips ×1
nhibernate ×1
odbc ×1
oledb ×1
recordset ×1
servicestack ×1
spim ×1
sql ×1