这是我在新博文中插入新帖子的提交页面。
第一个将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>
答案 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.