내 sqlparameter가 null을 올바르게 전달하지 않습니다
-
06-09-2019 - |
문제
날짜 선택기 상자가있는이 C# WebForm이 있습니다. 날짜가 아무것도 설정되지 않으면 (기본값) NULL을 데이터베이스로 전달하기를 원합니다. 이것은 매개 변수화 된 쿼리 내부에서 발생합니다.
SqlParameter CMActionDate = new SqlParameter();
CMActionDate.ParameterName = "@ActionDate";
if (ActionDate.Equals(""))
{
CMActionDate.Value = System.Data.SqlTypes.SqlDateTime.Null;
}
else
{
CMActionDate.Value = ActionDate;
}
디버깅을 켜면 날짜가 실제로 "" "라는 것을 알 수 있습니다.
하지만.
그런 다음 비 쿼리를 실행할 때 돋보기를 클릭하고 다음을 참조하십시오.
UPDATE table SET [action_date] = '' WHERE [id] = 2488
내가보고 싶은 것은 이것입니다.
UPDATE table SET [action_date] = 'Null' WHERE [id] = 2488
Action_date는 실제로 NULL로 설정되지 않기 때문에 DateTime 필드의 값은 "01/01/1900 12:00:00 AM"으로 되돌아갑니다. 그리고 그것은 그 자체로 고통입니다.
CMActionDate.Value를 다음 값으로 설정하려고 시도했습니다.
- dbnull.Value;
- "없는";
- sqldateTime.null;
- 없는;
돕다.
편집하다
어쩌면 내가 명확하지 않았을까요? 예, 물론 매개 변수화 된 쿼리는 다음과 같습니다.
"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_id + "";
그러나 VS 에서이 물건을 디버깅 할 때, 나는 executenonquery () 바로 앞에 브레이크 포인트를 넣었습니다. 그래서 실행하려는 SQL을 볼 수 있습니다. 실제 SQL을보고 Action_Date = '' '가있는 비트를 보게됩니다.
그게 도움이 되나요?
해결책
''또는 'null'을 보지 않아야합니다. 매개 변수화 된 쿼리를 올바르게 사용하는 경우 다음과 같습니다.
업데이트 테이블 세트 [action_date] = @ActionDate where [id] = @Id
그만큼 요점 매개 변수화 된 쿼리의 실제 매개 변수 값은 절대 쿼리 문자열로 직접 대체되었습니다.
쿼리 코드는 다음과 같습니다.
string sql = "UPDATE table SET [action_date]= @ActionDate WHERE [id]= @CM_id";
using (var cn = new SqlConnection("your connection string here."))
using (var cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@ActionDate", SqlDbTypes.DateTime).Value =
ActionDate.Equals("")? DBNull.Value : DateTime.Parse(ActionDate);
cmd.Parameters.Add("@CM_id", SqlDbTypes.Int).Value = 2488;
cn.Open();
cmd.ExecuteNonQuery();
}
이 코드의 결과는 쿼리 매개 변수가 데이터로 서버로 전송된다는 것입니다. C# 코드의 어느 시점에서도 데이터를 대체 한 쿼리 문자열을 볼 수 없습니다. 서버로 별도로 전송됩니다.
이렇게하면 매개 변수 값을 소독하는 오류로 인해 서버가 매개 변수 값을 코드로 실행할 가능성이 없습니다. 데이터는 완전히 분리되어 있으며 처음에는 해당 맥락에 대해 소독 할 필요가 없습니다. 또한 서버가 쿼리의 실행 계획을 캐시하고 재사용 할 수있게하여 (작은) 성능 향상을 초래합니다.
다른 팁
매개 변수화 된 쿼리가 표시되어야합니다
UPDATE table SET [action_date] = @ActionDate WHERE [id] = @id
매개 변수 값은 널 등가 값을 가져야합니다.
당신의 SQL입니다
"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "'
WHERE [id] = " + @CM_id + "";
실제로 말이되지 않습니다. 동적 SQL 쿼리를 구축하지 않고 @ActionDate 및 @CM_ID를 교체해야합니다.
귀하의 SQL은 문자 그대로 다음과 같아야합니다.
String sql = "UPDATE table SET [action_date] = @ActionDate WHERE [id] = @CM_id"
변수 주위에 문자열 연결이 없어야하며 따옴표로 래핑해서는 안됩니다.
귀하의 쿼리는 가장 확실하게 게시 된 쿼리처럼 보이지 않습니다.
올바르게 읽으려면 @parameter가 문자열 안에 있어야합니다. @ActionDate가 존재하지 않기 때문에 ActionDate = ''를보고 있습니다.
당신은 같은 것이 필요합니다
string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";
문자열 연결이 발생하지 않습니다.