在SQLCommand C#中多次使用参数

时间:2015-03-17 16:06:17

标签: c# sql-server .net-4.0

我需要再问一些问题。我是PHP开发人员已经两年了。以前,我在Java之前使用Java一年,在Java之前至少使用C#至少几个月。我正在重新学习C#。以下C#string声明来自经过测试的SQL脚本,该脚本确定预订条目(来自[RESERVATION]表)是否与现有Pending预留重叠(由{过滤} {1}} where子句)

[status] as [r]

我使用此方法附加参数:

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上发生至少两次。感谢您的支持。

编辑:

这些是我附加参数的方式(对不起前面的例子被错误粘贴,Tee嘻嘻):

string

2 个答案:

答案 0 :(得分:1)

AddWithValue作为第二个参数,因此将SqlDbType解释为参数值。您需要使用Add代替AddWithValue

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

来自文档:

  

AddWithValue替换了采用的SqlParameterCollection.Add方法   字符串和对象。带有一个字符串和一个的Add的重载   对象因为可能含糊不清而被弃用   SqlParameterCollection.Add带有String和a的重载   SqlDbType枚举值其中传递带字符串的整数   可以解释为参数值或   对应的SqlDbType值。

编辑:您正在执行的操作仅起作用,因为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

答案 1 :(得分:0)

对不起我的不好,似乎我在某些parameters上略微忽略了sql类型的映射

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.Date而不是SqlDbType.DateTime。我忽略了列sql type[reservation_date_from]的{​​{1}}都是[reservation_date_to]。现在,重叠陷阱就像一个魅力。抱歉这个愚蠢的错误......