2016-05-16 5 views
0

この問題は1時間続きました。私はColdFusion言語を使用しています。私のコードでは、データベースOracleにdatetimeを挿入したいと考えています。このようになります。私のデータベースに私の日時を挿入するColdFusion:日付変数を1つの変数にデータベースに挿入するOracle10

<cfset form.date_print = #dateFormat(Now(),"yyyy-mm-dd") & " " & timeFormat(now(), "HH:mm:ss")#> 

と機能::日時形式は次のようになります。私のテーブルで

<cfset qAdd = APPLICATION.qbs.insertData(column:'date_print,usr_id_print,qsd_id,loc_id',formData:'#FORM#',table:"qpl_print_log")> 

を、属性date_printの形式はDATEです。

私は私のデータベースのOracleに日時を挿入するにはボタンをクリックすると、このスナップショットです:

enter image description here

UPDATE

これは、データベース

<cffunction name="insertData" access="public" returntype="struct" output="no"> 
    <cfargument name="column" required="true" type="string" hint="data"> 
    <cfargument name="value" required="false" type="string" hint="data"> 
    <cfargument name="formData" required="false" type="struct" hint="data"> 
    <cfargument name="table" required="true" type="string" hint="table"> 
    <cfargument name="dateType" required="false" type="string"> 
    <cfargument name="sqlNvarcharType" required="false" type="string"> 
    <cfargument name="returnID" required="true" type="boolean" default="true"> 
    <cfargument name="db" required="false" type="string" hint="data" default="#variables.db.db_datasource_ro#"> 

    <cfset var local   = {}> 
    <cfset local.counter  = 0> 
    <cfset local.return  = {}> 
    <cfset local.return.status = "OK"> 
    <cfset local.return.id  = 0> 
    <cfset local.return.cuid = APPLICATION.cuid.getCUID()> 
    <cfif ListFind(column,"submit")> 
    <cfset column = ListDeleteAt(column, ListFind(column,"submit")) > 
    </cfif> 

    <cftry> 
    <cfquery name="local.insertData" datasource="#db#" result="myresult"> 
     INSERT INTO #table#(#column#,cuid) VALUES(
     <cfif isDefined('Arguments.value') AND Arguments.value NEQ ""> 
      <cfloop from="1" to="#ListLen(Arguments.value,';')#" index="item"> 
      <cfif isDefined('Arguments.dateType') AND ListFind(dateType,item)><cfqueryparam cfsqltype="cf_sql_date" value="#convertDate(trim(listGetAt(value, item,';')))#"> 
      <cfelseif isDefined('Arguments.sqlNvarcharType') AND ListFind(sqlNvarcharType,item)><cfqueryparam cfsqltype="cf_sql_nvarchar" value="#trim(listGetAt(value, item,';'))#"> 
      <cfelse><cfqueryparam cfsqltype="cf_sql_char" value="#trim(listGetAt(value, item,';'))#"></cfif><cfif item LT ListLen(column)>,</cfif> 
      </cfloop> 
     <cfelse> 
      <cfloop list="#column#" index="theField"> 
      <cfset local.counter = local.counter+1> 
      <cfif isDefined('Arguments.dateType') AND ListFind(dateType,theField)><cfqueryparam cfsqltype="cf_sql_date" value="#convertDate(formData[theField])#"> 
      <cfelseif isDefined('Arguments.sqlNvarcharType') AND ListFind(sqlNvarcharType,theField)><cfqueryparam cfsqltype="cf_sql_nvarchar" value="#trim(formData[theField])#"> 
      <cfelse><cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(formData[theField])#"></cfif><cfif local.counter LT ListLen(column)>,</cfif> 
      </cfloop> 
     </cfif> 
     ,'#local.return.cuid#') 
    </cfquery> 

    <cfif Arguments.returnID EQ true> 
     <cfquery name="qetAutoIncrementID" datasource="#db#"> 
      SELECT id 
      FROM #table# 
      WHERE cuid = '#local.return.cuid#' 
     </cfquery> 
     <cfset local.return.id = qetAutoIncrementID.id> 
    </cfif> 

    <cfcatch> 
     <cfset local.return.status = "BAD"> 
     <cfset local.return.cfcatch = cfcatch> 
     <cfset APPLICATION.db.notifyError(functionname:"Insert:#table#", args:ARGUMENTS, cfcatch:cfcatch)> 
     </cfcatch> 
    </cftry> 

    <cfreturn local.return> 
</cffunction> 
にデータを挿入する機能です

私のテーブルでは、属性date_printはdate formatを表示しますまあ。

enter image description here

しかし、ColdFusionで、私はこの2016-05-16 14:12:35のような形式の日付と時刻を送信します。

しかし、自分の時間形式を見たい場合は、鉛筆アイコンをクリックする必要があります。

enter image description here

は、誰もがこの問題を解決するために私を助けることができる願っています。

はあなたがcfsqltype as cf_sql_dateを渡している

+0

私はoracleの経験はありませんが、oracleはDD-MM-YY形式でデータを格納しているようです。ドキュメントをご覧くださいhttps://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i1847 –

+0

基本的に、私はColdFusionで日付と時刻の形式を読み取ることはできません。私はデータベースに実行中にエラーが発生していると思います。私は本当にこの問題を解決する方法がわかりません。誰もが考えている? –

+0

CFは日付と時刻を読み取ることができますが、データベースにデータを挿入する際に問題があると述べました。データを挿入しているクエリを投稿していない2つ目のことです。 –

答えて

2

ありがとうございます。 cfsqltypeとしてCF_SQL_TIMESTAMPを渡す必要があります。

あなたのcfqueryparamのは次のようになります。

<cfqueryparam cfsqltype="CF_SQL_TIMESTAMP" value="#convertDate(trim(listGetAt(value, item,';')))#"> 

CF_SQL_DATEはcf_sql_timestampは完全な日付のタイムスタンプを使用していますように、単に日付値日時(実際には数値として評価される)を切り捨てます。

+0

こんにちは、ありがとうございました。私のチームは、デフォルトで、このコードを使用しました: ''そこで、私は次のようにコードを変更しました: ' '。私はまだエラーが発生します。 –

+0

@FaiZalDong、データベースに挿入するときに日付を書式設定するのはなぜですか?日付の書式設定は表示用です。どの日付形式をデータベースに渡すかは関係ありません。データベースは独自の規則に従って日付を格納します。

1

ここではいくつかのことが起こっています。

Oracleは、世紀、年、月、日、時、分、秒の値を持つDATEデータ型を格納します。 MS SQLのエポック・ストレージとは異なりますが、日付データ型ではまだ時間値にアクセスできます。精度が必要な場合は、TIMESTAMPデータ型を使用すると、小数点以下5桁または6桁のデータが得られます(多くの場合はミリ秒です)。

日時を格納するために、Tusharは正しいです。 CF_SQL_DATEの代わりにCF_SQL_TIMESTAMPを使用する必要があります。 Oracleの場合、TIMESTAMP値はあなたが探している時:分:秒の精度を与えます。 Oracleは非常にデータ型に敏感ですが(MS SQLは時にはより寛容になります)、CF_SQL_DATE(MSSQLで動作する)は整数部分として返され、時間部分は切り捨てられます(0時間、0分、0秒) CF_SQL_TIMESTAMPは、Oracle(およびSQL Serverなどの他のデータベース)がよりよく理解できる実際のタイムスタンプ・オブジェクトです。したがって、DATEの代わりにTIMESTAMPを使用してください。

クリックして値を編集すると、0:0:0が表示されます。

あなたのクエリツール自体があなたの書式の日付を見ている理由です。 どちらが使用されているかはわかりませんが、SQL Developerの表示を変更するには、ツール>>環境設定>> NLSをクリックして、使用するマスクで日付形式を編集してください(YYYY-MM-DD HH24:ミス)。これにより、希望する日付形式の照会が表示されます。 TOADや他の人は、何か類似しているはずです。

このページの半分ほどは、該当するCFとデータ型の比較を示すグラフです。 https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-p-q/cfqueryparam.html

日付マスキングを使用する場合は注意してください。異なるシステムではさまざまなことが行われ、ColdFusionでも「y」は「Y」と異なる場合があります。

また、一般的なコードレビューノートでは、あなたの入力(特にテーブル名)を検証し、queryparamでmaxlength引数を使用してください。 insertData()は非常に注入可能です。また、CF> 9の場合は、var localを使用しないでください。 LOCALスコープがColdFusionに組み込まれました。それは何も壊すべきではありませんが、実際にあなたのコードが行っていると思っていることをやっているわけではありません。

+0

また、Oracleデータ型:http://psoug.org/reference/datatypes.html – Shawn

+1

* insertData()は非常に注入可能に見えます。また、動的SQLを使用する必要がある理由はありますか?ダイナミックSQLはいつも素晴らしいアイデアのようですが、安全にやるのが非常に難しくなります。 IMOでは、トラブルシューティングやメンテナンスにかかる時間が実際に節約されるよりも長くなります。このスレッドは良い例です。 – Leigh

+0

私は動的SQLを構築する必要がある場合、タグcfよりもスクリプトcfでSQL文字列を構築する方がはるかに簡単で洗練されていることが分かりました。しかし、それは私だけです。それは、私はおそらくまだsprocでこれを行うだろうと述べた。 – Shawn

関連する問題