Предложение Where не работает с запросом на объединение SQLite

#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. Я потерял последнюю версию вашего ответа, и да, это было решение. Помечено как решение. Спасибо.