반응형
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
반응형
'MySql' 카테고리의 다른 글
MySQL localhost vs. 127.0.0.1 in mysql_connect() (0) | 2020.11.07 |
---|---|
MySQL 실제 이스케이프 문자열 및 PDO (0) | 2020.11.06 |
MySQL # 1292-잘못된 날짜 값 : '0000-00-00' (0) | 2020.11.06 |
MySQL 저장 프로 시저 대 함수, 언제 사용합니까? (0) | 2020.11.06 |
MySQL 여러 값 선택 (0) | 2020.11.06 |
댓글