我需要再问一些问题。我是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
答案 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]
。现在,重叠陷阱就像一个魅力。抱歉这个愚蠢的错误......