如何在一个数据库连接中调用3个不同的存储过程?

时间:2016-06-13 12:21:46

标签: c# mysql

我有一个c#控制台应用程序客户端,我正在尝试连接到mysql数据库。

我有一个名为select的主要方法。

此方法返回n行。

我正在遍历结果,对于每一个我调用另一个方法调用GetProductAttributes,在我得到结果后,我调用另一个名为UpdateProductAttributesJsonField的方法

这是我的代码:

public void Select(int shopId)
{
    using(MySqlCommand cmd = new MySqlCommand("GetProducts", new MySqlConnection(connection.ConnectionString)))
    {
        cmd.Parameters.Add(new MySqlParameter("@last_modified_date", ""));
        cmd.Parameters.Add(new MySqlParameter("@ShopId", shopId));
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection.Open();
        MySqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        while (dataReader.Read())
        {
            var id = int.Parse(dataReader["Id"].ToString());
            var attributes = GetProductAttributes(id);
            var json = JsonConvert.SerializeObject(attributes.ToArray());
            UpdateProductAttributesJsonField(id, json);
        }
        //dataReader.Close();
    }
}

public Dictionary<string, string> GetProductAttributes(int Id)
{
    var result = new Dictionary<string, string>();
    using(MySqlCommand cmd = new MySqlCommand("GetProductAttributes", new MySqlConnection(connection.ConnectionString)))
    {
        cmd.Parameters.Add(new MySqlParameter("@Id", Id));
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection.Open();
        //CommandBehavior.CloseConnection

        MySqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        while (dataReader.Read())
        {
            result.Add(dataReader["name"].ToString(), dataReader["value"].ToString());
        }
        //dataReader.Close();
    }
    return result;
}


public void UpdateProductAttributesJsonField(int productId, string json)
{
    using( MySqlCommand cmd = new MySqlCommand("UpdateArticleAttributes", new MySqlConnection(connection.ConnectionString)))
    {
        cmd.Parameters.Add(new MySqlParameter("@articleId", productId));
        cmd.Parameters.Add(new MySqlParameter("@json", json));
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
    }
    //cmd.EndExecuteNonQuery(CommandBehavior.CloseConnection); // cmd.ExecuteReader(CommandBehavior.CloseConnection);

}

这是我的初始化方法

private void Initialize()
{
    server = ConfigurationManager.AppSettings["ShopwareDBServer"];
    database = ConfigurationManager.AppSettings["DatabaseName"];
    uid = ConfigurationManager.AppSettings["DatabaseUser"];
    password = ConfigurationManager.AppSettings["DatabasePassword"];
    port = "3306";
    string connectionString;
    connectionString = "SERVER=" + server + ";" + "Port=" + port + ";" + "DATABASE=" +
    database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";" + "Convert Zero Datetime=True";
    connection = new MySqlConnection(connectionString);
}

我收到此错误:

  

{“错误连接:超时已过期。超时时间已过去   从池中获取连接。这可能已经发生过   因为所有池化连接都在使用中,并且最大池大小为   到达。“}

3 个答案:

答案 0 :(得分:0)

由于您在代码中使用数据读取器,因此需要在打开新连接之前关闭连接。

这似乎是一个建议,而不是回答这个问题,但让我告诉你另一种做同样事情的方法。

您想要调用3个过程,然后为什么不组合这三个过程并在数据库中创建一个新过程并调用该过程。我想,这样你只需要一个连接,你的问题就会得到解决。

顺便说一句,在使用“数据读取器”的同一连接上调用三个过程是不可能的。

答案 1 :(得分:0)

这是因为你使用最大连接池大小可能在你的代码中没有写connection.close()所以连接大小随着时间的推移而增加所以只需确保你关闭finally块中的连接。

首先重启MySQL,以便关闭所有连接并相应地更改代码。这个问题不是因为在一个连接中调用了3个存储过程,如果你想这样做是以多种方式完成的。

  • 您可以调用一个存储过程并从第一个存储过程调用其他过程。
  • 您也可以从c#代码中逐步调用存储过程。

答案 2 :(得分:0)

您可以检查连接状态是打开还是关闭;这可以帮助您减少最大连接池大小。

您可以编写如下代码:

If(Connection.State == Closed) {
    Connection.open
}