gpt4 book ai didi

c# - AddWithValue 参数为 NULL 时的异常

转载 作者:IT王子 更新时间:2023-10-29 03:40:55 29 4
gpt4 key购买 nike

我有以下代码用于指定 SQL 查询的参数。当我使用 Code 1 时出现以下异常;但是当我使用 Code 2 时工作正常。在 Code 2 中,我们有一个 null 检查,因此有一个 if..else block 。

异常(exception):

The parameterized query '(@application_ex_id nvarchar(4000))SELECT E.application_ex_id A' expects the parameter '@application_ex_id', which was not supplied.

代码 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. Assign null to a SqlParameter
  2. Datatype returned varies based on data in table
  3. Conversion error from database smallint into C# nullable int
  4. What is the point of 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();

很想在 dapper 中添加一个方法来获取 IDataReader...还不确定这是否是个好主意。

关于c# - AddWithValue 参数为 NULL 时的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13451085/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com