Member 10669301 Ответов: 1

Как я решаю эту ошибку "ССЫЛКА на объект не установлена на экземпляр объекта".


Imports System.Data.SqlClient

Public Class Form2
    Public myConn As SqlConnection
    Public myCmd As SqlCommand
    Public myReader As SqlDataReader
    Public results As String

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Create a Connection object.
        myConn = New SqlConnection("Data Source=RADIANT-PC\SQLEXPRESS;Initial Catalog=crop;Integrated Security=True")
    End Sub
    'To set up the Command object, which contains the SQL query, add the following code to the Form1_Load event procedure
    'Create a Command object.

    Private Sub btnAddState_Click(sender As Object, e As EventArgs) Handles btnAddState.Click

        Try
            
            myCmd.CommandText = "INSERT INTO [dbo].[tblState] ([statename]) VALUES ('" & txtAddState.Text & "')"
            myCmd.Connection = myConn
            myConn.Open()
            myCmd.ExecuteNonQuery()
            MsgBox("Succesfully Added", MsgBoxStyle.Information, "add")
            myCmd.Dispose()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        
    End Sub
   
End Class


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

'Try
            '    Get
            '        myCmd.CommandType = System.Data.CommandType.Text
            '    End Get
            '    Set(ByVal value As Integer)
            '        myCmd.CommandText = ""

            '    End Set
            'Catch ex As Exception
            '    MessageBox.Show(ex.Message)
            'End Try

Richard MacCutchan

Где происходит ошибка?

1 Ответов

Рейтинг:
0

MadMyche

Здесь определенно чего-то не хватает; а также большой Уязвимость SQL-инъекции
NEVER EVER следует ли создавать SQL-запрос из объединения SQL-команд и переменных

'To set up the Command object, which contains the SQL query, add the following code to the Form1_Load event procedure
'Create a Command object.

Private Sub btnAddState_Click(sender As Object, e As EventArgs) Handles btnAddState.Click
	Try
        	myCmd.CommandText = "INSERT INTO [dbo].[tblState] ([statename]) VALUES ('" & txtAddState.Text & "')"
		myCmd.Connection = myConn
		myConn.Open()
Приоритетным элементом является правильное добавление значения, хранящегося в переменной, в ваш запрос. Это будет сделано с помощью SqlParameter Две строки для этого будут состоять из повторного определения текста запроса, а также добавления параметра и значения в команду.
Dim query As String = "INSERT INTO [dbo].[tblState] ([statename]) VALUES (@sn)"
' other lines of code... later
myCmd.Parameters.AddWithValue("@sn", txtAddState.Text)
Теперь о том, чего не хватает... и это было бы так myCmd Вы никогда не определяете его как SqlCommand, вы просто пытаетесь начать корректировать свойства.
Вы также можете использовать перегрузки этого объекта так, чтобы соединение и свойство CommandText выполняются при объявлении переменной.

Я полагаю, что ваша проблема заключается в том, что myCmd. Хотя он объявлен в верхней части страницы; на самом деле он никогда не определяется в вашем коде, и пока он не определен, вы не можете получить/установить ни одно из его свойств. И пока вы определяете его, вы можете установить CommandText и свойства соединения с помощью перегруженного конструктора.
В сочетании с описанным выше исправлением уязвимости мы теперь рассматриваем этот блок кода
Try
	Dim query As String = "INSERT INTO [dbo].[tblState] ([statename]) VALUES (@sn)"
	myCmd = New SqlCommand(query, myConn) 
	myCmd.Parameters.AddWithValue("@sn", txtAddState.Text)

	myConn.Open()
Справочник по SQL параметр :
Класс SqlParameter (System.Data.SqlClient) | Microsoft Docs[^]


Richard MacCutchan

Public myCmd As SqlCommand

находится в верхней части определения формы.

MadMyche

О, я пропустил это, обновлю ответ

Richard MacCutchan

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

MadMyche

Ну что ж, спасибо.