VB.NET SQL Server Вставка - ExecuteNonQuery: свойство подключения не было инициализировано - PullRequest
4 голосов
/ 15 июня 2011

В событии загрузки формы я подключаюсь к базе данных SQL Server:

Private Sub AddBook_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            myConnection = New SqlConnection("server=.\SQLEXPRESS;uid=sa;pwd=123;database=CIEDC")
            myConnection.Open()

End Sub

Здесь, в событии Вставка, я использую следующий код:

Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAdd.Click
            Try
                myConnection.Open()
                myCommand = New SqlCommand("INSERT INTO tblBook(BookCode, BookTitle, Author, PublishingYear, Price, EnterDate, CatID, RackID, Amount) VALUES('" & txtBookCode.Text & "','" & txtTitle.Text & "','" & txtAuthor.Text & "','" & txtPublishYear.Text & "','" & txtPrice.Text & "', #" & txtEnterDate.Text & "#, " & txtCategory.Text & "," & txtRack.Text & "," & txtAmount.Text & ")")
                myCommand.ExecuteNonQuery()
                MsgBox("The book named '" & txtTitle.Text & "' has been inseted successfully")
                ClearBox()
            Catch ex As Exception
                MsgBox(ex.Message())
            End Try
            myConnection.Close()
End Sub

И выдает следующую ошибку:

ExecuteNonQuery: Connection property has not been initialized

Ответы [ 5 ]

8 голосов
/ 15 июня 2011
  1. Назначение соединения - Вы не устанавливаете свойство соединения для SQLCommand. Вы можете сделать это без добавления строки кода. Это причина вашей ошибки.

    myCommand = New SqlCommand("INSERT INTO tblBook(BookCode, BookTitle, Author, PublishingYear, Price, EnterDate, CatID, RackID, Amount) VALUES('" & txtBookCode.Text & "','" & txtTitle.Text & "','" & txtAuthor.Text & "','" & txtPublishYear.Text & "','" & txtPrice.Text & "', #" & txtEnterDate.Text & "#, " & txtCategory.Text & "," & txtRack.Text & "," & txtAmount.Text & ")", MyConnection)
    
  2. Обработка соединения - Вам также необходимо удалить `MyConnection.Open 'из вашего обработчика нагрузки. Просто откройте и закройте его в вашем обработчике кликов, как вы это делаете в настоящее время. Это не вызывает ошибку.

  3. Параметризованный SQL - вам необходимо использовать параметры SQL, несмотря на то, что вы не используете хранимую процедуру. Это не причина вашей ошибки . Как напомнил мне Conrad , ваш исходный код выгружает значения прямо из пользователя в оператор SQL. Злоумышленники украдут ваши данные, если вы не используете параметры SQL.

    Dim CMD As New SqlCommand("Select * from MyTable where BookID = @BookID")
    CMD.Parameters.Add("@BookID", SqlDbType.Int).Value = CInt(TXT_BookdID.Text)
    
5 голосов
/ 15 июня 2011

Вам необходимо установить свойство Connection в команде:

myCommand.Connection = myConnection
4 голосов
/ 15 июня 2011

Практически то, что подразумевается в сообщении об ошибке - свойство Connection объекта SqlCommand не было назначено открытому вами соединению (в данном случае вы назвали его myConnection).

Также словосовета здесь.Чтение некоторых параметров SQL - конкатенация SQL из пользовательского ввода без каких-либо проверок работоспособности - это способ SQL-инъекций атак.

Это один из способов сделать это:

Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAdd.Click
    Try
        myConnection.Open()
        myCommand = New SqlCommand( _
        "INSERT INTO tblBook(BookCode, BookTitle, Author, PublishingYear, Price, " & _
        "                    EnterDate, CatID, RackID, Amount) " & _
        "VALUES(@bookCode, @bookTitle, @author, @publishingYear, @price, @enterDate, " & _
        "       @catId, @rackId, @amount)")
        myCommand.Connection = myConnection
        with myCommand.Parameters
            .AddWithValue("bookCode", txtBookCode.Text)
            .AddWithValue("bookTitle", txtTitle.Text)
            .AddWithValue("author", txtAuthor.Text)
            .AddWithValue("publishingYear", txtPublishYear.Text)
            .AddWithValue("price", txtPrice.Text)
            .AddWithValue("enterDate", txtEnterDate.Text)
            .AddWithValue("catId", txtCategory.Text)
            .AddWithValue("rackId", txtRack.Text)
            .AddWithValue("amount", txtAmount.Text)
        end with
        myCommand.ExecuteNonQuery()
        MsgBox("The book named '" & txtTitle.Text & "' has been inseted successfully")
        ClearBox()
    Catch ex As Exception
        MsgBox(ex.Message())
    End Try
    myConnection.Close()
End Sub
0 голосов
/ 27 августа 2014

Пожалуйста, попробуйте обернуть использование ваших соединений (в том числе просто открытие) внутри блока USING. Предполагая использование web.config для строк подключения:

    Dim connection As New SqlConnection(ConfigurationManager.ConnectionStrings("web.config_connectionstring").ConnectionString)
    Dim query As New String = "select * from Table1"
    Dim command as New SqlCommand(query, connection)

Using connection
   connection.Open()
   command.ExecuteNonQuery()
End Using

И ПАРАМЕТРИРОВАТЬ все, что введено пользователем ... пожалуйста!

0 голосов
/ 24 апреля 2014

Модуль Модуль1 Public con As System.Data.SqlClient.SqlConnection Public com As System.Data.SqlClient.SqlCommand Public ds As System.Data.SqlClient.SqlDataReader Dim sqlstr As String

Public Sub main()
    con = New SqlConnection("Data Source=.....;Initial Catalog=.....;Integrated Security=True;")
    con.Open()
    frmopen.Show()
    'sqlstr = "select * from name1"
    'com = New SqlCommand(sqlstr, con)
    Try
        com.ExecuteNonQuery()

        'MsgBox("success", MsgBoxStyle.Information)
    Catch ex As Exception
        MsgBox(ex.Message())
    End Try
    'con.Close()



    'MsgBox("ok", MsgBoxStyle.Information, )

End Sub

Конечный модуль

...