반응형
매개 변수화 된 쿼리는… 제공되지 않은 매개 변수 '@units'를 예상합니다.
이 예외가 발생합니다.
매개 변수가있는 쿼리 '(@Name nvarchar (8), @ type nvarchar (8), @ units nvarchar (4000), @ rang'에는 제공되지 않은 매개 변수 '@units'가 필요합니다.
삽입 코드는 다음과 같습니다.
public int insertType(string name, string type, string units = "N\\A", string range = "N\\A", string scale = "N\\A", string description = "N\\A", Guid guid = new Guid())
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand();
command.CommandText = "INSERT INTO Type(name, type, units, range, scale, description, guid) OUTPUT INSERTED.ID VALUES (@Name, @type, @units, @range, @scale, @description, @guid) ";
command.Connection = connection;
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@type", type);
command.Parameters.AddWithValue("@units", units);
command.Parameters.AddWithValue("@range", range);
command.Parameters.AddWithValue("@scale", scale);
command.Parameters.AddWithValue("@description", description);
command.Parameters.AddWithValue("@guid", guid);
return (int)command.ExecuteScalar();
}
}
AddWithValue
함수를 사용하고 함수에 대한 기본 매개 변수를 추가했는지 확인 하기 때문에 예외는 놀랍습니다 .
해결 :
문제는 빈 문자열 (기본값을 재정의하는)이있는 일부 매개 변수가
다음은 작동 코드입니다.
public int insertType(string name, string type, string units = "N\\A", string range = "N\\A", string scale = "N\\A", string description = "N\\A", Guid guid = new Guid())
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand();
command.CommandText = "INSERT INTO Type(name, type, units, range, scale, description, guid) OUTPUT INSERTED.ID VALUES (@Name, @type, @units, @range, @scale, @description, @guid) ";
command.Connection = connection;
command.Parameters.AddWithValue("@Name", name);
command.Parameters.AddWithValue("@type", type);
if (String.IsNullOrEmpty(units))
{
command.Parameters.AddWithValue("@units", DBNull.Value);
}
else
command.Parameters.AddWithValue("@units", units);
if (String.IsNullOrEmpty(range))
{
command.Parameters.AddWithValue("@range", DBNull.Value);
}
else
command.Parameters.AddWithValue("@range", range);
if (String.IsNullOrEmpty(scale))
{
command.Parameters.AddWithValue("@scale", DBNull.Value);
}
else
command.Parameters.AddWithValue("@scale", scale);
if (String.IsNullOrEmpty(description))
{
command.Parameters.AddWithValue("@description", DBNull.Value);
}
else
command.Parameters.AddWithValue("@description", description);
command.Parameters.AddWithValue("@guid", guid);
return (int)command.ExecuteScalar();
}
}
이 코드를 시도하십시오.
SqlParameter unitsParam = command.Parameters.AddWithValue("@units", units);
if (units == null)
{
unitsParam.Value = DBNull.Value;
}
그리고 다른 모든 매개 변수에서 null 값을 확인해야합니다. null이면 DBNull.Value
값을 전달해야 합니다.
Null 통합 연산자를 사용하는 방법은 다음과 같습니다.
cmd.Parameters.AddWithValue("@units", units ?? (object)DBNull.Value);
cmd.Parameters.AddWithValue("@range", range ?? (object)DBNull.Value);
cmd.Parameters.AddWithValue("@scale", scale ?? (object)DBNull.Value);
cmd.Parameters.AddWithValue("@description", description ?? (object)DBNull.Value);
또는 더 엄격한 유형 검사를 위해 :
cmd.Parameters.Add("@units", SqlDbType.Int).Value = units ?? (object)DBNull.Value;
cmd.Parameters.Add("@range", SqlDbType.Int).Value = range ?? (object)DBNull.Value;
cmd.Parameters.Add("@scale", SqlDbType.Int).Value = scale ?? (object)DBNull.Value;
cmd.Parameters.Add("@description", SqlDbType.VarChar).Value = description ?? (object)DBNull.Value;
연산자도 연결됩니다.
int?[] a = { null, null, 1 };
Console.WriteLine(a[0] ?? a[1] ?? a[2]);
command.Parameters.AddWithValue("@Name", (name == null ? "" : name));
This extension class was useful to me a couple of times so far, for those issues:
public static class DbValueExtensions
{
// Used to convert values coming from the db
public static T As<T>(this object source)
{
return source == null || source == DBNull.Value
? default(T)
: (T)source;
}
// Used to convert values going to the db
public static object AsDbValue(this object source)
{
return source ?? DBNull.Value;
}
}
You would normally use it in two scenarios. First, when creating parameters for your query:
var parameters = new Dictionary<string, object>
{
{ "@username", username.AsDbValue() },
{ "@password", password.AsDbValue() },
{ "@birthDate", birthDate.AsDbValue() },
};
or when parsing the SqlReader values:
while (reader.Read())
{
yield return new UserInfo(
reader["username"].As<string>(),
reader["birthDate"].As<DateTime>(),
reader["graduationDate"].As<DateTime?>(),
reader["nickname"].As<string>()
);
}
This is a method to be reused with multiple parameters:
public void NullorEmptyParameter(QC.SqlCommand command, string at, string value)
{
if (String.IsNullOrEmpty(value))
{
command.Parameters.AddWithValue(at, DBNull.Value);
}
else
command.Parameters.AddWithValue(at, value);
}
And then you can reuse it for as many commands and params:
NullorEmptyParameter(command, "@Idea_ID", Idea_ID);
NullorEmptyParameter(command, "@Opportunities_or_Idea", Opportunities_or_Idea);
반응형
'Programing' 카테고리의 다른 글
SBT에서 Scala 프로젝트에 Java 버전을 적용합니까? (0) | 2020.12.12 |
---|---|
AutoMapper는 여러 소스에서 변환 (0) | 2020.12.12 |
jq 또는 대체 명령 줄 도구를 사용하여 JSON 파일 비교 (0) | 2020.12.12 |
JVM GC가 참조 비교 중에 객체를 이동하여 양쪽이 동일한 객체를 참조하더라도 비교가 실패 할 수 있습니까? (0) | 2020.12.12 |
IE에서 "화살표 기능"이 작동하지 않는 이유는 무엇입니까? (0) | 2020.12.12 |