How Can an Integer Contain a Null Value?

  • Thread starter Thread starter TC
  • Start date Start date
T

TC

What does it mean for an integer to have a null value? I am trying to use
the DataView.Find method. That method has an integer return type which
contains the "index of the row in the DataView containing the sort key value
specified; otherwise a null value if the sort key value does not exist."

By "null value", does it mean System.DBNull? (I thought only objects could
evaluate to System.DBNull.) How can I test whether an integer variable holds
a null value?


-TC
 
Hi TC,
What does it mean for an integer to have a null value? I am trying to use
the DataView.Find method. That method has an integer return type which
contains the "index of the row in the DataView containing the sort key value
specified; otherwise a null value if the sort key value does not exist."

By "null value", does it mean System.DBNull? (I thought only objects could
evaluate to System.DBNull.) How can I test whether an integer variable holds
a null value?

My first thought of the answer was a value can never be "nothing" or
"dbnull".

(This is dangerous stuff, because I once had an argue here about what is
difficult about English language and then I said by instance the definition
of words like null.)

So don't look to much on the words I use, just at the meaning.

But then I saw that you are probably talking about a database integer, what
is a total different thing. It is a placeholder for an integer. That can be
empty or dbnull

Just beneath your message you see a message with executeScalar.

Sthephany did send yesterday an example for drygast how to use that. I saw
it yesterday too the first time for the answer beneath I don't know if it
fit. For you I think it does.

I pasted it in beneath

\\\
You are using a reader and that will have a record if it exist and it will
have no records if it does not exist. Your issue is with the fact that you
are not handling the situation when the reader has no records.

Change track a little and use ExecuteScalar() against the command object
with the sql changed to:

select count(*) from [order] where ordernummer=" & txtOrdernummer.Text

The result will be 1 if the order exists and 0 if it does not.

So the test becomes:

If cmd.ExecuteScalar() = 0 Then
' Order does not exist
Else
' Order does exist
End If
///
I hope this helps a little bit.

Cor
 
TC said:
What does it mean for an integer to have a null value? I am trying to
use the DataView.Find method. That method has an integer return type
which contains the "index of the row in the DataView containing the
sort key value specified; otherwise a null value if the sort key
value does not exist."

By "null value", does it mean System.DBNull? (I thought only objects
could evaluate to System.DBNull.) How can I test whether an integer
variable holds a null value?

The word "null" can have two different meanings depending on the context. In
the Framework and for the CLR (docs), Null is the term for "no reference".
The equivalent term in VB.NET is Nothing. When talking about "Null" in a
database, it means DBNull (resp. DBNull.Value). It might get confusing when
you get a message from the framework that deals with database stuff. In this
case, we have to be clever enough to recognize what is meant by the word
"Null".

Talking in the VB.NET context: An Integer variable can neither be Nothing
nor it can be DBNull. (in a C# context I'd have to say: An Integer variable
can neither be Null nor it can be DBNull). Whenever the variable is related
to a database value and it can be DBNull or an Integer, the type must be
"Object". Only variables declared as Object can either contain DBNull or a
(boxed) Integer. You can not set an Integer variable to DBNull (you could
set it to Nothing, but that's equal to setting it to zero (and actually it
should not be allowed because it's only confusing)). If the variable is
declared as Object, you can use

If theValue Is DBNull.VAlue then
msgbox "database field contains Null"
else
msgbox theValue
end if

The first msgbox could also show
msgbox "database field contains DBNull"
but in the given context ("database field...") it's sufficient to show
"Null" in the message.
 
TC,
In addition to the others comments.

According to David Sceppa's book "Microsoft ADO.NET - Core Reference" from
MS Press, DataView.Find returns -1 if the desired row is not found. Which is
consistent with other similar searching type methods found in the framework.

Running a quick test confirms that DataView.Find returns a -1 when the key
is not found.

If you are using ADO.NET, I would recommend David's book.

Hope this helps
Jay
 
Cor,

Thank you for the reply. In fact, I was asking about a system integer, not a
database integer. It seems that the problem arises from incorrect/ambiguous
syntax in the VB.NET documentation. Instead of saying the Find method
returns an integer "null value", the documentation should say it returns the
value -1.

-TC


Cor said:
Hi TC,
What does it mean for an integer to have a null value? I am trying to use
the DataView.Find method. That method has an integer return type which
contains the "index of the row in the DataView containing the sort key value
specified; otherwise a null value if the sort key value does not exist."

By "null value", does it mean System.DBNull? (I thought only objects could
evaluate to System.DBNull.) How can I test whether an integer variable holds
a null value?

My first thought of the answer was a value can never be "nothing" or
"dbnull".

(This is dangerous stuff, because I once had an argue here about what is
difficult about English language and then I said by instance the definition
of words like null.)

So don't look to much on the words I use, just at the meaning.

But then I saw that you are probably talking about a database integer, what
is a total different thing. It is a placeholder for an integer. That can be
empty or dbnull

Just beneath your message you see a message with executeScalar.

Sthephany did send yesterday an example for drygast how to use that. I saw
it yesterday too the first time for the answer beneath I don't know if it
fit. For you I think it does.

I pasted it in beneath

\\\
You are using a reader and that will have a record if it exist and it will
have no records if it does not exist. Your issue is with the fact that you
are not handling the situation when the reader has no records.

Change track a little and use ExecuteScalar() against the command object
with the sql changed to:

select count(*) from [order] where ordernummer=" & txtOrdernummer.Text

The result will be 1 if the order exists and 0 if it does not.

So the test becomes:

If cmd.ExecuteScalar() = 0 Then
' Order does not exist
Else
' Order does exist
End If
///
I hope this helps a little bit.

Cor
 
Armin,
The word "null" can have two different meanings depending on the
context...

It seems that the word "null" can have a third meaning too. In the online
documentation for the TreeView.Find method, "null value" apparently means
the integer value -1.

-TC
 
Jay,

Thank you. That solves the mystery.

-TC


Jay B. Harlow said:
TC,
In addition to the others comments.

According to David Sceppa's book "Microsoft ADO.NET - Core Reference" from
MS Press, DataView.Find returns -1 if the desired row is not found. Which is
consistent with other similar searching type methods found in the framework.

Running a quick test confirms that DataView.Find returns a -1 when the key
is not found.

If you are using ADO.NET, I would recommend David's book.

Hope this helps
Jay
 
TC said:
Armin,

context...

It seems that the word "null" can have a third meaning too. In the
online documentation for the TreeView.Find method, "null value"
apparently means the integer value -1.

To me it seems to be a documentation fault.
 
Actually the .NET Framework don't let you set Null
(Nothing in VB) to an int, a bool, a DateTime, etc.

So BCL functions cannot return Null value for built-in
types.

If you need to set Null (Nothing in VB) to an int, a bool,
a DateTime, ... you can use NullableTypes:
http://nullabletypes.sourceforge.net/

bye (luKa)
 
Luca,
Actually the .NET Framework don't let you set Null
(Nothing in VB) to an int, a bool, a DateTime, etc.
However! VB.NET treats Nothing as the default value for any type.

<blockquote>
Nothing is a special literal; it does not have a type and is convertible to
all types in the type system. When converted to a particular type, it is the
equivalent of the default value of that type.
</blockquote>

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbls7/html/vblrfVBSpec2_4_7.asp

In other words, if you assign Nothing to an Integer that integer is set to
the 'default' value for an Integer which is Zero!

Try it!
Dim i as Integer = Nothing
Dim b As Boolean = Nothing
Dim c As Char = Nothing
Dim pt As Point = Nothing

If you run the above you will find each value has the defaults for that
value. (0, False, Char.MinValue (which the debugger displays as Nothing)).
Seeing as Point is a structure, the default for Point is the default for
each of its members, in other words pt.x = 0 & pt.y = 0.

Hope this helps
Jay
 
Luca,
??

Did you have something to say? As all I see is an empty trimmed message!

Thanks
Jay
 
Here it is! -

Yes this help! I'm primarely a C# programmer so I made
some confusion about Nothing in VB.

What I meant is that NullableTypes let you set Null to an
int, a bool, a DateTime and to quite any built-in .NET
type. But Null is not the default value and it is not
Nothing. It's a different value and it is strong typed
(i.e. Null for a DateTime is different from a Null for a
bool).

I will check the documentation of NullableTypes to see if
I stated something confusing about Nothing. If you will
have the opportunity to see the NullableTypes
documentation please let me know if you find something
confusing for VB.NET programmers.


Thanks, (luKa)
 
Here it is! -

Yes this help! I'm primarely a C# programmer so I made
some confusion about Nothing in VB.

What I meant is that NullableTypes let you set Null to an
int, a bool, a DateTime and to quite any built-in .NET
type. But Null is not the default value and it is not
Nothing. It's a different value and it is strong typed
(i.e. Null for a DateTime is different from a Null for a
bool).

If you will have the opportunity to see the NullableTypes
documentation please let me know if you find something
confusing for VB.NET programmers.

Thanks, (luKa)
 
Luca,
I follow you, your other post was just a little terse, I missed what you
were attempting to say.

NullableTypes allows the concept of a DB Null.

I was not talking about the concept of a DB Null, so I missed your
connection.

Thanks
Jay
 
Yes this help. I'm primarely a C# programmers... I get
confuser about Nothing value VB.NET.

What I meant is that the Null value that NullableTypes let
you set to an int, a bool, a DateTime and to quite any .NET
built-in type is not the default value of that type (as
Nothing) but is a different value and is strong typed (a
Null int have a different type from a Null bool).

If you will have the opportunity to read the NullableTypes
documentation, please let me know if you find other
confusing statement for a VB.NET programmer.

ciao (luKa)


 
Back
Top