Как закрыть sqldatareader в операторе Using? - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел бы использовать этот код для проверки наличия дублирования перед сохранением данных в базе данных.Как я должен закрыть sqldatareader?(Что и как показывает ошибка)

con.ConnectionString = "Data Source=PC85AAIEw\SQLEXPRESS;Initial Catalog=Student;Integrated Security=True"
cmd.Connection = con

con.Open()

Dim theQuery As String = "SELECT * FROM Profile WHERE RollNo=@RollNo AND Name=@Name"
Dim cmd1 As SqlCommand = New SqlCommand(theQuery, con)
cmd1.Parameters.AddWithValue("@RollNo", TextBox1.Text)
cmd1.Parameters.AddWithValue("@Name", TextBox2.Text)

Using reader As SqlDataReader = cmd1.ExecuteReader()
    If reader.HasRows Then
        MessageBox.Show("User already registered! Please try again.", "Error", MessageBoxButtons.OK)
    Else
        cmd.CommandText = "INSERT INTO Profile VALUES ('" & rollno & "' , '" & name & "' , '" & gender & "' , '" & address & "' , '" & phoneno & "' , '" & datereg & "' , '" & faculty & "' , '" & course & "' , '" & semester & "')"
        MessageBox.Show("Profile has been successfully registered!", "Thank you", MessageBoxButtons.OK)
        i = cmd.ExecuteNonQuery()
    End If
End Using
con.Close()

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

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

 using(var con=new Sqlconnection("Data Source=PC85AAIEw\SQLEXPRESS;Initial Catalog=Student;Integrated Security=True")){
cmd.Connection = con

con.Open()

Dim theQuery As String = "SELECT * FROM Profile WHERE RollNo=@RollNo AND Name=@Name"
Dim cmd1 As SqlCommand = New SqlCommand(theQuery, con)
cmd1.Parameters.AddWithValue("@RollNo", TextBox1.Text)
cmd1.Parameters.AddWithValue("@Name", TextBox2.Text)

Using reader As SqlDataReader = cmd1.ExecuteReader()
    If reader.HasRows Then
        MessageBox.Show("User already registered! Please try again.", "Error", MessageBoxButtons.OK)
    Else
        cmd.CommandText = "INSERT INTO Profile VALUES ('" & rollno & "' , '" & name & "' , '" & gender & "' , '" & address & "' , '" & phoneno & "' , '" & datereg & "' , '" & faculty & "' , '" & course & "' , '" & semester & "')"
        MessageBox.Show("Profile has been successfully registered!", "Thank you", MessageBoxButtons.OK)
        i = cmd.ExecuteNonQuery()
    End If
End Using
con.Close()}
0 голосов
/ 26 сентября 2018

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

Кроме того, существуют некоторые проблемы с вашим кодом:

  • Настоятельно рекомендуется использовать, а затем утилизировать SqlConnections по мере их использования, не пытайтесь использовать их глобально в своем приложении.,Клиентская библиотека ado.net SQL Server по умолчанию будет обрабатывать пулы соединений для вас.
  • Вы должны использовать параметры со вставкой так же, как и при выборе.
  • Не использовать AddWithValue при добавлении параметров, вместо этого используйте конструктор, а также укажите тип данных sql.Если RollNo - это число (например, целое число), то вы должны передать значение как целое число вашему параметру.Я предположил, что это строка, хранящаяся в varchar.
  • Обернуть все типы, которые реализуют операторы IDisposable в Using, чтобы обеспечить высвобождение ресурсов.( В случае, если кто-то хочет придираться, нет, это не требуется для SqlCommand, в этом случае .)
Dim recordExists As Boolean
Using con As SqlConnection = New SqlConnection("Data Source=PC85AAIEw\SQLEXPRESS;Initial Catalog=Student;Integrated Security=True")
Using cmd As SqlCommand = New SqlCommand("SELECT RollNo FROM Profile WHERE RollNo=@RollNo AND Name=@Name", con)
    cmd.Parameters.Add("@RollNo", SqlDbType.VarChar).Value = TextBox1.Text
    cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = TextBox2.Text

    con.Open()
    Using reader As SqlDataReader = cmd.ExecuteReader()
        recordExists = reader.HasRows
    End Using
End Using
End Using

If recordExists Then
    MessageBox.Show("User already registered! Please try again.", "Error", MessageBoxButtons.OK)
Else
    Using con As SqlConnection = New SqlConnection("Data Source=PC85AAIEw\SQLEXPRESS;Initial Catalog=Student;Integrated Security=True")
    Using cmd As SqlCommand = New SqlCommand("INSERT INTO Profile (RollNo, Name) VALUES (@RollNo, @Name)", con)
        cmd.Parameters.Add("@RollNo", SqlDbType.VarChar).Value = TextBox1.Text
        cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = TextBox2.Text
        con.Open()
        cmd.ExecuteNonQuery()
        MessageBox.Show("Profile has been successfully registered!", "Thank you", MessageBoxButtons.OK)
    End Using
    End Using
End If
...