【问题标题】:JQuery date type , Sybase date type sent to CF functionJQuery日期类型,Sybase日期类型发送到CF函数
【发布时间】:2012-09-12 18:09:42
【问题描述】:

我有一个 Sybase SP,它将日期作为唯一参数并返回有关订单的信息。我从 CF 页面上的 JQuery 日期选择器获取日期 - 格式为 yy-mm-dd。当没有输入时,SP 默认为 getDate()。当我在表格上输入日期时,一切正常。当我不发送日期时 - 日期字段留空 - 我收到一个 CF 错误,告诉我参数不是日期类型。我知道 SP 正在发送一个日期时间值,但我怎样才能让 CF 函数识别它?

在 SP...

declare @order_dt datetime 

If @order_dt IS NULL
BEGIN
SELECT @order_dt = getDate()
END

在cfc中...

<cfargument name="order_dt" type="date" required="true" hint="order date to search for" >

 <cfprocparam type="In" cfsqltype="CF_SQL_DATE" dbvarname="@order_dt" value="#order_dt#" null="No">

在 .cfm 页面上...

<!--JQuery datepicker  -->
<script type="text/javascript">
   $(function() {
           $("#datepicker").datepicker({ dateFormat: "yy-mm-dd" }).val()
   });

表格看起来像这样:

<form id="xxxxForm">
<label for="date1">Pick a Date... </label>
<br>
<p><input type="text" id="datepicker" value="" name="date1"></p>
Then choose 'Search'...<br>
<input type="submit" name="submit" value="Search">
<br>
<br>

</form>

我怎样才能让 CF 认识到这是一个很好的价值?我在想如果我将@order_dt 声明为只是一个日期??

【问题讨论】:

  • 如果您不向 cfc 方法发送日期,您将继续收到该错误,因为 date 参数是必需的并且必须是 date 类型。如果您希望它不允许任何日期,请将其设为不需要并给它一个默认值,即日期,以便它通过 procparam 检查。
  • 同意。在您的&lt;cfargument&gt; 中设置required="false" 或使用default="#now()#"
  • 另外,我假设您只想要来自 CF 的日期而不是日期时间?对于日期时间值,您需要在 &lt;cfprocparam&gt; 中使用 CF_SQL_TIMESTAMP
  • 啊啊啊!当我太努力而错过显而易见的事情时,我讨厌它。感谢您指出。是的,我只是想要一个约会。我认为 now() 会起作用。我将 proc 中的数据类型更改为 date。

标签: jquery sql coldfusion sybase


【解决方案1】:
> <cfargument name="order_dt" type="date" required="true" 

当您将日期字段留空时,提交的值为空字符串“”。空字符串不是有效的date。这就是为什么当您尝试调用该函数时 CF 会抱怨的原因。

如 cmets 中所述,您可以使用 required="false"default="#now()#"。但要使其按预期工作,您必须在日期留空时省略参数。如果您向函数传递任何内容,即使是空字符串,default 也不会启动。但验证会。所以你仍然会得到同样的错误。

另一个选项是将参数类型更改为string。然后在函数内部进行验证。如果提供的值不是有效日期,请将其替换为 now()

   <cfargument name="order_dt" type="string" default="">

   <!--- simplistic date validation for illustration --->
   <cfif NOT isDate(arguments.order_dt)>
       <cfset arguments.order_dt = now()>
   </cfif>

或者只是将NULL 传递给存储过程

   <cfargument name="order_dt" type="string" default="">
   ...

   <cfprocparam type="In" value="#arguments.order_dt#" 
         null="#not isDate(arguments.order_dt)#" ....>

顺便说一句,dbvarname 不久前已被弃用。在最近的版本中,它什么也不做。仅支持位置参数。

【讨论】:

  • 我认为我们仍在运行 CFMX7,所以也许仍然有必要?我可以很好地使用 now() 来想它。并且 NULL 可以工作,因为一旦它到达那里,我默认在 SP 中使用 getDate()。从用户的角度来看,这是有道理的……通常他们会想要当前的日期值。谢谢
  • 文档说它在 MX 中已被弃用:“更改了 dbvarname 属性行为:它现在被所有驱动程序忽略。ColdFusion 使用 JDBC 2.2 并且不支持命名参数。” i> 所以它可能在你的版本中也没有任何作用。
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多