Ms access ColdFusion解决多对多关系
这是我在博客中插入新帖子的提交页面 第一个将标题、BlogBody和UserID插入数据库 第二部分是插入用户为博客选择的标记,并通过连接表将它们与博客关联。 基本上,如果用户选择了多个标记,那么每个标记都将是连接表中的一个单独条目,并将与插入新博客文章时在自动增量字段中创建的BlogID相匹配 目前这段代码没有正确插入博客。只要相同的标题不被使用两次,第2部分也会进行更正,因为其中title='Form.title',我只选择了1个标记 如何更改此代码以允许多个标记在连接表中有多个条目,以及如何将其更改为用户为两个博客提供相同标题时不会出现异常情况 对于异常部分,我尝试从BlogPosts中选择MaxBlogID,但是我得到了一个从复杂到简单的转换错误 我很清楚Microsoft Access不是一个好的数据库,但这是我不得不使用的Ms access ColdFusion解决多对多关系,ms-access,coldfusion,Ms Access,Coldfusion,这是我在博客中插入新帖子的提交页面 第一个将标题、BlogBody和UserID插入数据库 第二部分是插入用户为博客选择的标记,并通过连接表将它们与博客关联。 基本上,如果用户选择了多个标记,那么每个标记都将是连接表中的一个单独条目,并将与插入新博客文章时在自动增量字段中创建的BlogID相匹配 目前这段代码没有正确插入博客。只要相同的标题不被使用两次,第2部分也会进行更正,因为其中title='Form.title',我只选择了1个标记 如何更改此代码以允许多个标记在连接表中有多个条目,以及如
<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>
编辑:
这就是我在另一篇文章中的解释:我最终得到了一个
CFSQLTYPE CF\u SQL\u INTEGER的无效数据@标识。错误
插入BlogTagJunction BlogID,TagID
选择
标签编号
来自标签
塔吉德在哪里
从另一个线程: 我自己解决了这个问题,在博客的insert语句之后创建了一个查询语句,该语句从我刚刚创建的博客中获取博客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>
希望这有帮助
更新:我建议重新阅读和参考链接。它解释了如何使用MS Access获取新id'@@IDENTITY-NB:语句必须包含在cftransaction中。B使用插入/选择构造,结合检索和插入所选标记。附带说明,无需在cfquery中使用cfoutput。简单变量会自动计算。如果您有特定问题,请先尝试并发回。您是否尝试过选择MaxBlogID?选择MaxBlogID不要在web应用程序中使用max方法。这不是线程安全。我们无法确定如何使用提供的链接对数据库进行编码。您所要做的就是将其插入到代码中。给它旋转和张贴任何问题回来。与其让别人为您编写代码,不如自己尝试并理解这个过程。然后获取关于小语法错误的帮助。我认为数据库异常会在cftransaction中自动回滚?不总是这样。如果您的数据库被配置为自动提交事务,那么可能。否则,当发生错误时,事务将保持打开状态,直到您显式关闭或回滚它。如果发生这种情况,您的数据库将缓慢爬行,因为越来越多的事务处于打开状态,这会占用资源。不幸的是,有一天,我发现一家公司的开发数据库确实自动提交了,但他们的生产数据库却没有。我总是发现最好用TRY/CATCH语句定义BEGIN、ROLLBACK和COMMIT。我已经用COMMIT更新了代码。try标记没有包含在catch周围,因此它弹出了一个错误。我把try放在了正确的位置,现在我发现复杂的对象类型无法转换为简单的值。错误,与我尝试选择MaxBlogID时类似。我将继续关注这一点,因为我的进度已经停顿了几天。我们需要看看您正在使用的代码。您可以添加并附加当前代码和错误消息吗?在这种情况下不要使用SELECT MAX。它最终会让你失望。
<!--- 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>
<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>