C# 关于某些更新存储过程
我有两个表格如下:-C# 关于某些更新存储过程,c#,asp.net,sql-server,sql-server-2005,C#,Asp.net,Sql Server,Sql Server 2005,我有两个表格如下:- CREATE PROC InsertUpdatePageContent ( @PageID int, @Content nvarchar(2000), @TitleID int ) AS BEGIN IF(@PageID=-1) BEGIN IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID = @LANGUAGEID))
CREATE PROC InsertUpdatePageContent
(
@PageID int,
@Content nvarchar(2000),
@TitleID int
)
AS
BEGIN
IF(@PageID=-1)
BEGIN
IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID = @LANGUAGEID))
BEGIN
INSERT INTO Table1(Content,TitleID)
VALUES(@Content,@TitleID)
END
END
ELSE
BEGIN
IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID = @LANGUAGEID))
BEGIN
UPDATE Table1
SET Content = @Content, TitleID = @TitleID
WHERE PAGEID = @PAGEID
END
END
END
表1:
-------------------------------------
PageID|Content|TitleID(FK)|LanguageID
-------------------------------------
1 |abc |101 |1
2 |xyz |102 |1
--------------------------------------
-------------------------
TitleID|Title |LanguageID
-------------------------
101 |Title1|1
102 |Title2|1
------------------------
表2:
-------------------------------------
PageID|Content|TitleID(FK)|LanguageID
-------------------------------------
1 |abc |101 |1
2 |xyz |102 |1
--------------------------------------
-------------------------
TitleID|Title |LanguageID
-------------------------
101 |Title1|1
102 |Title2|1
------------------------
我不想在我的表1(内容表)中添加重复项。喜欢不能有两个标题相同的页面。我需要在插入/更新存储过程中添加什么检查?如何确保从不添加重复项
我尝试了以下方法:-
CREATE PROC InsertUpdatePageContent
(
@PageID int,
@Content nvarchar(2000),
@TitleID int
)
AS
BEGIN
IF(@PageID=-1)
BEGIN
IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID = @LANGUAGEID))
BEGIN
INSERT INTO Table1(Content,TitleID)
VALUES(@Content,@TitleID)
END
END
ELSE
BEGIN
IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID = @LANGUAGEID))
BEGIN
UPDATE Table1
SET Content = @Content, TitleID = @TitleID
WHERE PAGEID = @PAGEID
END
END
END
现在发生的事情是,它是插入新的记录好,不会允许重复添加,但当我更新它给我的问题
在我的aspx页面上,我有一个下拉列表控件,该控件绑定到返回表2(标题表)的DataSource,我有一个文本框,用户在其中键入要存储的页面内容
当我更新时,比如说我的表1中有一行PageID=1,如上所示
现在,当我更新此行时,就像我没有从下拉列表中更改标题,只更改文本框中的内容一样,它不会更新记录。当存储过程的更新查询没有执行时,它会显示一个标签,上面写着“具有此标题的页面已经存在”
所以,每当我更新一条现有记录时,该标签就会显示在屏幕上。我如何在更新存储过程中更改该IF条件
编辑:
-------------------------------------
PageID|Content|TitleID(FK)|LanguageID
-------------------------------------
1 |abc |101 |1
2 |xyz |102 |1
--------------------------------------
-------------------------
TitleID|Title |LanguageID
-------------------------
101 |Title1|1
102 |Title2|1
------------------------
@gbn:在更新的情况下,如果条件起作用,会吗?我的意思是,假设我用TitleID=1更新页面,我更改了它的内容,然后当我更新时,它将执行IF条件,它仍然不会更新,因为TitleID=1已经存在!只有当TitleID=1不在表1中时,它才会更新。不是吗?我想我有点糊涂了。请回答。谢谢。我不确定自己是否完全理解,但我会为您试一试。我假设您不能更改数据结构 首先,我将对
表2中的标题列设置一个唯一的约束。然后我会在表1
中的标题ID(FK)
上设置一个唯一的约束。这将确保表1
中没有两个标题相同的条目
然后在存储过程中,我将对引入的参数和数据库中存在的参数进行比较,以便根据传入的参数验证update或insert
对于某些软件,我通常使用存储过程作为关系数据模型和对象模型之间的API。我很少向应用程序的存储过程签名公开数据库标识列。数据库标识列的处理方式不同于软件用于标识实体的唯一标识符。如果没有关于应用程序其余部分和其他存储过程的附加信息,您很难提供更多帮助,这些信息需要为您的解决方案协同工作。我不确定自己是否完全理解,但我将为您试一试。我假设您不能更改数据结构
首先,我将对表2中的标题列设置一个唯一的约束。然后我会在表1
中的标题ID(FK)
上设置一个唯一的约束。这将确保表1
中没有两个标题相同的条目
然后在存储过程中,我将对引入的参数和数据库中存在的参数进行比较,以便根据传入的参数验证update或insert
对于某些软件,我通常使用存储过程作为关系数据模型和对象模型之间的API。我很少向应用程序的存储过程签名公开数据库标识列。数据库标识列的处理方式不同于软件用于标识实体的唯一标识符。如果没有关于应用程序其余部分和其他存储过程的附加信息,您很难提供更多帮助,这些信息需要为您的解决方案协同工作。这将始终返回false
IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID=LANGUAGEID))
您正在将一列与其自身进行比较,它匹配=存在
应该是这样的
CREATE PROC InsertUpdatePageContent (
@PageID int,
@Content nvarchar(2000),
@TitleID int
)
AS
IF(@PageID=-1)
BEGIN
IF NOT EXISTS (SELECT TitleID FROM Table1 WHERE TitleID=@TitleID)
INSERT INTO Table1(Content,TitleID) VALUES(@Content,@TitleID)
END
ELSE
UPDATE Table1 SET Content= @Content, TitleID=@TitleID WHERE PAGEID=@PAGEID
GO
为了保护您的数据,您应该在表1中的TitleID上有唯一的索引。这将始终返回false
IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID=LANGUAGEID))
您正在将一列与其自身进行比较,它匹配=存在
应该是这样的
CREATE PROC InsertUpdatePageContent (
@PageID int,
@Content nvarchar(2000),
@TitleID int
)
AS
IF(@PageID=-1)
BEGIN
IF NOT EXISTS (SELECT TitleID FROM Table1 WHERE TitleID=@TitleID)
INSERT INTO Table1(Content,TitleID) VALUES(@Content,@TitleID)
END
ELSE
UPDATE Table1 SET Content= @Content, TitleID=@TitleID WHERE PAGEID=@PAGEID
GO
为了保护您的数据,您应该在表1的标题ID上有唯一的索引。在表1的标题ID
上应用唯一的键约束将确保标题ID
的重复值不会保存到表中
就存储过程的代码而言,gbn突出显示了要更正的条件检查,以使其正常工作。在表1
中的标题ID
上应用唯一键约束将确保标题ID
的重复值不会保存到表中
就存储过程的代码而言,gbn突出显示了要更正的条件检查以使其正常工作。对于更新,您可以设置此条件以避免多个页面使用相同的标题
IF NOT EXISTS (SELECT 1 from Table1 where TitleId = @TitleID and PageID <> @PageID) -- This makes sure that there is no 'other page' with same title (updated from UI)
{
UPDATE Table1
SET Content = @Content, TitleID = @TitleID
WHERE PAGEID = @PAGEID
}
如果不存在(从表1中选择1,其中TitleId=@TitleId和PageID@PageID)--这确保没有具有相同标题的“其他页面”(从UI更新)
{
更新表1
设置内容=@Content,TitleID=@TitleID
其中PAGEID=@PAGEID
}
对于更新,您可以设置此条件,以避免多页使用相同的标题
IF NOT EXISTS (SELECT 1 from Table1 where TitleId = @TitleID and PageID <> @PageID) -- This makes sure that there is no 'other page' with same title (updated from UI)
{
UPDATE Table1
SET Content = @Content, TitleID = @TitleID
WHERE PAGEID = @PAGEID
}
如果不存在(从表1中选择1,其中TitleId=@TitleId和PageID@PageID)--这确保没有具有相同标题的“其他页面”(从UI更新)
{
更新表1
设置内容=@Content,TitleID=@TitleID
其中PAGEID=@PAGEID
}
在这种情况下,不会。它不会解决“无更新”问题。它将防止重复,但这不是这里的问题^^^但为什么?表1中不允许有任何重复的标题