[c#] AddWithValue 매개 변수가 NULL 인 경우 예외

SQL 쿼리에 대한 매개 변수를 지정하기위한 다음 코드가 있습니다. 사용할 때 다음과 같은 예외가 발생합니다 Code 1. 하지만 내가 사용할 때 잘 작동합니다 Code 2. 에서 Code 2우리는 null을 확인하고 따라서 if..else블록을 가지고 있습니다.

예외:

매개 변수가있는 쿼리 ‘(@application_ex_id nvarchar (4000)) SELECT E.application_ex_id A’에는 제공되지 않은 매개 변수 ‘@application_ex_id’가 필요합니다.

코드 1 :

command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);

코드 2 :

if (logSearch.LogID != null)
{
         command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
}
else
{
        command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
}

질문

  1. 코드 1의 logSearch.LogID 값에서 NULL을 가져올 수없는 이유를 설명해 주시겠습니까 (DBNull 허용 가능)?

  2. 이것을 처리하는 더 좋은 코드가 있습니까?

참조 :

  1. SqlParameter에 null 할당
  2. 반환되는 데이터 유형은 테이블의 데이터에 따라 다릅니다.
  3. 데이터베이스 smallint에서 C # nullable int 로의 변환 오류
  4. DBNull의 요점은 무엇입니까?

암호

    public Collection<Log> GetLogs(LogSearch logSearch)
    {
        Collection<Log> logs = new Collection<Log>();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string commandText = @"SELECT  *
                FROM Application_Ex E 
                WHERE  (E.application_ex_id = @application_ex_id OR @application_ex_id IS NULL)";

            using (SqlCommand command = new SqlCommand(commandText, connection))
            {
                command.CommandType = System.Data.CommandType.Text;

                //Parameter value setting
                //command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
                if (logSearch.LogID != null)
                {
                    command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
                }
                else
                {
                    command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
                }

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        Collection<Object> entityList = new Collection<Object>();
                        entityList.Add(new Log());

                        ArrayList records = EntityDataMappingHelper.SelectRecords(entityList, reader);

                        for (int i = 0; i < records.Count; i++)
                        {
                            Log log = new Log();
                            Dictionary<string, object> currentRecord = (Dictionary<string, object>)records[i];
                            EntityDataMappingHelper.FillEntityFromRecord(log, currentRecord);
                            logs.Add(log);
                        }
                    }

                    //reader.Close();
                }
            }
        }

        return logs;
    }



답변

짜증나 지 않나요?

당신이 사용할 수있는:

command.Parameters.AddWithValue("@application_ex_id",
       ((object)logSearch.LogID) ?? DBNull.Value);

또는 “dapper”와 같은 도구를 사용하면 모든 작업을 수행 할 수 있습니다.

예를 들면 :

var data = conn.Query<SomeType>(commandText,
      new { application_ex_id = logSearch.LogID }).ToList();

유혹 를 얻을 수 말끔에 메서드를 추가하는 IDataReader것이 좋은 생각인지 정말 있는지 아직 ….


답변

SqlParameterCollectionnull 값을 처리 하는 확장 메서드를 작성하는 것이 더 쉽습니다 .

public static SqlParameter AddWithNullableValue(
    this SqlParameterCollection collection,
    string parameterName,
    object value)
{
    if(value == null)
        return collection.AddWithValue(parameterName, DBNull.Value);
    else
        return collection.AddWithValue(parameterName, value);
}

그런 다음 다음과 같이 부릅니다.

sqlCommand.Parameters.AddWithNullableValue(key, value);


답변

저장 프로 시저를 호출하는 동안이 작업을 수행하는 경우 : 매개 변수에 기본값을 선언하고 필요할 때만 추가하면 읽기가 더 쉽다고 생각합니다.

SQL :

DECLARE PROCEDURE myprocedure
    @myparameter [int] = NULL
AS BEGIN

씨#:

int? myvalue = initMyValue();
if (myvalue.hasValue) cmd.Parameters.AddWithValue("myparamater", myvalue);


답변

일부 문제, 필요에 따라 SQLDbType 설정 허용

command.Parameters.Add("@Name", SqlDbType.NVarChar);
command.Parameters.Value=DBNull.Value

여기서 SqlDbType.NVarChar를 입력합니다. SQL 유형을 설정해야합니다.


답변