相关疑难解决方法(0)

来自实体框架的SqlException - 不允许新事务,因为会话中还有其他线程在运行

我目前收到此错误:

System.Data.SqlClient.SqlException:不允许新事务,因为会话中还有其他线程在运行.

在运行此代码时:

public class ProductManager : IProductManager
{
    #region Declare Models
    private RivWorks.Model.Negotiation.RIV_Entities _dbRiv = RivWorks.Model.Stores.RivEntities(AppSettings.RivWorkEntities_connString);
    private RivWorks.Model.NegotiationAutos.RivFeedsEntities _dbFeed = RivWorks.Model.Stores.FeedEntities(AppSettings.FeedAutosEntities_connString);
    #endregion

    public IProduct GetProductById(Guid productId)
    {
        // Do a quick sync of the feeds...
        SyncFeeds();
        ...
        // get a product...
        ...
        return product;
    }

    private void SyncFeeds()
    {
        bool found = false;
        string feedSource = "AUTO";
        switch (feedSource) // companyFeedDetail.FeedSourceTable.ToUpper())
        {
            case "AUTO":
                var clientList = from a in _dbFeed.Client.Include("Auto") select a;
                foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
                { …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework transactions inversion-of-control

571
推荐指数
10
解决办法
19万
查看次数

如何解决ASP.NET和SQL Server之间的连接池问题?

最近几天我们在网站上看到这条错误消息:

"超时已到期.在从池中获取连接之前已经过了超时时间.这可能是因为所有池连接都在使用中并且达到了最大池大小."

我们的代码暂时没有改变任何内容.我修改了代码以检查未关闭的打开连接,但发现一切都很好.

  • 我怎么解决这个问题?

  • 我需要编辑此池吗?

  • 如何编辑此池的最大连接数?

  • 高流量网站的推荐值是多少?


更新:

我需要在IIS中编辑某些内容吗?

更新:

我发现活动连接的数量在15到31之间,我发现在SQL Server中配置的最大允许连接数超过3200个连接,31个太多,或者我应该在ASP.NET配置中编辑一些东西?

.net sql-server asp.net sql-server-2005

192
推荐指数
13
解决办法
37万
查看次数

MARS(多个活动结果集)的缺点?

有谁知道MARS(多个活动结果集)的任何缺点?有没有人知道为什么人们应该避免使用MARS,比如游标比MARS更有用的情况.

sql-server-2005 sql-server-mars

77
推荐指数
2
解决办法
3万
查看次数

错误"当使用2个不同的命令时,"已经有一个与此命令关联的打开的DataReader必须先关闭"

我有这个遗留代码:

 private void conecta()
 {  
     if (conexao.State == ConnectionState.Closed)
         conexao.Open();
 }

 public List<string[]> get_dados_historico_verificacao_email_WEB(string email)
 {
     List<string[]> historicos = new List<string[]>();
     conecta();

     sql = 
         @"SELECT * 
         FROM historico_verificacao_email 
         WHERE nm_email = '" + email + @"' 
         ORDER BY dt_verificacao_email DESC, hr_verificacao_email DESC";

     com = new SqlCommand(sql, conexao);
     SqlDataReader dr = com.ExecuteReader();

     if (dr.HasRows)
     {
         while (dr.Read())
         {
             string[] dados_historico = new string[6];
             dados_historico[0] = dr["nm_email"].ToString();
             dados_historico[1] = dr["dt_verificacao_email"].ToString();
             dados_historico[1] = dados_historico[1].Substring(0, 10);
             dados_historico[2] = dr["hr_verificacao_email"].ToString();
             dados_historico[3] = dr["ds_tipo_verificacao"].ToString();

             sql = …
Run Code Online (Sandbox Code Playgroud)

c#

66
推荐指数
6
解决办法
18万
查看次数

如何在ExecuteQueryDynamic上的LinqPad上设置查询超时?

如何在ExecuteQueryDynamic上的LinqPad上设置查询超时?

Util.CurrentDataContext.ExecuteQueryDynamic($"SELECT count(*) FROM MyDb.dbo.{viewName}");
Run Code Online (Sandbox Code Playgroud)

我想使用此超时来检测太慢的视图。对于每个视图,我都要求一个计数,但是当计数花费太多时间时,我就停止它并计数下一个。

这是我完整的LINQPad代码

void Main()
{
    // In case of error "There is already an open DataReader associated with this Command which must be closed first."
    // /sf/ask/424353471/
    // Add MultipleActiveResultSets=true to connection string. 

    var biewsCount = b.V_sysobjects.Where(v => v.Type == "V").Count();
    var bViewsDetail = Util.OnDemand<List<SysObject>>("Get Views Detail", () => GetViewsDetail("b", b.V_sysobjects.Where(v => v.Type == "V").Select(v => v.Name).ToList()));
    bViewsDetail.Dump();
}

public List<SysObject> GetViewsDetail(string database, List<string> objectNames)
{
    var result = new List<SysObject>();
    foreach (var name in …
Run Code Online (Sandbox Code Playgroud)

c# linqpad

7
推荐指数
2
解决办法
144
查看次数

TransactionScope打破SqlConnection池?

我对TransactionScope和异步/同步SQL调用有一种奇怪的情况,我很难理解。我希望对这些操作的来龙去脉有较深了解的人能对此问题有所启发。

情况: 我有一个NUnit测试夹具,该夹具在[SetUp]期间创建一个TransactionScope,并将其放在[TearDown]处,以使每个测试都在相同的数据上运行。我进行了一系列测试,这些测试开始了对数据库的异步操作,然后对数据库执行了同步操作。第一个这样的测试成功完成。第二次这样的测试失败,并显示“已经有与此命令关联的打开的DataReader,必须先关闭它”。

  1. 如果我完全注释掉TransactionScope,所有测试都会通过。
  2. 我尝试了各种不同的TransactionScope选项和Complete / Dispose,但是发生相同的问题。
  3. 我正在NUnit测试.NET 4.5.1上使用Resharper测试运行程序。
  4. 我意识到“正确”的答案可能是“使所有内容异步等待”。不幸的是,这不是我的选择。
  5. 我不想启用MARS,因为此问题仅在测试中发生。
  6. 由于潜在的死锁,我不想使用GetAwaiter()。GetResult()。

在我看来,一旦调用TransactionScope.Dispose / Complete,则自动SQLConnection池将失去对哪些连接已打开DataReaders的跟踪。它将相同的SqlConnection分发给两个同时运行的操作,第二个消亡。

我的主要问题是“是什么导致了此行为(特别是)?”
我的第二个问题是“可以采取什么措施安全地解决此问题?”

下面的复制代码将打印出客户端连接ID。在我的机器上,第二个测试用例中用于ASYNC和SYNC调用的ClientConnectionId始终相同。

复制代码:

[TestFixture]
public class DataReaderTests
{
    private TransactionScope _scope;
    private string _connString = @"my connection string";

    [SetUp]
    public void Setup()
    {
        var options = new TransactionOptions()
        {
            IsolationLevel = IsolationLevel.ReadCommitted,
            Timeout = TimeSpan.FromMinutes(1)
        };
        _scope = new TransactionScope(TransactionScopeOption.RequiresNew, options, TransactionScopeAsyncFlowOption.Enabled);
    }

    [Test]
    [TestCase("First")]
    [TestCase("Second")]
    public void Test(string name)
    {
        DoAsyncThing().ConfigureAwait(false);
        using (var conn = new SqlConnection(_connString))
        {
            try
            {
                conn.Open(); …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server transactions

5
推荐指数
1
解决办法
326
查看次数

已经有一个与此命令关联的开放DataReader,必须首先关闭linq

以下代码中的错误在哪里?已经有一个与此命令关联的打开的DataReader,必须先关闭它.

"执行命令定义时发生错误.有关详细信息,请参阅内部异常."

var cat = from c in db.Question select c;
foreach (Questions question in cat) {
    Console.WriteLine("{0}", question.tittle);
    Console.WriteLine("{0}", question.deskripsi);
    Console.WriteLine("{0}", question.id_question);
    **foreach (Categories p in question.Categories)**
    {
        Console.WriteLine("{0}", p.id_kategori);
        Console.WriteLine("{0}", p.nama_kategori);
    }
}
Run Code Online (Sandbox Code Playgroud)

c# linq datareader

2
推荐指数
1
解决办法
6453
查看次数

“已经有一个与此命令关联的打开的 DataReader,必须先关闭它。”

我正在开发需要连接到另一个数据库以获取一些数据的应用程序,为此,我决定使用 SqlConnection、阅读器等。

而且我需要执行一些查询,例如首先我需要为某个用户获取 CARD ID,然后我需要通过该 CARD ID 获取一些数据..

这是我的代码:

#region Connection to another Database

SqlConnection sqlConnection1 = new SqlConnection("Data Source=ComputerOne; Initial Catalog=TestDatabase;Integrated Security=False; User ID=test; Password=test123;");
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;

cmd.CommandText = "Select * From Users Where CardID=" + "'" + user.CardID + "'";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection1;

sqlConnection1.Open();

reader = cmd.ExecuteReader();

string cardID = "";
string quantity="";

while (reader.Read())
{
    cardID = reader["CardID"].ToString();
}
//HOW COULD I WRITE ANOTHER QUERY NOW, FOR EXAMPLE, OK …
Run Code Online (Sandbox Code Playgroud)

c# sql database connection reader

2
推荐指数
1
解决办法
2万
查看次数