1

だから私は頭痛の種になるこの問題を抱えています。誰かが私がこれを解決するのを手伝ってくれるなら感謝します。

MySQL と一緒に MSSQL と Coldfusion を使用しています。MSSQL データベースは、私が現在取り組んでいるこのアプリケーションの主要なデータソースです。従業員のデータベースにはMySQLを使用しています(PHPで従業員のデータベースを開発するために作成されました)。このアプリケーションを機能させるには、それに接続する必要があります。

MySQL テーブル:

TBL_EMPLOYEE

+---------+------------------+-------------------|
|EMP_ID   |    EMP_NUMBER    |    DATE_OF_BIRTH  |
+---------+------------------+-------------------|
| 1       |    00001         |    2009-01-01     |
| 2       |    00002         |    2009-01-15     |
| 3       |    TEMP01        |    2009-05-10     |  
| 4       |    TEMP02        |    2010-02-04     |
| 5       |    0006          |    2010-03-01     |
+---------+------------------+-------------------|

TBL_CHILD

+---------+------------------+---------------------|
|EMP_ID   |    CHILD_ID      |    DATE_OF_BIRTH    |

+---------+------------------+---------------------|
| 1       |    1             |    2008-11-12       |
| 1       |    2             |    2010-10-06       |
| 2       |    3             |    2009-05-10       |
| 5       |    4             |    2010-02-16       |
| 5       |    5             |    2012-03-08       |
+---------+------------------+---------------------|

このアプリケーションは、スタッフの生年月日をチェックします。彼に子供がいる場合、システムは長男の生年月日を表示します。それ以外の場合 (子供がいない場合)、システムは彼自身の生年月日を表示します。

問題は次のとおりです。

<cfquery name="getEmployee" datasource="#mysqlDB#">
    SELECT EMP_ID,EMP_NUMBER,DATE_OF_BIRTH
    FROM   TBL_EMPLOYEE
    WHERE   EMP_NUMBER = '#users.EMP_NO[mainRow]#'
</cfquery>

<cfset mysql_id = getEmployee.EMP_ID>

<cfquery name="getChild" datasource="#mysqlDB#">
    SELECT *
    FROM   TBL_CHILD
    WHERE  EMP_ID =#mysql_id#
    ORDER BY DATE_OF_BIRTH ASC
    LIMIT 1
</cfquery>


Note : 
#users.EMP_NO[mainRow]# --> loop query from MSSQL
EMP_NUMBER = string
EMP_ID = integer (auto)

このクエリは、従業員番号が数字 (つまり、001、101、23002 など) の場合に機能します (「」記号なし)。

<cfquery name="getEmployee" datasource="#mysqlDB#">
    SELECT *
    FROM    TBL_EMPLOYEE
    WHERE EMP_NUMBER = #users.EMP_NO[mainRow]#
</cfquery>

<cfset mysql_id = getEmployee.EMP_ID>

<cfquery name="getChild" datasource="#mysqlDB#">
    SELECT *
    FROM   TBL_CHILD
    WHERE  EMP_ID =#mysql_id#
</cfquery>

しかし、従業員番号が文字(TEMP101、TEMP007など)の場合、エラーが発生します。

 '#users.EMP_NO[mainRow]#'

phpmyadmin で同じクエリを使用しようとしましたが、問題なく動作します。なぜこれが起こっているのか、これを解決する方法を教えてもらえますか?

(コメントからの更新) エラーメッセージは次のとおりです。

データベース クエリの実行中にエラーが発生しました。SQL 構文にエラーがあります。使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。 near '' at line 3 SELECT * FROM TBL_CHILD WHERE EMP_ID =

4

4 に答える 4

3

これらの mySQL クエリは、従業員ごとにデータベースに 2 回アクセスするのではなく、結合する必要があります。エラーの原因となっている 2 番目のクエリが解決されるため、このクエリが 0 の結果を返すことだけを心配する必要があります。

何かのようなもの

<cfquery name="getEmployee" datasource="#mysqlDB#">
  SELECT 
    [only the columns you need from both tables]
  FROM 
    TBL_EMPLOYEE
    inner join tbl_child on tbl_employee.emp_id = tbl_child.emp_id
  WHERE 
    tbl_employee.EMP_NUMBER = <cfqueryparam cfsqltype="cf_sql_varchar" value="#users.EMP_NO[mainRow]#">
</cfquery>

を使用して、すべての従業員を 1 つのクエリで取得することもできます。in

WHERE 
        tbl_employee.EMP_NUMBER in (<cfqueryparam cfsqltype="cf_sql_varchar" value="#valueList(users.EMP_NO)#" list="yes">)
于 2012-12-20T12:00:49.670 に答える
2

ほとんどのgetEmployee場合、データが返されないことがあります。したがって、2 番目のクエリで#mysql_id#は何も出力されません。これを解決するには、引用符を配置して次のクエリを使用します。

<cfquery name="getChild" datasource="#mysqlDB#">
SELECT *
FROM TBL_CHILD
WHERE EMP_ID = '#mysql_id#'
</cfquery>

もちろん、これは実行時エラーに対処するだけですが、データの問題にも直面している可能性があります。

于 2012-12-20T10:31:01.310 に答える
2

実際のエラーを詳述したフォローアップ コメントに基づいて:

@AdamCameron : データベース クエリの実行中にエラーが発生しました。SQL 構文にエラーがあります。3 行目の near '' を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。 SELECT * FROM TBL_CHILD WHERE EMP_ID =

状況がどこにあるのかについて、あなたが私たちに少しばかげたステアを与えたことを私に示唆しています。ではなくEMP_NUMBER、 に関連していEMP_IDます。これが、状況を単純に説明するのではなく、実際のエラー メッセージを表示することが重要である理由です (実際、実際にエラー メッセージに注意を払う必要があります...なぜなら、問題が何であるかを教えてくれるからです ;-)

ここでの問題は、英数字の EMP_ID があることです。つまり、値を引用符で囲む必要があります。たとえば、次のようになります。

SELECT *
FROM TBL_CHILD
WHERE EMP_ID = '#mysql_id#'

最初のコメントでほのめかしたように、これを行うべきではありませんが。動的データ値は、SQL でハードコーディングするのではなく、常にパラメーターとして渡す必要があります。したがって、次のようになります。

SELECT *
FROM TBL_CHILD
WHERE EMP_ID = <cfqueryparam value="#mysql_id#" cfsqltype="CF_SQL_VARCHAR"> <!--- I'm guessing at VARCHAR --->

また、@Candide は正しい可能性があります (実際、ほぼ確実です!)...mysql_idからのクエリが空のmysql_id場合、空の文字列になりますが、これもここでは無効です。それを確認する必要があります。

最後に...使用しないでくださいSELECT *。実際に必要な列を指定します (実際に必要な列のみ)。これはあなたの問題とは関係ありません。それは単なる「良い習慣」です。

于 2012-12-20T11:10:45.920 に答える
-1

実際には、MSSQL と MySQL の EMP_NUMBER の違いによってエラーが発生します。

例えば:

EMP NUMBER in MSSQL = 080, but in MySQL is stored as 80. 

EMP NUMBER in MSSQL = 070, but in MySQL is stored as 70. 

これを解決するには、mysql_idをトリミングするだけです

<cfset mysql_id =rereplace(mysql_id,'^0+','','ALL')>

すべての回答に感謝し、無関係な質問をして申し訳ありません。

于 2012-12-21T03:13:38.347 に答える