2016-04-10 77 views
2

假设我有两个表HistorytablestudentInformation table如何检查使用vb.net和SQL Server是否存在记录

我想这样做是这样的:

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 

问题:它不INSERT一当我插入一个新的schoolyear和时,记录在我的历史记录表中10。有人可以帮我修复我的代码吗?由于

回答

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部分都英寸
  2. 只有当select语句将返回记录时,insert语句才会将新记录添加到​​。 where子句中的条件确保每个学生只有一条记录会插入到历史记录表中。

但是,我看不出每个学生只保留一个历史记录的重点。我认为你的意思是你想保持学年的前一个值和每个学生的水平。如果是这样,exists内的查询应该是这样的:

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

它的工作原理就像一个魅力。有时我很难用'英文'来编程解释我的问题。大声笑 。你是对的,我想要做的是保持学年和每个学生的水平以前的值感谢您的耐心:) –

+0

很高兴帮助:-) –

相关问题