Xion1624 Ответов: 3

С этой командой уже связан открытый datareader, который должен быть закрыт в первую очередь. Пожалуйста, предоставьте самый простой способ исправить это с объяснением


Private Sub tmchat_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmchat.Tick

       Using cmdreadchat As New MySqlCommand("SELECT chat FROM tb_chat", Conn)

           Dim chatreader As MySqlDataReader



           chatreader = cmdreadchat.ExecuteReader()

           While chatreader.Read()

               If Not chatreader(0).ToString = ChatBoxBackup.Text Then
                   ChatBoxBackup.Text = chatreader(0).ToString
               End If
               chatreader.Close()
           End While
       End Using



   End Sub


Что я уже пробовал:

я пробовал много разных способов исправить это ... я пробовал открывать и закрывать все соединения...я проверил все datareader, если они остались открытыми, и я использовал using block На всех datareader....но он все еще показывает ту же ошибку......

3 Ответов

Рейтинг:
2

ZurdoDev

Вы закрываете считыватель внутри цикла, где вы читаете из него. Переместите код закрытия за пределы цикла.


Рейтинг:
2

codejet

Попробуйте включить MutipleActiveResultSet в строке подключения добавьте это

MultipleActiveResultSets=True


Xion1624

Суб ConTempOpen()
ConTemp.ConnectionString = "server=" & My.Settings.Хозяин &ампер; "; идентификатор пользователя=" & моя.Параметры.Пользователей &ампер; "; пароль=" & моя.Параметры.Пройти &ампер; "; базы данных= " & моя.Параметры.имя_бд
Попробуй
Контемп.Открыть()
Поймать ex как исключение
С помощью MsgBox(исх.Сообщение &амп; vbNewLine &ампер; "проверить подключение.", MsgBoxStyle.Критично, "не удается подключиться к базе данных")
Приложение.Выход()
Конец Попытки
Конец Подводной Лодки

Подгруппы, Содержащие Вредоносные Элементы()
Коннектикут.ConnectionString = "server=" & My.Settings.Хозяин &ампер; "; идентификатор пользователя=" & моя.Параметры.Пользователей &ампер; "; пароль=" & моя.Параметры.Пройти &ампер; "; базы данных= " & моя.Параметры.имя_бд

Попробуй
Конн.Открыт()
Поймать ex как исключение
С помощью MsgBox(исх.Сообщение &амп; vbNewLine &ампер; "проверить подключение." &ампер; vbNewLine &ампер; "приложение будет закрыто.", MsgBoxStyle.Критично, "не удается подключиться к базе данных")
Приложение.Выход()
Конец Попытки

Конец Подводной Лодки



(куда мне это добавить???)

codejet

Суб ConTempOpen()
ConTemp.ConnectionString = "server=" & My.Settings.Хозяин &ампер; "; идентификатор пользователя=" & моя.Параметры.Пользователей &ампер; "; пароль=" & моя.Параметры.Пройти &ампер; "; базы данных= " & моя.Параметры.имя_бд &ампер; ";значение multipleactiveresultsets=true в"

- Его можно добавить в любом месте строки соединения

Рейтинг:
1

OriginalGriff

SqlConnection может поддерживать только один DataReader одновременно: когда вы "делитесь" соединением, вы должны убедиться, что читатель закрыт и удален, когда вы закончите с ним в любое время.

Лучший подход-это не "утилизировать" SQL-соединения: создать его в блоке Using, открыть, использовать и позволить системе утилизировать его, когда он выходит за пределы области действия.
Я говорил тебе это три дня назад!

Просмотрите весь свой код и удалите "общее" SqlConnection - замените его отдельными, созданными внутри блоков, когда они вам понадобятся.

И ваш цикл все еще странный: почему вы закрываете считыватель в конце первой итерации?

Цитата:
должен ли я поместить свойство соединения внутрь с помощью блока или есть способ поместить свойство в класс соединения и соединить его с новым соединением внутри с помощью блока ??????

Пожалуйста, больше не используйте несколько вопросительных знаков в общении со мной: по словам птерри, это "признак больного ума" - и он прав.

Вы можете использовать класс для инкапсуляции соединения - если это необходимо - и поместить код конструкции в блок using:
            using (MyConnection con = MyConnection.GetConnection())
                {
                Console.WriteLine("Created");
                ...
                }
...
    internal class MyConnection : IDisposable
        {
        private MyConnection() { }
        public static MyConnection GetConnection() 
            {
            return new MyConnection(); 
            }

        #region IDisposable Support
        private bool disposedValue = false; // To detect redundant calls

        protected virtual void Dispose(bool disposing)
            {
            Console.WriteLine("Disposing");
 ...
            }

        public void Dispose()
            {
            // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
            Dispose(true);
            // TODO: uncomment the following line if the finalizer is overridden above.
            // GC.SuppressFinalize(this);
            }
        }
И система автоматически отбросит его, когда он выйдет за рамки.


Извините, забыл, что вы используете VB.
   Using con As MyConnection = MyConnection.GetConnection()
            Console.WriteLine("Created")
        End Using
...
    Friend Class MyConnection
        Inherits IDisposable

        Private Sub New()
        End Sub

        Public Shared Function GetConnection() As MyConnection
            Return New MyConnection()
        End Function

        Private disposedValue As Boolean = False

        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            Console.WriteLine("Disposing")
            ...
        End Sub

        Public Sub Dispose()
            Dispose(True)
        End Sub
    End Class


Xion1624

должен ли я поместить свойство соединения внутрь с помощью блока или есть способ поместить свойство в класс соединения и соединить его с новым соединением внутри с помощью блока ??????

ZurdoDev

VB не имеет того типа использования, о котором он говорит.

Как я уже сказал в своем решении, вы должны удалить код закрытия из своего цикла.

Xion1624

уже сделал что братан все та же ошибка

OriginalGriff

Хм... вы уверены:
https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/using-statement

Xion1624

извините за несколько вопросительных знаков

ZurdoDev

Эти вонючки. Когда это они его туда протащили? Я явно устарел с моим синтаксисом VB. :(

OriginalGriff

.NET 2.0, в 2005 году ... :смеяться:

Xion1624

это тот же код и для модуля тоже??

Dave Kreskowiak

Ммм... да, это так.

ZurdoDev

Да, кто-то уже указал на это. Ты проиграл. :)

Xion1624

Система Импорта.Безопасность.Криптография
Система Импорта.ИО
Импорт Базы Данных MySQL.Данных.MySqlClient

Модуль Con_Add
Общественные usrnameFriend как строку
Public Conn As New MySqlConnection

Публичное Презрение Как Новый MySqlConnection
Public MsgSubject As String = String.Пустой

Суб ConTempOpen()
ConTemp.ConnectionString = "server=" & My.Settings.Хозяин &ампер; "; идентификатор пользователя=" & моя.Параметры.Пользователей &ампер; "; пароль=" & моя.Параметры.Пройти &ампер; "; базы данных= " & моя.Параметры.имя_бд
Попробуй
Контемп.Открыть()
Поймать ex как исключение
С помощью MsgBox(исх.Сообщение &амп; vbNewLine &ампер; "проверить подключение.", MsgBoxStyle.Критично, "не удается подключиться к базе данных")
Приложение.Выход()
Конец Попытки
Конец Подводной Лодки

Подгруппы, Содержащие Вредоносные Элементы()
Коннектикут.ConnectionString = "server=" & My.Settings.Хозяин &ампер; "; идентификатор пользователя=" & моя.Параметры.Пользователей &ампер; "; пароль=" & моя.Параметры.Пройти &ампер; "; базы данных= " & моя.Параметры.имя_бд

Попробуй
Конн.Открыт()
Поймать ex как исключение
С помощью MsgBox(исх.Сообщение &амп; vbNewLine &ампер; "проверить подключение." &ампер; vbNewLine &ампер; "приложение будет закрыто.", MsgBoxStyle.Критично, "не удается подключиться к базе данных")
Приложение.Выход()
Конец Попытки

Конец Подводной Лодки


Функция MD5Encrypter(ByVal strPass As String) As String


Dim Hasher Как Новый MD5CryptoServiceProvider
Dim PasswordBytes As Byte() = новый байт(strPass.Длина + 3) {}
Dim HashBytes Как Байт()

Для i As Integer = 0 To strPass.Длина - 1
PasswordBytes(i) = CByte(Asc(strPass(i)))
Следующий
PasswordBytes(strPass.Длина) = CByte(90)
PasswordBytes(strPass.Длина + 1) = CByte(85)
PasswordBytes(strPass.Длина + 2) = CByte(66)
PasswordBytes(strPass.Длина + 3) = CByte(73)

HashBytes = Хешер.Метода Computehash(PasswordBytes)

Dim NewHashBytes As Byte() = Новый Байт(HashBytes.Длина + 3) {}

Для J как integer = 0 в функцию hashbytes.Длина - 1
newhashBytes(j) = hashBytes(j)
Следующий
newhashBytes(функцию hashbytes.Длина) = CByte(90)
newhashBytes(функцию hashbytes.Длина + 1) = CByte(85)
newhashBytes(функцию hashbytes.Длина + 2) = CByte(66)
newhashBytes(функцию hashbytes.Длина + 3) = CByte(73)

strPass = конвертировать.ToBase64String(newhashBytes)
Возврат strPass
Конечная Функция

Функция ImageToBytes(ByVal imgPath As String) As String
Попробуй
Dim Image_DP As Image = Изображение.FromFile(imgPath)
Тусклые Воспоминания Как Поток Памяти = Новый Поток Памяти()
Image_DP.Сохранить(Накопители, Системы.Рисование.Изображений.ImageFormat.Png)
Dim ImageBytes As Byte() = Memories.Метод toArray()

Dim StringImage As String = Convert.ToBase64String(ImageBytes)

Вернуться StringImage


Поймать ex как исключение
MsgBox(ex.Message & vbNewLine & "не удалось преобразовать изображение в байты.", MsgBoxStyle.Критично, "Произошла Ошибка")
Конец Попытки

Конечная Функция




Конечный Модуль
(это мой модуль подключения)

Dave Kreskowiak

Ты все еще делаешь то, что я сказал тебе не делать 4 дня назад.

Видите эту строку "Public ConTemp As New MySqlConnection" в верхней части вашего кода? НЕ ДЕЛАЙ ЭТОГО! Вот почему у вас есть проблема, которую вы не можете решить.

Всегда создавайте объект подключения там, где он вам нужен, а не глобально в модуле или классе.


..и еще кое-что, чего вы не понимаете, это то, что MD5-это не шифрование. Это криптографический хэш. Шифрование может быть отменено, чтобы вернуть исходный контент. Хэши не могут быть отменены.