#vb.net #sqlite
#vb.net #sqlite
Вопрос:
Мне нужны все уникальные значения поля ParteB в таблице ActPartB, соответствующие одному и тому же IDNumber с userActTable, но только для условия некоторого userIDNumber (в userActTable)
Полная строка sql с «WHERE»
sql = "SELECT DISTINCT ParteB FROM ActParteB INNER JOIN userAct ON IDNumber = IDNumber WHERE userAct.userIDNumber = ? order by ParteB asc"
Затем я добавляю
cmdConnection.Parameters.AddWithValue("@userIDNumber", NumberOfActiveuser)
Программа запускается без ошибки отладки, но она показывает все уникальные поля ActPartB независимо от значения userIDNumber. Значение os userIDNumber подходит, потому что.
Просто WHERE «игнорируется»
Это
sql = "SELECT DISTINCT ParteB FROM ActParteB INNER JOIN userAct ON IDNumber = IDNumber WHERE userAct.userIDNumber = ? order by ParteB asc"
Выдает тот же результат, что и этот
sql = "SELECT DISTINCT ParteB FROM ActParteB INNER JOIN userAct ON IDNumber = IDNumber order by ParteB asc"
Что не так с предложением Where?
Полный код здесь:
Using conn As New SQLiteConnection(SQLiteConnStr)
Try
conn.Open()
Dim cmdConnection As SQLiteCommand = New SQLiteCommand(sql, conn)
Dim sql = "SELECT DISTINCT ParteB FROM ActParteB INNER JOIN userAct ON IDNumber = IDNumber WHERE userAct.userIDNumber = ? order by ParteB asc"
cmdConnection.Parameters.AddWithValue("@userIDNumber", NumberOfActiveUser)
Dim readerParteB As SQLiteDataReader = cmdConnection.ExecuteReader()
ParteBComboBox.Items.Clear()
Try
While (readerParteB.Read())
ParteBComboBox.Items.Add(readerParteB("ParteB"))
End While
Catch ex As Exception
MsgBox(ex.ToString())
End Try
Catch ex As Exception
MsgBox(ex.ToString())
End Try
End Using
Комментарии:
1. Я никогда не использовал SQLite ADO.NET поставщик, но я заметил, что вы пишете свой SQL с позиционным параметром. Знаете ли вы, поддерживает ли этот поставщик именованные параметры, т. Е. Можете ли вы использовать «@userIDNumber» в вашем SQL вместо «?»?
2. Потому что что? И показывает весь код запроса.
3. @jmcilhinney да, я использую параметры в SQLite для записи и запроса типа «Dim sql = «ВСТАВИТЬ В ЗНАЧЕНИЯ usersTable (ИМЯ пользователя) (@paramUserName)»» без проблем. Я впервые использую JOIN и WHERE.
4. Не должно
INNER JOIN userAct ON IDNumber = IDNumber
бытьINNER JOIN userAct ON userAct.IDNumber = ActParteB.IDNumber
?5. @Jinx88909 ПРАВИЛЬНО!!! Ошибка заключалась в части «В IDNumber = IDNumber», в обеих таблицах с одинаковым именем поля, поэтому решением, отмеченным Jinx88909, было использование полной таблицы. Имя поля. Использование
ON ActParteB.IDNumber = userAct.IDNumber
работает нормально! Как я могу пометить ответ Jinx88909 как действительный?
Ответ №1:
Dim cmdConnection As SQLiteCommand = New SQLiteCommand(sql, conn)
Dim sql = "..."
Ваша команда работает некорректно, потому что она использует другую строку SQL (значение какой-то другой sql
переменной, которую вы объявили в какой-то предыдущей части кода).
Кроме того, как упоминалось в Jinx88909, вы должны добавить имена таблиц в объединение, чтобы указать, какой IDNumber
столбец вы имеете в виду (в случае сомнений база данных, конечно, выберет неправильный):
... JOIN userAct ON userAct.IDNumber = ActParteB.IDNumber ...
^^^^^^^^ ^^^^^^^^^^
В качестве альтернативы, когда имена столбцов совпадают, лучше использовать USING , который автоматически получает столбец из обеих таблиц:
... JOIN userAct USING (IDNumber) ...
Комментарии:
1. Даже изменив Dim sql = «….» на Dim sqlB = «….», я получаю то же самое. Запрос работает за вычетом ГДЕ userAct.userIDNumber = ? Фильтр. Я в замешательстве по этому поводу.
2. Я исправил код в ответе, сначала Dim Sql, а затем DIM cmdConnection
3. Я не понимаю, почему CL отредактировал код. Даже с Dim Sql перед Dim cmdConnection предложение WHERE не работает.
4. Это не форум; не изменяйте вопрос таким образом, чтобы ответы были недействительными.
5. Я потерял последнюю версию вашего ответа, и да, это было решение. Помечено как решение. Спасибо.