在 SQLCommand C# 中多次使用一个参数

Multiple usage of a parameter in a SQLCommand C#

有件​​事我还要再问一下。我是两年的 PHP 开发人员。以前,我接触过 Java 一年,在 Java 之前接触过至少几个月的 C#。我正在重新学习 C#。以下 C# string 声明来自经过测试的 SQL 脚本,该脚本确定预订条目(来自 [RESERVATION] table)是否与现有 Pending 预订重叠(由 [status] as [r] where 子句过滤)

string query = "select [r].[id], [first_name], [middle_name], [surname], [extension], [reservation_time_from], [reservation_time_to] " +
    "from [RESERVATION] as [r] " +
        "join [CUSTOMER] as [c] on [r].[customer_id] = [c].[id] " +
    "where [reservation_date] = @reservation_date and " +
        "( @reservation_time_from between [reservation_time_from] and [reservation_time_to] or " +
            "@reservation_time_to between [reservation_time_from] and [reservation_time_to] " +
        ") or " +
        "( [reservation_time_from] between @reservation_time_from and @reservation_time_to " +
            "or [reservation_time_to] between @reservation_time_from and @reservation_time_to " +
        ") and " +
        "[status] = 'Pending' " +
    "order by [transaction_date] asc";

我用这个方法附加了参数:

command.Parameters.AddWithValue();

现在,当我使用 command.ExecuteReader() 执行查询时,查询似乎不会获取 [RESERVATION] 的重叠计划。我有一种预感,它与数据的来源有关:那是一个 DateTimePicker 对象;因为列的列类型只有 date,但我不太确定。我使用此代码附加了那些时间选择器的值(这是 time 列的参数):

command.Parameters.AddWithValue("@reservation_time_from", SqlDbType.Date).Value = ((DateTime)param[value]).TimeOfDay;

有人可以帮助我吗?请注意,某些参数(例如 @reservation_time_from)在查询 string 中出现 至少两次 。感谢支持

编辑:

这是我附加参数的方式(抱歉之前的例子贴错了,嘻嘻):

command.Parameters.AddWithValue("@reservation_time_from", SqlDbType.Time).Value = ((DateTime)param['reservation_time_from']).TimeOfDay;
command.Parameters.AddWithValue("@reservation_time_to", SqlDbType.Time).Value = ((DateTime)param['reservation_time_to']).TimeOfDay;
command.Parameters.AddWithValue("@reservation_date_from", SqlDbType.Date).Value = ((DateTime)param['reservation_date_from']).Date;
command.Parameters.AddWithValue("@reservation_date_to", SqlDbType.Date).Value = ((DateTime)param['reservation_date_to']).Date;

AddWithValuevalue 作为第二个参数,因此将 SqlDbType 解释为参数值。您将需要使用 Add 而不是 AddWithValue:

command.Parameters.Add("@reservation_time_from", SqlDbType.Time)
                  .Value = ((DateTime)param[value]).TimeOfDay;

来自文档:

AddWithValue replaces the SqlParameterCollection.Add method that takes a String and an Object. The overload of Add that takes a string and an object was deprecated because of possible ambiguity with the SqlParameterCollection.Add overload that takes a String and a SqlDbType enumeration value where passing an integer with the string could be interpreted as being either the parameter value or the corresponding SqlDbType value.

编辑:您所做的工作之所以有效,是因为 SqlCommand 根据 Value 集中提供的值正确分配了 SqlDbType,而 SqlDbType 是无关紧要的:运行 此代码可查看:

var cmd = new SqlCommand();
var param = cmd.Parameters.AddWithValue("@date_from", SqlDbType.Date);
Console.WriteLine(param.ParameterName);
Console.WriteLine(param.SqlDbType);
Console.WriteLine(param.Value.GetType());

Console.WriteLine();

param.Value = DateTime.Today;
Console.WriteLine(param.ParameterName);
Console.WriteLine(param.SqlDbType);
Console.WriteLine(param.Value.GetType());

这输出:

@date_from
Int
System.Data.SqlDbType

@date_from
DateTime
System.DateTime

对不起,我的错,似乎 我稍微忽略了 sql 类型 在某些 parameters:[=18= 上的映射]

command.Parameters.AddWithValue("@reservation_date_from", SqlDbType.Date).Value = ((DateTime)param['reservation_date_from']).Date;
command.Parameters.AddWithValue("@reservation_date_to", SqlDbType.Date).Value = ((DateTime)param['reservation_date_to']).Date;

我必须使用 SqlDbType.DateTime,而不是使用 SqlDbType.Date。我忽略了 [reservation_date_from][reservation_date_to] 列的 sql type 都是 DateTime。现在重叠陷阱就像一个魅力。对不起愚蠢的错误...