2015-04-07 2 views
-1

Я создал макрос/некоторые VBA для ОБНОВЛЕНИЯ таблицы SQL Server, которая отлично работает.Для каждого оператора If - Skip NULL

Вкратце, код вытягивает определенное количество записей из таблицы, чтобы преуспеть, а затем конечный пользователь обновляет некоторую конкретную информацию и затем нажимает на обновление. В таблице создается соединение, и выполняется инструкция SQL update, которая обновляет соответствующие записи.

Проблема заключается в том, что пользователю не нужно было обновлять поле NULL (NULL находится в таблице SQL Server, но отображается как «пустое» в Excel), когда использование щелчков обновляет инструкцию SQL, заставляет NULL «пустая» запись.

Чтобы обойти это, я хотел бы, чтобы мой код в инструкции For Each проверял, является ли ячейка/запись NULL или пустым, и чтобы перейти к строке NEXT, чтобы команда SQL Execute не выполнялась.

Вот VBA в вопросе:

cnn.Open cnnstr 
Dim row As Range 

    For Each row In [tbl_data].Rows 
      uSQL = "UPDATE BREACH_DATA SET [VAL_BREACH_REASON] = '" & (row.Columns(row.ListObject.ListColumns("VAL_BREACH_REASON").Index).Value) _ 
       & "' ,[VAL_BREACH_DETAIL] = '" & (row.Columns(row.ListObject.ListColumns("VAL_BREACH_DETAIL").Index).Value) _ 
        & "' ,[VAL_VALID] = '" & (row.Columns(row.ListObject.ListColumns("VAL_VALID").Index).Value) _ 
         & "' ,[VAL_NOTES] = '" & (row.Columns(row.ListObject.ListColumns("VAL_NOTES").Index).Value) _ 
          & "' WHERE [ATD_NUMBER] = '" & (row.Columns(row.ListObject.ListColumns("ATD_NUMBER").Index).Value) & "'" 

      'Debug.Print uSQL 
      cnn.Execute uSQL 
    Next 

cnn.Close 
Set cnn = Nothing 

Любые предложения

С наилучшими пожеланиями Dino

+0

Почему бы не просто обернуть каждый столбец с NULLIF? IIRC, Excel не может различать NULL и пустую строку. –

+0

Спасибо @SeanLange, вот где я сбился с толку. Я дам вам благодарность. –

+0

Могу ли я спросить, почему -1 для этого вопроса? –

ответ

0

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

если нет

(
    (isempty(row.Columns(row.ListObject.ListColumns("VAL_BREACH_REASON").Index).Value) 
and isnull(row.Columns(row.ListObject.ListColumns("VAL_BREACH_REASON").Index).Value) 
and do same for the other cell values.... 
) 

затем обновить ....

+0

Спасибо @ benjamin-moskovits. Не беспокойтесь, пользователи не будут иметь понятия, как это сделать, и только для 2, возможно, 3 конкретных пользователей. Я также дам ваше предложение поехать и посмотреть, как я поеду и отчитаюсь. Спасибо. –

+1

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

+0

Я согласен с @benjaminmoskovits около 100000%. Говорить, что ваши пользователи не знают, почему именно такая плохая идея. Вы не хотите правильно его кодировать, потому что считаете, что не подвергаетесь риску. Добавление параметров в этот запрос потребует гораздо меньше времени и усилий, чем защита, почему вы не делаете это правильно в первую очередь. –