【问题标题】:How to check if record exist using vb.net and SQL Server如何使用 vb.net 和 SQL Server 检查记录是否存在
【发布时间】:2016-04-10 05:43:11
【问题描述】:

假设我有两个表HistorytablestudentInformation table

我想做的是:

If schoolyear and level exist in Historytable
    update studentInformationtable
else
   INSERT schoolyear,level to Historytable
    update studentInformationtable

我的存储过程代码:

ALTER PROCEDURE [dbo].[InsertUpdate] 
    @studentID INT, 
    @SchoolYear Nvarchar(20),
    @levels Nvarchar(20),
    @FirstName Nvarchar(20),
    @SurName Nvarchar(20)
AS
BEGIN
    SET NOCOUNT ON;

BEGIN TRAN
    IF exists (SELECT SchoolYear, Levels
               FROM StudentHistory WITH (updlock, serializable) 
               WHERE StudentID = @studentID)
    BEGIN
        UPDATE StudentInformation
        SET FirstName = @FirstName ,
            Surname = @SurName
        WHERE StudentID = @studentID
    END
    ELSE
    BEGIN
        INSERT INTO Studenthistory (StudentID, SchoolYear, Levels)
        VALUES (@studentID, @SchoolYear, @levels)

        UPDATE StudentInformation
        SET FirstName = @FirstName,
            Surname = @SurName
        WHERE StudentID = @studentID
    END

    COMMIT TRAN
END

vb.net 代码

Using cmd As New SqlClient.SqlCommand("dbo.InsertUpdate", cn)
    cmd.Parameters.AddWithValue("@studentID", frmView.dgv1.SelectedCells(0).Value)
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.Add("@SurName", SqlDbType.VarChar, 100).Value = txtStudLN.Text
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 100).Value = txtStudFN.Text
    cmd.Parameters.Add("@SchoolYear", SqlDbType.VarChar, 100).Value = cboSchoolYear.Text
    cmd.Parameters.Add("@levels", SqlDbType.VarChar, 100).Value = cboGradeLevel.Text
    cmd.ExecuteNonQuery()
    MsgBox("Update New record successfully")
End Using

问题:当我插入一个新的schoolyearlevel 时,我的历史记录表中没有INSERT 一个新记录。有人可以帮我修复我的代码吗?谢谢

【问题讨论】:

    标签: sql-server vb.net sql-server-2008-r2


    【解决方案1】:

    试试这个:

    ALTER PROCEDURE [dbo].[InsertUpdate] 
        -- Add the parameters for the stored procedure here
    
    @studentID INT, 
    @SchoolYear Nvarchar(20),
    @levels Nvarchar(20),
    @FirstName Nvarchar(20),
    @SurName Nvarchar(20)
    
    
    AS
    BEGIN
    
        SET NOCOUNT ON;
    
    BEGIN TRAN
    
       UPDATE StudentInformation
       SET FirstName = @FirstName ,
       Surname = @SurName
       WHERE StudentID = @studentID
    
       INSERT INTO Studenthistory (StudentID,SchoolYear, Levels)
       SELECT @studentID,@SchoolYear,@levels
       WHERE NOT EXISTS(
            SELECT 1
            FROM Studenthistory
            WHERE StudentID = @studentID
       )
    
    
    COMMIT TRAN
    END
    

    注意事项:

    1. 不需要在 if 和 else 部分都写 update 语句。
    2. 仅当 select 语句将返回记录时,insert 语句才会将新记录添加到 Studenthistory。 where 子句中的条件确保每个学生只插入一条记录到历史记录表中。

    但是,我认为为每个学生只保留一份历史记录没有多大意义。我认为您的意思是要保留每个学生的学年和水平以前的值。如果这是真的,exists 内的查询应该是这样的:

    SELECT 1
    FROM Studenthistory
    WHERE StudentID = @studentID
    AND SchoolYear = @SchoolYear,
    AND Levels = @levels
    

    【讨论】:

    • 它就像一个魅力。有时我真的很难在English 中解释我的编程问题。哈哈 。你说得对,我想做的就是保持以前的学年和每个学生的水平谢谢你的耐心:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2016-04-12
    • 2010-11-25
    相关资源
    最近更新 更多