Member 13974630 Ответов: 2

Нет значения для одного или нескольких обязательных параметров (VB net ms-access)


у меня есть 2 datatable с этим полем
*dataordner
1. архивируйте дату/время (datetimepicker, это уже данные)
2. хранение короткого текста (combobox)
3. BulanOrdner ShortText (комбобокс)
4. TahunOrdner Дата/Время (datetimepicker)

*datalemari
1. архивируйте дату/время (datetimepicker, это уже данные)
2. хранение короткого текста (combobox)
3. короткий текст Лемари (combobox)
4. BulanOrdner ShortText (комбобокс)
5. TahunOrdner Дата/Время (datetimepicker)

и я теперь очень запутался, почему я ошибаюсь

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

я покончил со своими кодами, но всегда ошибался с этой ошибкой "нет значения, заданного для еще одного...."
я вызываю 2 таблицы с if else в combobox(хранилище)
это мои коды, я думаю, что это все верно с выбранным элементом в combobox
записка:
хранение = combobox
Private Sub storage_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles storage.SelectedIndexChanged
    If storage.SelectedIndex = 1 Then
        groupordner.Visible = True
        grouplemari.Visible = False
    Else
        If storage.SelectedIndex = 2 Then
            groupordner.Visible = False
            grouplemari.Visible = True
        End If
    End If
End Sub

Private Sub save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles save.Click
    If storage.SelectedItem = "Ordner" Then
        str = "Update dataordner set Storage = " & storage.Text & ", BulanOrdner = " & bulanordner.Text & ", TahunOrdner = '" & tahunordner.Value & "' Where Archive = '" & tanggalarchive.Value & "'"
        proses.ExecuteNonQuery(str)
        MsgBox("Data Has Been Saved", MessageBoxButtons.OK)
        Call bersih()
        Call data_penjualan()
    Else
        If storage.SelectedItem = "Lemari" Then
            str = "Update datalemari set Storage = " & storage.Text & ", Lemari = " & lemari.Text & ", BulanLemari = " & bulanlemari.Text & ", TahunLemari = '" & tahunlemari.Value & "' Where Archive = '" & tanggalarchive.Value & "'"
            proses.ExecuteNonQuery(str)
            MsgBox("Data Has Been Saved", MessageBoxButtons.OK)
            Call bersih()
            Call data_penjualan()
        End If
    End If
End Sub

Bryian Tan

Не ясно, какая строка выбрасывает ошибку, но выглядит как lemari.Text, storage.Текст-это строка, которая должна быть обернута в " ex: '" & storage.Текст & "'

2 Ответов

Рейтинг:
2

Maciej Los

В дополнение к решению OriginalGriff, я бы рекомендовал разделить ваше на ДАЛМАТИНЕЦ[^] и БЛЛ[^].
Причина, по которой вы должны это сделать, описана в ссылочных статьях.

Чтобы выяснить, почему вы получаете такую ошибку, вы должны отладить свою программу: Научитесь отлаживать с помощью отладчика Visual Studio - Visual Studio | Microsoft Docs[^]

Я думаю, что у тебя есть oledbexception (0x80040e10), что означает, что вы не предоставили параметр, который является обязательным. Видеть: Ошибки OLEDB[^]

Несколько слов о коде:
1. Ваш код не возвращает результат ExecutNonQuery метод, так что понятия не имею, был ли этот метод успешным.
2. Ваш код не имеет обработчика ошибок... Это хорошая практика программирования, чтобы поймать ошибки с помощью кода. Взгляните на приведенный ниже код. Это не идеально, но это хорошо для начала.

Function GetEmployee(Optional ByVal empIdToFind As Integer = 111) Ad DataTable
    Dim dt As DataTable = New DataTable()
	Try
		Dim sConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[FullFileNameOfMsAccessDatabase];Persist Security Info =False;"
		Dim oRdr As OleDbDataReader
			
		Using oConn As OleDbConnection = New OleDbConnection(sConn)
			oConn.Open()
			Using oComm AS OleDbCommand = New OleDbCommand()
				oComm.Connection = oConn
				oComm.CommandType = CommandType.Text
				'using named paramters
				oComm.CommandText =  "SELECT * FROM MyUsers WHERE EmpId=@empid;"
				oComm.Parameters.AddWithValue("@empid", empIdToFind)
				oComm.ExecuteNonQuery()
				oRdr = oComm.ExecuteReader()
				dt.Load(oRdr)

			End Using
			oConn.Close()
		End Using
	
	Catch ex As Exception
		Console.WriteLine(ex.Message)
	
	End Try
    Return dt
End Function

Вышеуказанная функция требует empIdToFind входной параметр, чтобы иметь возможность возвращать DataTable (полная запись).
Примечание: порядок именованных/неназванных параметров имеет значение!
3. Настоящий кодекс:
If storage.SelectedIndex = 1 Then
    groupordner.Visible = True
    grouplemari.Visible = False
Else
    If storage.SelectedIndex = 2 Then
        groupordner.Visible = False
        grouplemari.Visible = True
    End If
End If

может быть упрощен в форме:
groupordner.Visible = If(storage.SelectedIndex=1, True, False)
grouplemari.Visible = Not groupordner.Visible

Видеть: Оператор If (Visual Basic) | Microsoft Docs[^]

Удачи вам!


Member 13974630

спасибо за совет, теперь в vb "данные сохранены", но данные не вводятся в access, как сделать так, чтобы данные появились в базе данных? Вы не могли бы мне помочь??

Maciej Los

Где находится база данных? В папке bin каталога проекта?

Рейтинг:
1

OriginalGriff

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

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

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

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


Member 13974630

вы сказали, что я редактирую свои коды с помощью этого?

Если хранение.SelectedItem = "Ordner" Тогда
str = "Update dataordner set Where Archive = @tanggalarchive"
command = New OleDbCommand(str, con)
команда.Parameters.Add("@storage", OleDbType.VarChar).Значение = хранение.Текст
команда.Parameters.Add("@bulanorder", OleDbType.VarChar).Значение = буланорднер.Текст
команда.Parameters.Add("@tahunorder", OleDbType.Date).Значение = тахунорднер.Ценность
команда.Parameters.Add("@tanggalarchive", OleDbType.Date).Значение = tanggalarchive.Ценность
прозы.ExecuteNonQuery(str)
MsgBox("Данные Сохранены", MessageBoxButtons.ОК)
Звоните берсих()
Позвоните data_penjualan()
Еще

OriginalGriff

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

OriginalGriff

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

Member 13974630

Попробуй
Если хранение.SelectedItem = "Ordner" Тогда
str = "Update dataordner set Storage = @storage, BulanOrdner = @bulanordner, TahunOrdner = @tahunordner Where Archive = @tanggalarchive"
command = New OleDbCommand(str, con)
команда.Parameters.Add("@storage", OleDbType.VarChar).Значение = хранение.Текст
команда.Parameters.Add("@bulanorder", OleDbType.VarChar).Значение = буланорднер.Текст
команда.Parameters.Add("@tahunorder", OleDbType.Date).Значение = тахунорднер.Ценность
команда.Parameters.Add("@tanggalarchive", OleDbType.Date).Значение = tanggalarchive.Ценность
прозы.ExecuteNonQuery(str)
команда.Метод executenonquery()
MsgBox("Данные Сохранены", MessageBoxButtons.ОК)
Звоните берсих()
Позвоните data_penjualan()
Еще

команда.ExecuteNonQuery() *****ошибка здесь

OriginalGriff

Ну а чего ты ожидал?
Вы пытаетесь сделать один и тот же запрос дважды!
Один раз без каких-либо данных параметров и один раз с ними...

Member 13974630

правка, теперь уже сохранена, но данные не вводятся в access, как сделать так, чтобы данные появились в базе данных? Вы не могли бы мне помочь??