DBNull 값을 데이터베이스에 삽입
On 2월 9, 2021 by admin 잘 작동하는 코드가 있습니다. 적은 수의 코드로 더 잘 작성하는 방법에 대한 의견이 필요합니다. 삼항 연산자를 사용하고 싶지만 작동하지 않아서 대신 if else
를 사용했습니다.
기본적으로 가격을 내 가격 열은 nullable 십진수입니다. 내 C # 코드에서도 “nullable 십진수입니다.
if (items.Price == null) { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", DBNull.Value), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } else { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", items.Price), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } return i;
else
블록?
댓글
- 왜 삶을 더 쉽게 만들고 ORM을 사용하지 않습니까? " ADO.Net 코드를 직접 작성하는 경우 고용주 또는 고객으로부터 정보를 훔치는 것입니다. "
- @BCdotWEB 몇몇 코더가 해당 게시물에 댓글을 달았으므로 사람들이 그 조언을 따랐다면 우리는 ' 그 예쁜 ORM을 모두 가지고 있지 않습니다. 때로는 오래되고 장인의 방식으로하는 것이 배우는 가장 좋은 방법입니다. 우리는 어려움에 대해 배우고 해결해야 할 문제를 발견합니다.
답변
당신이해야 할 일은 ?:
(삼항 연산자 ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
또는 확장 프로그램을 작성할 수 있습니다.
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
대신 사용 :
new SqlParameter("@Price", items.PriceOrDefault())
Price
는 decimal?
이므로 HasValue
속성을 사용하고 값을 바꿀 수 있습니다.
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Null 확인보다 더 좋아 보입니다.
댓글
- 죄송합니다. ,하지만 밑에 구불 구불 한 선이 있습니다. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm
object
. 예제를 편집했습니다. 어쨌든SqlParameter
는 예외입니다. - 작동합니다 .. 감사합니다. 이것을 확장 메소드로 래핑하겠습니다. 감사합니다
- 도우미 방법을 사용하는 경우 '보다 일반적인
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
를 사용하고 싶습니다.
답변
이를 작성하는 가장 간결하고 선언적인 방법은 C # “의 ??
연산자. 행은 다음과 같습니다.
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
여기의 표현식은 왼쪽 피연산자의 null이 아닌 값 (items.Price
) 또는 대신 오른쪽으로 피연산자를 반환합니다.
추측하지 않았다면 ??
연산자 기본적으로 if operl != null ? operl : operr
에 대한 구문 설탕입니다.
댓글
- 좋습니다. 실제로 이것도 알고 있습니다. 하지만 ' nullable 사용시 이와 같이 작동 할 것이라고 생각하지 않았습니다. :-]
- null 병합을 사용하는 것이 확실히 가장 깨끗한 옵션입니다.
답변
이것은 개인적인 취향에 달려 있지만 xtension 메서드 경로 t3chb0t에서 제안 , 향후에 재사용 할 수 있도록 일반화하는 것이 좋습니다. Nullable
유형을 사용할 수 있으며 다른 필드에 대해 매우 유사한 기능을 사용하지 않습니다. 다음과 같습니다.
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
허용 :
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
등
댓글
- 와, ' 를 사용할 아이디어를 생각 해낸 적이 없습니다.
T
+struct
😉 li에서 nullable?
>
답변
System.Data를 살펴 보셨습니까? .SqlTypes 네임 스페이스-특히 SqlDecimal ?
다른 답변을 바탕으로 및 ??
연산자는 다음과 같습니다.
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
답글 남기기