ColdFusion解决多对多的关系

时间:2014-03-18 18:10:05

标签: ms-access coldfusion

这是我在新博文中插入新帖子的提交页面。

第一个将Title,BlogBody和UserID插入数据库。

第二部分是插入用户为博客选择的标签,并通过连接表将它们与博客相关联。 基本上,如果用户选择多个标记,则每个标记将是联结表中的单独条目,并且将与插入新博客帖子时在自动增量字段中创建的BlogID匹配。

目前此代码正确插入了博客。只要相同的标题没有使用两次(因为WHERE Title = '#Form.Title#')并且我只选择1个标签,它也会使第2部分更正。

如何更改此代码以允许多个标记在联结表中包含多个条目,以及如何将其更改为我没有异常的位置,其中用户为两个博客提供相同的标题。

对于Anomalies部分,我尝试SELECT (Max)BlogID FROM BlogPosts,但是我得到了从“复杂到简单错误”的转换。

我很清楚Microsoft Access不是一个很好用的数据库,但这是我不得不使用的。

<cfquery name="AddBlog" datasource="prpblog">
    INSERT INTO BlogPosts (Title, BlogBody, UserID)
    VALUES
    (
        <cfqueryparam value='#Form.Title#' cfsqltype="cf_sql_varchar"/>, 
        <cfqueryparam value='#Form.BlogBody#' cfsqltype="cf_sql_varchar"/>, 
        <cfqueryparam value='#Form.SelectAuthor#' cfsqltype="cf_sql_numeric"/>
    )
</cfquery>

<!--- Query to find BlogID from newest post --->
<CFQUERY name="BlogID" datasource="prpblog">
SELECT BlogID
FROM BlogPosts
WHERE Title = '#Form.Title#'
</CFQUERY>                      

<!--- Query to Insert BlogID/TagID into Junction Table --->
<cfquery name="AddTag" datasource="prpblog">
    INSERT INTO BlogTagJunction (BlogID,TagID, TagReal)
    VALUES
    (
        <Cfoutput query="BlogID">#BlogID#</cfoutput>,
        <cfqueryparam value='#Form.SelectTag#' cfsqltype="cf_sql_numeric" />,
        <cfqueryparam value='#Form.SelectTag#' cfsqltype="cf_sql_varchar" />


    )
</cfquery>

(已删除答案更新)

这是我根据您提供的网络链接提示编写的代码(暂时忽略CF交易)。我收到了:

  

执行数据库查询时出错。 [Macromedia] [SequeLink JDBC   驱动程序] [ODBC套接字] [Microsoft] [ODBC Microsoft Access驱动程序]数据   标准表达式中的类型不匹配。

我删除了“Select Statement”以帮助诊断问题。我仍然收到同样的错误。只使用代码中的top语句,我将createUUID()更改为SubID()并接收:变量SUBID未定义,这是我所期望的。我现在明白了应该做些什么。

<!--- Query to Insert Blog --->
<cfset variables.SubID=createUUID()>
        <cfquery name="AddBlog" datasource="blog">
            INSERT INTO BlogPosts (
                Title,
                BlogBody,
                UserID,
                SubID
            )
            VALUES (
                <cfqueryparam value='#Form.Title#' cfsqltype="cf_sql_varchar"/>,
                <cfqueryparam value='#Form.BlogBody#' cfsqltype="cf_sql_varchar"/>,
                <cfqueryparam value='#Form.SelectAuthor#' cfsqltype="cf_sql_numeric"/>,
                '#variables.SubID#'
            )
        </cfquery>
        <cfquery 
   name="getMyID" 
   datasource="blog">
   SELECT 
      BlogPosts.BlogID
   FROM 
      BlogPosts
   WHERE 
      BlogPosts.SubID = '#variables.SubID#'
</cfquery>

@Leigh

这是我根据您提供的网络链接提示编写的代码(暂时忽略CF交易)

我收到: 执行数据库查询时出错。 [Macromedia] [SequeLink JDBC驱动程序] [ODBC套接字] [Microsoft] [ODBC Microsoft Access驱动程序]条件表达式中的数据类型不匹配。

我删除了“Select Statement”以帮助诊断问题。我仍然收到同样的错误。 只有代码中的顶部语句,我将createUUID()更改为SubID()并收到:变量SUBID未定义,这是我所期望的。我现在明白了应该做些什么。

<!--- Query to Insert Blog --->
<cfset variables.SubID=createUUID()>
        <cfquery name="AddBlog" datasource="blog">
            INSERT INTO BlogPosts (
                Title,
                BlogBody,
                UserID,
                SubID
            )
            VALUES (
                <cfqueryparam value='#Form.Title#' cfsqltype="cf_sql_varchar"/>,
                <cfqueryparam value='#Form.BlogBody#' cfsqltype="cf_sql_varchar"/>,
                <cfqueryparam value='#Form.SelectAuthor#' cfsqltype="cf_sql_numeric"/>,
                '#variables.SubID#'
            )
        </cfquery>
        <cfquery 
   name="getMyID" 
   datasource="blog">
   SELECT 
      BlogPosts.BlogID
   FROM 
      BlogPosts
   WHERE 
      BlogPosts.SubID = '#variables.SubID#'
</cfquery>

修改 这是我从另一篇文章中解释的:我最终得到 Invalid data @@Identity for CFSQLTYPE CF_SQL_INTEGER.错误。

<cfquery name="AddTag" datasource="prpblog"> INSERT INTO BlogTagJunction (BlogID, TagID) SELECT <cfqueryparam value="@@Identity as Key" cfsqltype="cf_sql_integer">, TagID FROM Tags WHERE TagID IN ( <cfqueryparam value="#Form.SelectTag#" list="true" cfsqltype="cf_sql_numeric"/> ) </cfquery>

1 个答案:

答案 0 :(得分:0)

来自另一个主题:

  

“我自己通过在博客的插入语句之后创建一个查询语句来解决问题,该博客从我刚创建的博客中获取博客ID。”

在接受的答案中,用户使用CFQUERY的内置变量“IDENTITYCOL”来获取新ID的值。你不能用MS Access做到这一点。相反,您需要在单个事务中进行3次查询:

<cftransaction action="begin">

    <cftry>

        <cfquery name="AddBlog" datasource="prpblog">
            INSERT INTO BlogPosts (
                Title,
                BlogBody,
                UserID
            )
            VALUES (
                <cfqueryparam value='#Form.Title#' cfsqltype="cf_sql_varchar"/>,
                <cfqueryparam value='#Form.BlogBody#' cfsqltype="cf_sql_varchar"/>,
                <cfqueryparam value='#Form.SelectAuthor#' cfsqltype="cf_sql_numeric"/>
            )
        </cfquery>

        <!--- Query to find BlogID from newest post --->
        <cfquery name="BlogID" datasource="prpblog">
            SELECT @@IDENTITY AS NEW_ID
        </cfquery>

        <!--- Query to Insert BlogID/TagID into Junction Table --->
        <cfquery name="AddTag" datasource="prpblog">
            INSERT INTO BlogTagJunction (
                BlogID,
                TagID, 
                TagReal
            )
            VALUES (
                <cfqueryparam value='#BlogID.NEW_ID#' cfsqltype="cf_sql_numeric" />,
                <cfqueryparam value='#Form.SelectTag#' cfsqltype="cf_sql_numeric" />,
                <cfqueryparam value='#Form.SelectTag#' cfsqltype="cf_sql_varchar" />
            )
        </cfquery>

    <cfcatch type="database">

        <cftransaction action="rollback">

    </cfcatch>

    </cftry>

    <cftransaction action="commit">

</cftransaction>

希望这有帮助。

更新:Here's why you should not use SELECT MAX(ID) to get a newly inserted ID.