NULL через целое в хранимую процедуру

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

NULL через целое в хранимую процедуру

Сообщение kroskros » 02.05.2006 (Вт) 11:11

Написал хранимую процедуру под SQL 2000
В качестве параметров (А и В, допустим) в нее передаются 2 целых,
Параметр А определен всегда.
D теле процедуры проверяю, если параметр В = NULL
тогда возвращаю записи со всеми значениями этого параметра,
если NOT NULL, то единственную запись с А и В...
В Сиквеле все отлично работает...

А вот КАК передать NULL через ЦЕЛОЕ в VS2005?
Поясню:
Создал адаптер, датасет...
Пытаюсь заполнить:
А, В as int16
A=1
Adapter.fill(dtsMy.MyTable, A)

Компилятор подчеркивае синей,
требуя вписать параметр В.
Типа:
Adapter.fill(dtsMy.MyTable, A, В)

попытки соорудить чего нить вроде:
B=DBNull.value
или
Adapter.fill(dtsMy.MyTable, A, DBNull)

не проходят. :(

Подскажите, КАК передать NULL?
Max

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 02.05.2006 (Вт) 12:59

А где эт ты такой синтаксис Fill отыскал?!?!?!?!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 03.05.2006 (Ср) 5:58

в VS2005... я б сам такое не сочинил...
Создал адаптер к хранимой процедуре,
а уж он возжелал такой синтаксис для FILL...
И, что характерно, работает.. )))
вот тока надо ОБА параметра задавать.. ((
Max

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2006 (Ср) 7:18

Приведи пример кода. Что то ты недопонял наверное. Для Fill нету таких параметров
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 03.05.2006 (Ср) 7:55

Значения А и В надо сначала добавить в таблицу датасета и только потом обновлять базу.
Последний раз редактировалось baha76 04.05.2006 (Чт) 7:49, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.05.2006 (Ср) 8:14

baha76
Я думаю, ты несколько не в теме.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 03.05.2006 (Ср) 9:06

baha76 писал(а):Значения А и В надо сначала добавить в таблицу датасета и только потом обновлять базу.
Ты бы сначала почитал что-ли про ADO.NET...


кхм.. смахивает на хамство... :oops:

Датасет будет только ПОСЛЕ того, как выполнится хранимая процедура...
Max

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.05.2006 (Ср) 9:13

kroskros
Ну вот справка.
DataAdapter.Fill -метод

Метод Fill получает строки из источника данных с помощью команды SELECT, указанной и связанной со свойством SelectCommand.

У SelectCommand, правда, есть параметры. Откуда они в Fill?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 03.05.2006 (Ср) 9:42

Вот, пример приложения...
Скриптовать БД, ясное дело, я не стал,
просто приложил вырезку из скриншота, где отличнейшим образом виден
синтаксис FILL с параметрами
ComplCode и WorkNum...

теперь автоматом в FillToolStripButton_Click
сгенерировался код, в котором на месте этого самого необязательного параметра
New System.Nullable(Of Short),

толька убейте, НЕ ПОНИМАЮ :(
КАК это работает...

Я сделал так:

Dim d As System.Nullable(Of Short)
Me.GAL_SelectWorksByComplCodeTableAdapter.Fill(Me.ArchCards_GallurgyDataSet1.GAL_SelectWorksByComplCode, ComplCodeToSend, d)

все работает. :)

а теперь вопросы
- ну не понимаю я этот "System.Nullable(Of short)".
скажем так, это указание того, что данная переменная типа SHORT,
МОЖЕТ приобретать значение NULL? а если я по ходу действия
присвою D=1, то как ей опять присвоить значение NULL?
/нет, конечно я могу и оставить эту переменную в
первозданном NULL значении, а юзать другую,
НО ХОЧЕТСЯ ЗНАТЬ! ;)/

- КАК в FILL вместо того, чтобы заводить переменную d
/моветон, типа.../ непосредственно прописать этот самый NULLABLE?..


страшная мысль проазила меня...
мы ведь помним, чторечь идет о VS2005?
Вложения
TestForStoredProcedure.zip
То, во что не могут поверить
ВЕЛИКИЕ сего форума. ;)
(48.21 Кб) Скачиваний: 49
Max

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.05.2006 (Ср) 9:51

Мы помним.
Но мы не думали, что всё настолько страшно.

Nullable - да, RTFM.
Присвоение как обычно. Оператором =.

Вместо переменной - new nullable(of short)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.05.2006 (Ср) 18:06

А чтобы ты лучше понимал смысл происходящего вот тебе твоя функция Fill из "недр" :) твоего же проекта:
Код: Выделить всё
       <System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _
         System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Fill, True)> _
        Public Overridable Overloads Function Fill( _
        ByVal dataTable As dtstStoredProc.GAL_SelectWorksByComplCodeDataTable, _
        ByVal ComplCode As System.Nullable(Of Byte), _
        ByVal WorkNum As System.Nullable(Of Short)) As Integer

            Me.Adapter.SelectCommand = Me.CommandCollection(0)
            If (ComplCode.HasValue = True) Then
                Me.Adapter.SelectCommand.Parameters(1).Value = CType(ComplCode.Value, Byte)
            Else
                Me.Adapter.SelectCommand.Parameters(1).Value = System.DBNull.Value
            End If
            If (WorkNum.HasValue = True) Then
                Me.Adapter.SelectCommand.Parameters(2).Value = CType(WorkNum.Value, Short)
            Else
                Me.Adapter.SelectCommand.Parameters(2).Value = System.DBNull.Value
            End If
            If (Me.ClearBeforeFill = True) Then
                dataTable.Clear()
            End If
            Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
            Return returnValue
        End Function
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 04.05.2006 (Чт) 7:52

Дико извиняюсь! Я ответил в спешке и перепутал DataAdapter.Fill с DataAdapter.Update :oops:

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 04.05.2006 (Чт) 9:02

baha76 писал(а):Дико извиняюсь! Я ответил в спешке и перепутал DataAdapter.Fill с DataAdapter.Update :oops:


гы...
:) но спасибо за ОПЕРАТИВНОСТЬ!
Max

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 04.05.2006 (Чт) 9:04

GSerg писал(а):Присвоение как обычно. Оператором =.


А вот, не получается я пробовал:
d = null
d = DBNull
d= DBNull.value

ничего не выходит. а КАК тогда?
Max

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2006 (Чт) 9:11

nothing?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 04.05.2006 (Чт) 23:10

А вот, не получается я пробовал:
d = null
d = DBNull
d= DBNull.value

И не получится, потому что функция Fill требует переменную типа System.Nullable(Of T)

Код: Выделить всё
Dim D As System.Nullable(Of Byte)
Dim D1 As System.Nullable(Of Short)
'присваиваем определенные значения
D = Byte.Parse(ComplCodeToolStripTextBox.Text) ' or TryParse
D1 = Short.Parse(WorkNumToolStripTextBox.Text)

Me.GAL_SelectWorksByComplCodeTableAdapter.Fill(Me.DtstStoredProc.GAL_SelectWorksByComplCode, D, D1)

'-------------Теперь передаем DBNull
'создаем новые экземпляры структуры System.Nullable(Of T)
D = New System.Nullable(Of Byte)
D1 = New System.Nullable(Of Short)
'после инициализации структур Свойство >>HasValue=False<<
'вызываем функцию Fill (которую сгенерил для тебя дизайнер.)
Me.GAL_SelectWorksByComplCodeTableAdapter.Fill(Me.DtstStoredProc.GAL_SelectWorksByComplCode, D, D1)


Это кусок кода из функции Fill
(полный код этой функции я привел выше но ты не удостоил его своим вниманием )
Код: Выделить всё

        If (ComplCode.HasValue = True) Then
            Me.Adapter.SelectCommand.Parameters(1).Value = CType(ComplCode.Value, Byte)
        Else
            Me.Adapter.SelectCommand.Parameters(1).Value = System.DBNull.Value
        End If

Теперь понятно что такое System.Nullable и как с ним работать?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 04.05.2006 (Чт) 23:50

Если ты откроешь в редакторе кода dtstStoredProc.Designer.vb (из твоего проекта) и вставишь туда этот код,
Код: Выделить всё
<System.Diagnostics.DebuggerNonUserCodeAttribute(), _
System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"), _
System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Fill, True)> _
    Public Overridable Overloads Function Fill( _
    ByVal dataTable As dtstStoredProc.GAL_SelectWorksByComplCodeDataTable, _
    ByVal ComplCode As Object, _
    ByVal WorkNum As Object) As Integer
            Me.Adapter.SelectCommand = Me.CommandCollection(0)

            Me.Adapter.SelectCommand.Parameters(1).Value = ComplCode
            Me.Adapter.SelectCommand.Parameters(2).Value = WorkNum

            If (Me.ClearBeforeFill = True) Then dataTable.Clear()

            Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
            Return returnValue
    End Function

то можешь пихать в свой Fill что угодно, хоть DBNull, хоть Nothing
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 05.05.2006 (Пт) 10:59

GSerg писал(а):nothing?..


ага.. получилось...
спасибо!
многолик этот самы NULL :shock:
Max

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 05.05.2006 (Пт) 11:06

Nord777 писал(а):(полный код этой функции я привел выше но ты не удостоил его своим вниманием )


Да удостоил я его вниманием,
тока ума не хватило разобраться... :(

а пояснения за код ниже спасибо!
Попробую вставить в проект...
и теперь легче стало соображать чего творю...

еще раз СПАСИБО! ;)
Max


Вернуться в Visual Basic .NET

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

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

    TopList