簡體   English   中英

使用vb.net中的存儲過程更新表

[英]Update table using stored procedure in vb.net

我在使用datagridview和存儲過程更新表方面遇到麻煩。 這是代碼;

Private Sub INPUTGrades()
    Dim strConn As String = "Data Source=Jansen;Initial Catalog=SLCBRegistrarDB;Integrated Security=True"
    Dim sqlCon As SqlConnection = New SqlConnection(strConn)

    CMD = New SqlCommand
    CMD.Connection = sqlCon
    CMD.CommandText = "PostingofGRADE"
    CMD.CommandType = CommandType.StoredProcedure

    CMD.Parameters.AddWithValue("@AcademicYear", cmbAcademicYear.Text)
    CMD.Parameters.AddWithValue("@Period", cmbPeriod.Text)
    CMD.Parameters.AddWithValue("@Section", cmbSection.Text)
    CMD.Parameters.AddWithValue("@CourseCode", cmbSubjectCode.Text)
    CMD.Parameters.AddWithValue("@DescriptiveTitle", cmbDescription.Text)
    CMD.Parameters.AddWithValue("@AcademicLevel", cmbAcadLevel.Text)

    CMD.Parameters.Add(New SqlParameter("@StudentID", SqlDbType.Int))
    CMD.Parameters.Add(New SqlParameter("@Grade", SqlDbType.NVarChar))

    sqlCon.Open()
    For Each row As DataGridViewRow In dgvSubjectsEntry.Rows
        If Not row.IsNewRow Then
            CMD.Parameters("@StudentID").Value = row.Cells(1).Value
            CMD.Parameters("@Grade").Value = row.Cells(0).Value

            Dim RowsAffected As Integer = CMD.ExecuteNonQuery()
            If RowsAffected > 0 Then
                MsgBox("Grade Successfully Posted.")
            Else
                MsgBox("Failed!")
            End If
        End If
    Next
    sqlCon.Close()
End Sub

這是存儲過程:

USE [SLCBRegistrarDB]
GO
/****** Object:  StoredProcedure [dbo].[PostingofGRADE]    Script Date: 
7/21/2017 9:38:16 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[PostingofGRADE]

@StudentID Int,
@AcademicYear nvarchar(50),
@Period nvarchar(50),
@Section nvarchar(10),
@CourseCode nvarchar(50),
@DescriptiveTitle nvarchar(100),
@Grade nvarchar(50),
@AcademicLevel nvarchar(50)

AS
BEGIN

    Declare @AcademicLevelID int
    Declare @SchoolID int
    Declare @TypeofStudentID int
    Declare @CourseID int
    Declare @PeriodID int
    Declare @AcademicYearID int
    Declare @SectionID int
    Declare @SubjectCode int

        SELECT @AcademicLevelID=AcadLevelID FROM [Academic Level] WHERE 
[Academic Level]=@AcademicLevel

        SELECT @PeriodID=SemID FROM SemesterList WHERE Description=@Period

        SELECT @SectionID=SectionID FROM Section WHERE Section=@Section

        SELECT @AcademicYearID=[SY ID] FROM SchoolYear WHERE [School Year]=@AcademicYear

 SELECT @SubjectCode=StudentAcademicRecords.[Subject Code]
 FROM         StudentAcademicRecords INNER JOIN
         [Class Schedule LINE] ON StudentAcademicRecords.[Subject Code] = 
 [Class Schedule LINE].SchedID INNER JOIN
         Curriculum ON [Class Schedule LINE].[Subject Code] = Curriculum.
[Subject Code] INNER JOIN
         ListofSubjects ON Curriculum.SubjectID = ListofSubjects.SubjectID 
 INNER JOIN
         SchoolYear ON StudentAcademicRecords.[Academic Year] = SchoolYear.
 [SY ID] INNER JOIN
         SemesterList ON StudentAcademicRecords.Period = SemesterList.SemID 
AND Curriculum.SemesterID = SemesterList.SemID
WHERE        (ListofSubjects.[Course No.] = @CourseCode) AND 
(ListofSubjects.[Descriptive Title] = @DescriptiveTitle) AND 
         (StudentAcademicRecords.StudentID = @StudentID) AND 
(SemesterList.Description = @Period) AND (SchoolYear.[School Year] = 
@AcademicYear)

BEGIN
    UPDATE StudentAcademicRecords
    SET StudentID =@StudentID, [Academic Level] =@AcademicLevelID, Period 
=@PeriodID, [Academic Year] =@AcademicYearID, Section =@SectionID, [Subject 
Code] =@SubjectCode, Grade =@Grade
    FROM StudentAcademicRecords
    WHERE [Subject Code]=@SubjectCode AND StudentID=@StudentID
END

END 

如果我嘗試運行代碼,則表未執行任何操作。 完全沒有變化。 我嘗試在sql服務器查詢中運行,但工作正常,但在我的vb.net代碼中卻沒有。

任何幫助表示贊賞。

我通常不完全符合您的要求,但是它對我有用,也許對您有用,我使用UPSERT參數化查詢,從本質上講,它檢查現有數據庫表以查看是否要插入密鑰匹配任何現有的,如果匹配,則執行更新,如果不匹配,則將該新數據作為新行插入,這是我在代碼中使用的循環式UPSERT查詢的示例:

    Dim Connexion As SqlConnection = New SqlConnection(dbLocations(0, 1))
        Dim updateStatement As String = Nothing
        Dim updatecommand As New SqlCommand(updateStatement, Connexion)
        Try
            Connexion.Open()
            query = String.Empty
            query &= "UPDATE schedule SET Task = @Task, Complete = @Complete, Start_date = @Start_date, "
            query &= "Due_date = @Due_date, JRID = @JRID, Task_Manager = @Task_Manager, Entered_By = @Entered_By, Time_Entered = @Time_Entered "
            query &= "WHERE TaskID = @TaskID "
            query &= "IF @@ROWCOUNT = 0 INSERT INTO schedule ( TaskID, Task, start_date, Due_Date, Complete, Task_Manager, JRID, Entered_By, Time_Entered)"
            query &= " VALUES ( @TaskID, @Task, @start_date, @Due_Date, @Complete, @Task_Manager, @JRID, @Entered_By, @Time_Entered);"

            updatecommand.CommandText = query

            If MainSchedule.isokclicked = 1 Then
                For Each row As DataGridViewRow In MainSchedule.DataGridView1.Rows
                    If Not (row.Cells(0).Value = Nothing) Then
                        insertcommand.Parameters.Clear()
                        insertcommand.CommandText = query
                        insertcommand.Parameters.AddWithValue("@TaskID", row.Cells(0).Value)
                        insertcommand.Parameters.AddWithValue("@Complete", "False")
                        insertcommand.Parameters.AddWithValue("@Task", row.Cells(1).Value)
                        insertcommand.Parameters.AddWithValue("@Start_date", row.Cells(2).Value)
                        insertcommand.Parameters.AddWithValue("@Due_Date", row.Cells(3).Value)
                        insertcommand.Parameters.AddWithValue("@JRID", txtJRID.Text)
                        insertcommand.Parameters.AddWithValue("@Task_Manager", row.Cells(4).Value)
                        insertcommand.Parameters.AddWithValue("@Entered_By", GetUserName())
                        insertcommand.Parameters.AddWithValue("@Time_Entered", Now)
                        insertcommand.ExecuteNonQuery()
                    End If
                    keypos = keypos + 1
                Next
                Connexion.Close()
            Else
            End If

抱歉,我是對的..我的代碼正確..它工作正常..我只是在Windows窗體的組合框中插入了一個錯誤的條目,使SQL代碼中的SELECT語句返回0 ..它正常工作..我很抱歉,這太可惜了。

“說明”也應替換為“ [Sem。]”。 我只是指定了錯誤的列名。 太多的爭論扭曲了我的想法。 對不起大家。 這是一個很好的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM