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
여기서 SqlDbType.NVarChar를 입력합니다. SQL 유형을 설정해야합니다.