본문 바로가기
MySql

MySQL .NET 및 MySql 매개 변수, AddWithValue NULL 변수, null 검사를 방지하는 방법

by 베이스 공부 2020. 11. 6.
반응형

nullable CHAR 필드가있는 레코드를 삽입하는 MySql 저장 프로 시저가 있다고 가정 해 보겠습니다.

VB.NET에서 Nothing (또는 다른 언어에서는 Null)을 확인하지 않으면 db 드라이버에서 예외가 발생하므로 다음과 같이 작성합니다.

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

그리고 이것이 제가 제일 싫어하는 것입니다. Nothing을 전달하고 싶습니다. 드라이버는 Db에 NULL을 넣어야한다는 것을 알고 있습니다. 하지만 저장 프로 시저에서 필드가 비어 있으면 다시 확인해야합니다.

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

못생긴 어? 무 / 공허함을 두 번 확인해야합니다. 더 나은, 더 직접적인 방법이 있습니까?

더 나쁜 것은 비 참조 유형 (예 : 정수)의 경우 기본 유형이 아무것도 될 수 없기 때문에 아무것도 없는지 확인하는 것이 의미가 없습니다 (예, Integer를 의미없는 값으로 설정할 수 있습니다. ,하지만 ...).

 

해결 방법

 

DbNull.Value는 문제를 해결하지 않으며 매개 변수가 null 허용 임을 지정하지 않으면 예외가 발생합니다.

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

 

참조 페이지 https://stackoverflow.com/questions/3718755

 

 

반응형

댓글