Invalid use of Null

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
pstrkim
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 03.01.2007 (Ср) 23:53

Invalid use of Null

Сообщение pstrkim » 05.01.2007 (Пт) 23:59

При загрузке формы присваиваю значения полям txtFields из
набора записей rsOrders, при этом если например значение поля "CustomerID" пустое - выдается ошибка "Invalid use of Null". Как от нее избавиться?

Код: Выделить всё

Private Sub Form_Load()
        txtFields(0).Text = rsOrders("CustomerID")
        txtFields(1).Text = rsOrders("EmployeeID")
        txtFields(2).Text = rsOrders("ExecutedDate")
        txtFields(3).Text = rsOrders("OrderDate")
        txtFields(4).Text = rsOrders("OrderID")
End Sub

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 06.01.2007 (Сб) 0:08

Да по разному :)

Код: Выделить всё

txtFields(0).Text = IIf(IsNull(rsOrders("CustomerID")), vbNullString, rsOrders("CustomerID"))


Или лучше Binding использовать :?: :)
Dmitrich

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.01.2007 (Сб) 0:16

Я раньше тоже так делал, как л...р. Есть более простой и элегантный способ!
Код: Выделить всё

txtFields(0).Text = rsOrders("CustomerID")  & ""
С уважением, Сергей.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 06.01.2007 (Сб) 0:40

Для тех кто в бронепоезде :)

Код: Выделить всё

Option Explicit
'
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
'
'--> link ->Microsoft ActiveX Data Objects 2.8 Library
'--> link ->Microsoft Data Binding Collection
'
Private Sub Form_Load()
    '
    Set cn = New ADODB.Connection
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb;Persist Security Info=False"
    cn.CursorLocation = adUseClient
    cn.Open
    '
    Dim sSQL As String: sSQL = "SELECT * FROM Authors;"
    Set rs = New ADODB.Recordset
    rs.Open sSQL, cn, adOpenDynamic, adLockOptimistic
    '
    Set Me.Text1.DataSource = rs
    Me.Text1.DataField = "Au_ID"
    '
    Set Me.Text2.DataSource = rs
    Me.Text2.DataField = "Author"
    '
    Set Me.Text3.DataSource = rs
    Me.Text3.DataField = "Year Born"
    '
End Sub
Dmitrich

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.01.2007 (Сб) 22:51

Для тех, кто не в танке. Почитай вопрос и то, как данные попадают в форму. Зачем давать прямой доступ к таблице в БД из формы? Делаешь параметрический запрос, а потом заполняешь форму резульнатом. А пустое значение к результату присваиваешь
Код: Выделить всё

txtFields(0).Text = rsOrders("CustomerID")  & ""

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

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 06.01.2007 (Сб) 23:03

Да я то почитал, оба моих примера универсальны :D

а это плохо и криво.
txtFields(0).Text = rsOrders("CustomerID") & ""


Задумайся что произойдет если
txtFields(0).Text = rsOrders("MemoXMLSource") & ""


MemoXMLSource - уменя в базе таких файликов достаточно и размерчик под 300 кб бывает, так что будем плодить строки. :)

даже так более правильно

txtFields(0).Text = rsOrders("CustomerID") & vbNullString


низачет :)
Dmitrich

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.01.2007 (Сб) 23:27

Я не работаю с XML. Но чем суть отличается от БД? Ты же не будешь в тексбокс 300 кб инфы закачивать? Почему будешь в этом случае плодить пустые строки? Объясни, даже интересно... :lol:
С уважением, Сергей.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 06.01.2007 (Сб) 23:37

Что кроме техбоха других контролов нету, что-ли.:)

s=s+b - сначала создаст временную строку, а потом присвоит ее переменной. Да в столь малых полях числа-строки - можно закрыть глаза. В мемо, лично я за бинд - насчет доступа - если не захочу давать прямой доступ так и не дам :)

Вот это я называю универсальностью. Не нравится - делай как хочеш.

Но добавлять пробел к данным - уволь :)
Dmitrich

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 07.01.2007 (Вс) 1:04

Не, это не пробел, а пустые кавычки. Скопируй код и вснавь в блокнот, увидишь. К данным, в этом случае, ничего не добавляется. Просто убирается ошибка! Это я не предумал, так в умной книге "Обработка БД на VB6" написано!
С уважением, Сергей.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 07.01.2007 (Вс) 1:21

А мне показался пробел, о чудо трава отпусти меня :)

Вот мне делать нехрена:

код с IIF(IsNull(... отстает от ...rs.Fields(...) & "" всего на 5-7% если поле пустое и на 5-9% если в поле данные. Вывод операции c " & " очень медленные. А книжка вероятно охватывала лишь часть аспектов работы с бд. (ее случайно не Б.Леонтьев написал :) )

Я думаю вопрос исчепан. :!:
Вложения
time_it.rar
(9.06 Кб) Скачиваний: 30
Последний раз редактировалось Dmitriy2003 07.01.2007 (Вс) 2:51, всего редактировалось 4 раз(а).
Dmitrich

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.01.2007 (Вс) 1:26

Как человек, впервые увидевший конструкцию с &"" в чужом коде без комментариев и долго чесавший над ним затылок, заявляю: сильным преимуществом конструкции с IIf(IsNull) будет уже то, что там сразу понятно, что происходит и зачем.
Изображение

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 07.01.2007 (Вс) 15:37

Нет, книгу не Леонтьев написал. Издательство "Самс", ерунды - не пишет. Автора, если хочешь пришлю 10-го числа, когда на работу выйду. Книга на работе. Тест, на мой взгляд, не совсем адекватный. Но, тем не менее, на моей машине показал:

если в поле данные:
2,5356 - конструкция if
2,0416 - конструкция & ""

если поле пустое:
2,0931 - конструкция if
1,8748 - конструкция & ""

Я, так понимаю, тест говорит о преимуществе конструкции & ""

А по-большому счёту ты прав. Делать нечего, раз такой спор раздули... :D
С уважением, Сергей.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67

    TopList