Соединение MySQL Connector / NET, несколько устройств чтения данных на соединение?

Привет, ребята, теперь я перехожу с Java на C #, когда понял, что предпочитаю функции языка C # тем, что есть в Java, но у меня есть это небольшая проблема. В MySQL Connector / J и JDBC я считаю, что одно из моих приложений позволяло выполнять несколько PreparedStatement , пока другое открыто, MySql.Data.MySqlClient.MySqlException: уже существует открытый DataReader, связанный с этим подключением, которое необходимо сначала закрыть.

Есть ли простой способ исправить эту ошибку, возможно, любые другие реализации MySQL в .NET мост? Я действительно не хочу создавать много подключений к БД в одном приложении, хотя я могу захотеть создать одно для каждого потока в моем приложении (как в ThreadLocal). Соединение с ThreadLocal DB поможет, когда я выполняю два запроса одновременно двумя разными методами, но, очевидно, я не могу разделить эти две команды на разные потоки и не хочу создавать лишние потоки.

Кстати, вот сам код. Да, я могу переместить код обновления вниз после закрытия программы чтения, но у меня есть еще много похожих методов, и некоторые из них исправить сложнее, чем этот:

MySqlConnection con = DatabaseConnection.GetConnection();
MySqlCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT `id`,`password`,`salt`,`pin`,`gender`,`birthday` FROM `accounts` WHERE `name` = '" + AccountName + "'";
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
    AccountId = reader.GetInt32(0);
    string passhash = !reader.IsDBNull(1) ? reader.GetString(1) : null;
    string salt = !reader.IsDBNull(2) ? reader.GetString(2) : null;
    m_pin = !reader.IsDBNull(3) ? reader.GetString(3) : null;
    Gender = !reader.IsDBNull(4) ? reader.GetByte(4) : WvsCommon.Gender.UNDEFINED;
    m_birthday = !reader.IsDBNull(5) ? reader.GetInt32(5) : 0;
    if (!HashFunctions.HashEquals(pwd, HashAlgorithms.SHA512, passhash + salt))
    {
        if (passhash == pwd || salt == null && HashFunctions.HashEquals(pwd, HashAlgorithms.SHA1, passhash))
        {
            salt = HashFunctions.GenerateSalt();
            passhash = HashFunctions.GenerateSaltedSha512Hash(pwd, salt);
            MySqlCommand update = con.CreateCommand();
            update.CommandText = "UPDATE `accounts` SET `password` = '" + passhash + "', `salt` = '" + salt + "' WHERE `id` = " + AccountId;
            update.ExecuteNonQuery();
            update.Dispose();
        }
    }
}
reader.Close();
cmd.Dispose();

Если перемещение кода обновления - единственная возможность или лучший вариант, я полагаю, что мне придется смириться с этим, но я хочу сначала получить больше идей о других возможностях, а затем выбрать вариант.

5
задан Kevin Jin 10 September 2010 в 14:25
поделиться