1

所以我有这个让我头疼的问题。如果有人能帮我解决这个问题,我将不胜感激。

我将 Coldfusion 与 MSSQL 和 MySQL 一起使用。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 服务器版本相对应的手册,以在第 3 行的 '' 附近使用正确的语法 SELECT * FROM TBL_CHILD WHERE EMP_ID =

4

4 回答 4

3

应该加入这些 mySQL 查询,而不是为每个员工两次访问数据库。它将解决您的第二个查询导致错误,然后您只需要担心此查询返回 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>

您还可以使用一个查询让所有员工返回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可能有时可能不会返回数据。因此,在您的第二个查询#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 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 '' 附近使用正确的语法 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 回答