문제

날짜 선택기 상자가있는이 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";

문자열 연결이 발생하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top