Member 12495621 Ответов: 2

Получив ошибку "ССЫЛКА на объект не установлена на экземпляр объекта" , пожалуйста, кто-нибудь мне поможет.


во время выполнения моего кода получаю эту ошибку. Пожалуйста, помогите мне.

У меня есть два соединения (conl и conr)
использование sql dataadapter и dataset для выбора данных из conl.dbo.txnenrollment и вставки их в conr.dbo.txnenrollment.
Не в состоянии понять, где ошибка.

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

Dim conr As String = ("Data Source=MOONLOADER\MSSQLSERVER2005;Initial Catalog=SSBYM;User ID=sa;Password=sasa")
    Private Sub btnupload_Click(sender As Object, e As RoutedEventArgs) Handles btnupload.Click
        Try
            sqlcon = New SqlConnection(conr)
            sqlcon = New SqlConnection(conl)
            Dim da As New SqlDataAdapter()
            Dim ds As New DataSet()
            sqlcon.Open()
            da.SelectCommand.Connection = New SqlConnection(conl)
            da.SelectCommand = New SqlCommand("select * from dbo.TxnEnrollment where URN not in (select URN from dbo.URN)")
            da.Fill(ds)
            da.InsertCommand.Connection = New SqlConnection(conr)
            da.InsertCommand = New SqlCommand("insert into dbo.TxnEnrollment where URN not in (select URN from dbo.TxnEnrollment)")
            cmd.Parameters.Clear()
            sqlcon.Close()
            MessageBox.Show("Uploaded Successfully")
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())

        End Try


    End Sub
End Class

F-ES Sitecore

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

2 Ответов

Рейтинг:
2

Afzaal Ahmad Zeeshan

Цитата:
У меня есть два соединения (conl и conr)
Нет, у тебя есть только один.
sqlcon = New SqlConnection(conr)
sqlcon = New SqlConnection(conl)
Ваш второй вызов конструктора переопределяет предыдущий, так что sqlcon всегда указывает на экземпляр с помощью conl строка подключения. А ты продолжай и сделай еще хуже с этой строкой,
da.SelectCommand.Connection = New SqlConnection(conl)
Теперь вы создаете новый экземпляр и передаете его в Connection собственность—это может привести к утечке памяти- Не только это, вот ты опять это делаешь,
da.InsertCommand.Connection = New SqlConnection(conr)
И хотя очень непонятно, откуда это берется cmd откуда он взялся?
cmd.Parameters.Clear()
Это может быть причиной нахождения нулевого указателя и возникновения исключения. Вы можете проверить против,
' Excuse my illiteracy in VB.NET
If cmd IsNot Nothing Then
    cmd.Parameters.Clear()
End If
Это может быть в состоянии преодолеть ошибку в этом коде, но вы будете натыкаться на подобные ошибки и в будущем, поэтому, пожалуйста, я рекомендую, вместо того чтобы исправлять эту ошибку—как бы важно это ни было—пожалуйста, изучите некоторые стратегии разработки баз данных и то, как объекты повторно используются в этом процессе.

Пожалуйста, прочтите мою статью об этом, Как подключить базу данных SQL к вашей программе C#, учебник для начинающих[^], это может дать вам представление о том, как базы данных SQL Server должны быть запрограммированы в .NET, эта статья находится в C#, вы можете связать ее с VB.NET.

Кроме того, в качестве бонуса я могу рассказать вам еще несколько вещей о вашем коде, перепишите его так,
' Create instances; ignore Dim if you have fields with these names
Dim sqlconr As SqlConnection = New SqlConnection(conr)
Dim sqlconl As SqlConnection = New SqlConnection(conl)

Dim da As New SqlDataAdapter()
Dim ds As New DataSet()

' Open connections
sqlconr.Open()
sqlconl.Open()

' Now connect connections with commands; reuse the existing ones
da.SelectCommand.Connection = sqlconl
da.SelectCommand = New SqlCommand("select * from dbo.TxnEnrollment where URN not in (select URN from dbo.URN)")
da.Fill(ds)
da.InsertCommand.Connection = sqlconr

' I would comment this
' cmd.Parameters.Clear() 

' End with
sqlconr.Close()
sqlconl.Close()
Это может быть лучший подход, но все же неясно, что вам действительно нужно. :-)


Member 12495621

Здравствуйте Afzaal! спасибо за ваш ответ и детальное исследование. По вашему совету я изменил свой код, но опять та же ошибка.
На самом деле у меня есть столбцы с нулевым значением в некоторых строках. Мне нужно вставить данные с одного сервера на другой. Независимо от того, есть нулевое значение или нет.
Теперь мой код таков.

Система Импорта.Сведения
Импортирует System.Data.Sql
Система Импорта.Данных.Поставщики sqlclient
Система Импорта.Конфигурация
Система Импорта.В LINQ


Класс MainWindow
Dim sqlcon как новый SqlConnection
Dim cmd как новая команда SqlCommand
Dim conl As String = ConfigurationManager.Соединительные нити("conl").Параметр connectionString
Dim conr As String = ("источник данных=MOONLOADER\MSSQLSERVER2005;начальный каталог=SSBYM;идентификатор пользователя=sa;пароль=sasa")
Private Sub btnupload_Click(sender As Object, e As RoutedEventArgs) обрабатывает btnupload.Щелчок
Попробуй
Dim sqlconnr As SqlConnection = New SqlConnection(conr)
Dim sqlconl As SqlConnection = New SqlConnection(conl)
Dim da как новый SqlDataAdapter()
Dim ds как новый набор данных()
sqlconr.Открыть()
sqlconl.Открыть()
да.Команды selectcommand.Соединение = sqlconl
да.Команды selectcommand = новая команда sqlcommand("Select * из таблицы dbo.TxnEnrollment где урна не в (выбрать урну с ДБО.Урна)")
да.Заполнить(ДС)
папа.Команды insertcommand.Соединение = sqlconr
папа.InsertCommand = New SqlCommand("вставить в dbo.TxnEnrollment где урна не в (выбрать урну с ДБО.TxnEnrollment)")
Если cmd-это не Ничто, то
cmd.параметры.Четкий()
Конец, Если
sqlconr.Закрывать()
sqlconl.Закрывать()
Ящик для сообщений.Show("Успешно Загружено")
Поймать ex как исключение
Ящик для сообщений.Показать(напр.сообщение.Метод toString())

Конец Попытки

Конец Подводной Лодки
End Класса

Рейтинг:
2

OriginalGriff

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

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

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

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

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


Member 12495621

Спасибо за ваш ответ и Совет. Я сделал так, как вы сказали, но это не работает, потому что мой код не провалился VB.net. Он работает правильно, и ошибка Камминг из программы, а не из VB.Так что не удалось выяснить кодировку ошибки с помощью VB. Спасибо, что дали мне краткое описание нулевого значения.