代码之家  ›  专栏  ›  技术社区  ›  vulkanino

NET和MySql参数,AddWithValue空变量,如何避免检查空值

  •  3
  • vulkanino  · 技术社区  · 14 年前

    假设我有一个MySql存储过程,它插入了一个带有一些可空字符字段的记录。

    在VB.NET版如果我没有检查Nothing(或者在其他语言中为Null),我会从db驱动程序中得到一个异常,所以我写:

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

    这是我不喜欢的第一件事;我不想传递任何东西,而驱动程序知道必须在Db中输入NULL。但是,在存储过程中,如果字段为空,我必须检查它:

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

    丑啊?我得检查两次虚无。

    更糟糕的是,对于非引用类型(即:整数),检查无意义是没有意义的,因为原语类型不能为无(是的,我可以将整数设置为无意义的值,例如-1表示正id,但是…)。

    3 回复  |  直到 13 年前
        1
  •  4
  •   abatishchev Marc Gravell    14 年前

    如果要插入,请使用“下一步” NULL :

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

    意思与

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

    MSDN

    如果你想插入空字符 '' 下一步:

    command.Parameters.AddWithValue("_name", name ?? '');
    
        2
  •  2
  •   vulkanino    14 年前

    DbNull.值如果不指定参数,则会引发异常 .

    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()
    

    这样就行了。我不必检查SP中的空字符串(或奇怪的“不可能”值)。

    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
    

    把它叫做:

    command.Parameters.Add(General.GetNullableSqlParameter("_zip", MySqlDbType.String, zipcode))
    
        3
  •  0
  •   Klaus Byskov Pedersen    14 年前

    使用 DbNull.Value 而不是空字符串。