Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于某些更新存储过程_C#_Asp.net_Sql Server_Sql Server 2005 - Fatal编程技术网

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中不允许有任何重复的标题