2016-02-08 5 views
0

Я пытаюсь отфильтровать команду OLEDB, поскольку несколько операторов OR OR работают в одном поле базы данных, но последнее в цепочке игнорируется и ничего не возвращает.Последняя инструкция 'OR' Игнорируется в команде OLEDB

У меня есть работа вокруг теперь с запросом @null, который возвращает «DBNull.Value», но если удалить «[доктайп] = @null» снизу игнорирует «[доктайп] = doctype3»

& "WHERE [doctype] = @doctype OR [doctype] = @doctype2 OR [doctype] = @doctype3 OR [doctype] = @null " _ 

Я могу увеличить или уменьшить «OR Statement», как мне нравится, но это всегда последнее «OR Statement», которое игнорируется.

Я попытался помещать «OR statements» в скобки, но потом ничего не возвращает, или я делаю это неправильно.

Я ищу просто, почему последнее «или утверждение» игнорируется в строке oledbcommand, но если вы можете улучшить код, который я написал, сделайте, но объясните мне, почему и как.

Где они используются (Все остальные значения имеет DBNull.Value для целей тестирования)

  f_doctype = "MS" 
      f_doctype2 = "TMS" 
      f_doctype3 = "CS" 

      With cmdaRefresh.Parameters 
      .AddWithValue("doctype", CType(f_doctype, String)) 
      .AddWithValue("doctype2", CType(f_doctype2, String)) 
      .AddWithValue("doctype3", CType(f_doctype3, String)) 
      .AddWithValue("null", DBNull.Value) 
      .AddWithValue("docnum", DBNull.Value) 
      .AddWithValue("docrev", DBNull.Value) 
      .AddWithValue("matname", DBNull.Value) 
      .AddWithValue("status", DBNull.Value) 
      .AddWithValue("actionreq", DBNull.Value) 
      .AddWithValue("createdby", DBNull.Value) 
      .AddWithValue("createddate", DBNull.Value) 
      .AddWithValue("finalby", DBNull.Value) 
      .AddWithValue("finaldate", DBNull.Value) 
      End With 

     Dim cmdRefresh As New OleDbDataAdapter(cmdaRefresh) 

     'open connection 
     myconnection.Open() 

     'read and fill dataset for gridview 
     cmdRefresh.Fill(dsRefresh, tbl_string.tablename) 

     'close connection 
     myconnection.Close() 

'fill datagrid with values from database and alter column headers to match criteria 
     With dg_speclog 
      .DataSource = dsRefresh.Tables(0) 
      .RowHeadersVisible = False 
      .Columns(0).HeaderCell.Value = "Category" 
      ... 
     End With 

Full 'OleDbCommand' создание

Dim cmdaRefresh As OleDbCommand = New OleDbCommand(" SELECT [doctype], [docnum], [docrev], [matname], [status], [actionreq], [createdby], [createddate], [finalby], [finaldate] " _ 
                   & "FROM " & tbl_string.tablename & " " _ 
                   & "WHERE [doctype] = @doctype OR [doctype] = @doctype2 OR [doctype] = @doctype3 OR [doctype] = @null " _ 
                   & "AND [docnum] = @docnum " _ 
                   & "AND [docrev] = @docrev " _ 
                   & "AND [matname] = @matname " _ 
                   & "AND [status] = @status " _ 
                   & "AND [actionreq] = @actionreq " _ 
                   & "AND [createdby] = @createdby " _ 
                   & "AND [createddate] = @createddate " _ 
                   & "AND [finalby] = @finalby " _ 
                   & "AND [finaldate] = @finaldate " _ 
                   & "ORDER BY [docnum] ASC, [docrev] ASC " _ 
                   , myconnection) 
+1

Похоже, что все эти условия «И» никогда не верны, и из-за приоритета оператора они сочетаются с окончательным условием «ИЛИ». Начните с добавления parens вокруг условий OR. Вам также нужно использовать 'IS NULL' для нулевых проверок, а не' = '. например 'WHERE ([doctype] = @doctype OR [doctype] = @ doctype2 ИЛИ [doctype] = @ doctype3 ИЛИ [doctype] IS NULL) AND [docnum] = @docnum AND ...'. Вам нужно будет выяснить, почему '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Mark

+0

Спасибо, я займусь этим, теперь я собираюсь вынуть все дополнительные параметры, чтобы проверить, является ли это '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Не могли бы вы прокомментировать, как вы будете делать parens вокруг 'OR', я пробовал, но он ничего не возвращает. – nora

ответ

0

Нашел причину, по которой он не работал. Где-то во время моего поиска я читал, что DBNull.value вернет что-нибудь из базы данных при использовании с оператором .addwithvalue (что может смутить все это). Что неверно, он возвращает все, что имеет значение nothing, как в no white space or value. Вот почему [doctype] IS NULL дал ту же проблему, что и выше, он делает то же самое, я думаю.

То, что я искал был способом поиска с помощью моего [doctype]-х и возвращать любое значение из других полей базы данных без необходимости указывать что-нибудь „для тестирования“

заявления, которое я искал был [docnum] LIKE '%' это называется подстановочным знаком. Символ подстановочных знаков может использоваться для замены любого другого символа (ов) в строке, так что означает, что все возвращается. Однако, если поле базы данных имеет значение Null, тогда требуется заявление IS NULL, следовательно, мои [finalyby] & [finaldate] изменения ниже.

То, что я придумал сейчас:

'CHANGED (dataadapter > command) 
    Dim cmdaRefresh As OleDbCommand = New OleDbCommand(" SELECT [doctype], [docnum], [docrev], [matname], [status], [actionreq], [createdby], [createddate], [finalby], [finaldate] " _ 
                   & "FROM " & tbl_string.tablename & " " _ 
                   & "WHERE [doctype] IN (@doctype, @doctype2 ,@doctype3) " _ 
                   & "AND [docnum] LIKE '%' " _ 
                   & "AND [docrev] LIKE '%' " _ 
                   & "AND [matname] LIKE '%' " _ 
                   & "AND [status] LIKE '%' " _ 
                   & "AND [actionreq] LIKE '%' " _ 
                   & "AND [createdby] LIKE '%' " _ 
                   & "AND [createddate] LIKE '%' " _ 
                   & "AND ([finalby] LIKE '%' OR [finalby] IS NULL) " _ 
                   & "AND ([finaldate] LIKE '%' OR [finaldate] IS NULL) " _ 
                   & "ORDER BY [docnum] ASC, [docrev] ASC " _ 
                   , myconnection) 

Спасибо, кто помог.

0

Вы должны использовать IS NULL для проверки нулевых значений (в большинстве, возможно, всех базах данных, null не равен нулю, поэтому вам нужно использовать вместо этого оператор IS). Это также означает, что вам не нужны все эти параметры.

В зависимости от того, как вы собираетесь совмещать [doctype] IS NULL проверку с другими пустыми чеками, вы может также необходимо обернуть OR с в скобках, так как AND может иметь более высокий приоритет, чем OR.

Dim cmdaRefresh As OleDbCommand = New OleDbCommand(
    " SELECT [doctype], [docnum], [docrev], [matname], [status], [actionreq], [createdby], [createddate], [finalby], [finaldate] " _ 
    & "FROM " & tbl_string.tablename & " " _ 
    & "WHERE ([doctype] = @doctype OR [doctype] = @doctype2 OR [doctype] = @doctype3 OR [doctype] IS NULL) " _ 
    & "AND [docnum] IS NULL " _ 
    & "AND [docrev] IS NULL " _ 
    & "AND [matname] IS NULL " _ 
    & "AND [status] IS NULL " _ 
    & "AND [actionreq] IS NULL " _ 
    & "AND [createdby] IS NULL " _ 
    & "AND [createddate] IS NULL " _ 
    & "AND [finalby] IS NULL " _ 
    & "AND [finaldate] IS NULL " _ 
    & "ORDER BY [docnum] ASC, [docrev] ASC " _ 
    , myconnection) 

Если [doctype] IS NULL проверка принадлежит с другими NULL проверки, то вам не нужны скобки.

+0

Я играл с вашим предложением и помещал parens вокруг операторов 'OR', заставляя его ничего не возвращать, без них и только части' IS NULL', это работает ... Но моя проблема по-прежнему заключается в том, что у меня есть бессмысленное '[ doctype] IS NULL' в выражении 'Where'. Если я удалю его, то обратный игнорирует' [doctype] = @ doctype3' и дает только значения '@doctype и @ doctype2' .. Аналогично, если добавить четвертый возврат '[doctype] = @ doctype4', он даст мне значения для' @doctype, @ doctype2, @ doctype3', но игнорирует '@ doctype4' .. только тогда, когда у меня есть жертвенный' [doctype] IS NULL' в 'OR' цепь работает ... – nora

 Смежные вопросы

  • Нет связанных вопросов^_^