所以我有这个让我头疼的问题。感谢任何人都可以帮我解决这个问题。
我正在将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 |
+---------+------------------+---------------------|
此应用程序将检查员工的DOB。如果他有孩子,系统将显示他的大孩子的DOB。否则(如果他没有孩子)系统将显示他自己的DOB。
问题在于:
<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 =
答案 0 :(得分: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">)
答案 1 :(得分:2)
有时候getEmployee
很可能无法返回数据。因此,在您的第二个查询中#mysql_id#
将不输出任何内容。要解决此问题,您可以放置引号并使用以下查询:
<cfquery name="getChild" datasource="#mysqlDB#">
SELECT *
FROM TBL_CHILD
WHERE EMP_ID = '#mysql_id#'
</cfquery>
当然,这只解决了运行时错误,但您很可能也面临数据问题。
答案 2 :(得分: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 *
。指定您真正想要的列(并且仅您真正想要的列)。这与您的问题无关,只是“良好做法”。
答案 3 :(得分:-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')>
感谢所有答案,对此无关紧要的问题感到非常抱歉。