.NET and MySql paramters, AddWithValue NULL variables, how to avoid to check for nulls

11,627

Solution 1

DbNull.Value doesn't solve the problem, the exception is thrown if you don't specify that the parameter is nullable.

Dim par As New MySqlParameter("p1", Nothing)
par.IsNullable = True
par.MySqlDbType = MySqlDbType.Int32 ' or any other type you need '
par.Direction = ParameterDirection.Input
command.Parameters.Add(par)
command.ExecuteNonQuery()

This way it works. I don't have to check for the empty string (or weird "impossible" value) in the SP.

Of course you can write a shared generic method to easy the parameter setting, working for any database/language type:

Public Shared Function GetNullableSqlParameter(Of T As IComparable)(ByVal parameterName As String, ByVal parameterType As MySqlDbType, ByVal value As T, Optional ByVal nonNullable As T = Nothing) As MySqlParameter

        Dim par As New MySqlParameter
        par.ParameterName = parameterName
        par.MySqlDbType = parameterType
        par.Direction = ParameterDirection.Input

        If value Is Nothing OrElse (nonNullable IsNot Nothing AndAlso nonNullable.Equals(value)) Then
            par.IsNullable = True
            par.Value = DBNull.Value
            par.SourceColumnNullMapping = True
        Else
            par.IsNullable = False
            par.Value = value
        End If

        Return par
    End Function

And call it like:

command.Parameters.Add(General.GetNullableSqlParameter("_zip", MySqlDbType.String, zipcode))

Solution 2

Use next if you want to insert NULL:

command.Parameters.AddWithValue("_name", name ?? DBNull.Value);

means the same as

if(name != null)
    command.Parameters.AddWithValue("_name", name);
else
    command.Parameters.AddWithValue("_name", DBNull.Value);

See more about null-coalescing operator on MSDN

And if you want to insert empty char '' you next:

command.Parameters.AddWithValue("_name", name ?? '');
Share:
11,627
vulkanino
Author by

vulkanino

I started coding games in Assembly with a Sega 2000, Z80 computer (Pcs were not invented yet). I was 15, then started to study the C language reading a book by McGrawHill. Then came the Stroustroup's "OOP in C++" book, then Java, C#, etc. Even though my job is no more about programming, I still like to code (not in Assembly luckily enough) Vulcanino means "little volcano" in Italian. I've changed the C with the K letter: the K is not part of our alphabet, and that's why we like it so much (same with the X, Y and W). :) SOreadytohelp

Updated on June 04, 2022

Comments

  • vulkanino
    vulkanino almost 2 years

    Let's say I have a MySql stored procedure that inserts a record with some nullable CHAR fields.

    In VB.NET if I don't check for Nothing (or Null in other languages), I get an exception from the db driver, so I write:

    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("_name", if(name Is Nothing, "", name)).Direction = ParameterDirection.Input;
    

    And this is the first thing I don't like; I'd like to pass Nothing and the driver knows it has to put NULL in the Db. But then, in the stored procedure, I have to check back the field if it is empty:

    INSERT INTO mytable
    (
        name,
    -- other 200 char fields
    )
    VALUES
    (
        NULLIF(_name, ''),
    -- other 200 char fields
    )
    

    Ugly uh? I have to check for nothingness/emptiness twice. Is there a better, more direct, way?

    Even worse, for non reference types (i.e: Integers) the check for nothingness makes no sense, since a primitive type can't be nothing (yes, I could set an Integer to a non meaningful value, say -1 for a positive id, but...).