在 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;
AddWithValue
将 value 作为第二个参数,因此将 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
。现在重叠陷阱就像一个魅力。对不起愚蠢的错误...
有件事我还要再问一下。我是两年的 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;
AddWithValue
将 value 作为第二个参数,因此将 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
。现在重叠陷阱就像一个魅力。对不起愚蠢的错误...