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의 logSearch.LogID 값에서 NULL을 가져올 수없는 이유를 설명해 주시겠습니까 (DBNull 허용 가능)?
이것을 처리하는 더 좋은 코드가 있습니까?
참조 :
- SqlParameter에 null 할당
- 반환되는 데이터 유형은 테이블의 데이터에 따라 다릅니다.
- 데이터베이스 smallint에서 C # nullable int 로의 변환 오류
- 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
것이 좋은 생각인지 정말 있는지 아직 ....
SqlParameterCollection
null 값을 처리 하는 확장 메서드를 작성하는 것이 더 쉽습니다 .
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
where SqlDbType.NVarChar you type. Necessarily set SQL type. Enjou
참고URL : https://stackoverflow.com/questions/13451085/exception-when-addwithvalue-parameter-is-null
'Programing' 카테고리의 다른 글
"인수"에서 조각을 얻는 방법 (0) | 2020.10.21 |
---|---|
파이썬에서 소금과 해시 암호 (0) | 2020.10.21 |
에 대한 테이블 저장소 엔진에는 쿼리 별 순서에이 옵션이 없습니다 (오류 1031). (0) | 2020.10.21 |
GridView-빈 데이터 소스에 헤더 표시 (0) | 2020.10.21 |
문자열에서 일치하는 수를 계산하는 Perl 단축키가 있습니까? (0) | 2020.10.21 |