2015-01-25 3 views
0

Я столкнулся с этой проблемой, моя база данных - это локальный хост, и у всех остальных форм у меня нет проблем, но здесь, когда я нажимаю кнопку обновления, я получаю эту ошибку, которая очень разочарование, поскольку я очень уверен, что соединение SQL должно быть открытым! Мой код для кнопки указан.Неверная попытка прочитать, когда читатель закрыт. Ошибка

Error: 'Invalid attempt to read when reader is closed'

Private Sub UpdateButton_Click(sender As Object, e As EventArgs) Handles UpdateButton.Click 

    MysqlConn = New MySqlConnection 
    MysqlConn.ConnectionString = "server=localhost;userid=root;password=alpine;database=database1" 
    Dim Reader As MySqlDataReader 

    Dim vals(2, 2) As Decimal 
    vals(0, 2) = Convert.ToDecimal(Cbudget.Text.ToString - OutBox.Text.ToString + InBox.Text.ToString) 
    vals(1, 0) = Convert.ToDecimal(Newfigbox.Text.ToString) 
    vals(2, 0) = Convert.ToDecimal(OutBox.Text.ToString - InBox.Text.ToString) 
    vals(1, 1) = Convert.ToDecimal(FigureBox.Text.ToString + Newfigbox.Text.ToString) 

    Try 
     MysqlConn.Open() 
     Dim Query As String 
     Query = "UPDATE accounts SET Current_Budget='" & vals(1, 0) & "';" 
     Command = New MySqlCommand(Query, MysqlConn) 
     Reader = Command.ExecuteReader 
     MysqlConn.Close() 
    Catch ex As MySqlException 
     MessageBox.Show(ex.Message) 
     MysqlConn.Close() 
    End Try 

    Try 
     MysqlConn.Open() 
     Dim Query As String 
     Query = "UPDATE stocktable, clientdetails SET stocktable.Quantity='" & vals(1, 1) & "', clientdetails.Balance='" & vals(2, 0) & "' WHERE 'stocktable.Type_Of_Metal' ='" & ComboBox1.Text & "' AND 'clientdetails.Name' ='" & ClientBox.Text & "';" 
     Command = New MySqlCommand(Query, MysqlConn) 
     Reader = Command.ExecuteReader 
     MysqlConn.Close() 
    Catch ex As MySqlException 
     MessageBox.Show(ex.Message) 
     MysqlConn.Close() 
    End Try 
    Cbudget.Text = Nothing 
    Try 
     MysqlConn.Open() 
     Dim Query As String 
     Query = "SELECT Current_Budget FROM accounts" 
     Command = New MySqlCommand(Query, MysqlConn) 
     Reader = Command.ExecuteReader 
     MysqlConn.Close() 
     While Reader.Read 
      vals(0, 1) = Reader.GetDecimal("Current_Budget") 
      Cbudget.Text = vals(0, 1) 
     End While 
     MysqlConn.Close() 
    Catch ex As MySqlException 
     MessageBox.Show(ex.Message) 
     MysqlConn.Close() 
    End Try 

End Sub' 
+2

Возможно это ошибка копирования вставки. В последнем запросе вы закрываете соединение перед чтением. Удалите это закрытие. – Steve

ответ

2

Возможно, ваша проблема просто ошибка копирования/вставки. Кажется, что перед выполнением чтения для последней команды SELECT вы закрываете соединение. (Как и в предыдущих двух командах UPDATE) Это действительно является причиной вашего сообщения об ошибке.
Но часть этого у вас есть другие проблемы в вашем коде.

Первый. вы должны отправить UPDATE с помощью ExecuteNonQuery. ExecuteReader используется, когда вы хотите прочитать что-то из своей базы данных с помощью запроса SELECT. Он также работает для UPDATE/INSERT/DELETE и т. Д., Но инфраструктура, созданная для чтения, не нужна и, следовательно, является бесполезным потреблением ресурсов.

Второй. Вы можете отправить две (или более) команды, используя один командный текст. Просто разделите две команды точкой с запятой и выполните командный текст через ExecuteNonQuery

Third. Вы всегда должны использовать параметризованный запрос, чтобы избежать Sql Injection и проблемы с анализом ваших значений. Например, десятичное число содержит десятичный разделитель, который в вашей локали выражается через определенный символ, но в других местах различен, и, следовательно, ваши запросы перестают работать. (То же самое происходит и с обычными строками, содержащими одну цитату). Параметрический подход устранит обе эти проблемы.

И, наконец,. Все доступные предметы, такие как Подключения, Команды и Читатели, должны быть удалены, когда вы закончите использовать их. Using Statement обеспечивает это правильное поведение (А если задуматься о закрытии связи End Using также закрыть соединение)

Dim vals(2, 2) As Decimal 
vals(0, 2) = Convert.ToDecimal(Cbudget.Text.ToString - OutBox.Text.ToString + InBox.Text.ToString) 
vals(1, 0) = Convert.ToDecimal(Newfigbox.Text.ToString) 
vals(2, 0) = Convert.ToDecimal(OutBox.Text.ToString - InBox.Text.ToString) 
vals(1, 1) = Convert.ToDecimal(FigureBox.Text.ToString + Newfigbox.Text.ToString) 

Query = "UPDATE accounts SET [email protected]; " & _ 
     "UPDATE stocktable, clientdetails " & _ 
     "SET [email protected], " & _ 
     "[email protected] " & _ 
     "WHERE `stocktable`.`Type_Of_Metal` = @type " & _ 
     "AND `clientdetails`.`Name` = @client;" 
Try 
    Using MysqlConn = New MySqlConnection(...constring here...) 
    Using Command = New MySqlCommand(Query, MysqlConn) 
     command.Parameters.AddWithValue("@budget", vals(1, 0)) 
     command.Parameters.AddWithValue("@qty", vals(1, 1)) 
     command.Parameters.AddWithValue("@bal", vals(2, 0)) 
     command.Parameters.AddWithValue("@type", ComboBox1.Text) 
     command.Parameters.AddWithValue("@client", ClientBox.Text) 
     command.ExecuteNonQuery() 

     Command.CommandText = "SELECT Current_Budget FROM accounts" 
     Command.Parameters.Clear()   
     Using Reader = Command.ExecuteReader() 
      While Reader.Read 
       vals(0, 1) = Reader.GetDecimal("Current_Budget") 
       Cbudget.Text = vals(0, 1) 
      End While 
     End Using 
    End Using 
Catch ex As MySqlException 
    MessageBox.Show(ex.Message) 
End Try 
Смежные вопросы