【问题标题】:Update table using stored procedure in vb.net使用 vb.net 中的存储过程更新表
【发布时间】:2017-07-21 01:43:24
【问题描述】:

我在如何使用 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 server 查询中运行,它工作正常,但在我的 vb.net 代码中,它没有。

感谢任何帮助。

【问题讨论】:

  • If Not row.IsNewRow Then 只有在没有为网格行输入数据的情况下才会为真条件。不确定这是否是导致您的命令无法执行的原因。
  • 我不知道是什么导致了这个问题。他们有什么方法可以做到这一点..?
  • 当您致电ExecuteNonQuery 时,会发生以下三种情况之一。首先,调用可能成功并返回一个大于零的值,这意味着许多记录受到影响。其次,调用可能成功返回0,即SQL执行成功,但没有记录受到影响。最后,调用可能会失败并抛出异常。你的情况是哪一个?如果是第一个,那么您正在保存更改,而您只是没有正确查找它们。如果是其他问题之一,那么您需要解决数据或 SQL 代码的问题。
  • 如果我在 sql server 查询中运行存储过程并在其上添加值,它工作正常,这意味着我要更新的表中的某些行工作正常..但如果我称之为存储使用 vb.net 代码在 Visual Studio 中的过程并运行代码,它可以工作,但问题是,表中没有更新任何行。

标签: sql vb.net sql-server-2012


【解决方案1】:

我通常所做的与您所拥有的并不完全相同,但它对我有用,也许它对您有用,我使用 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

【讨论】:

  • 所以你没有在这里使用存储过程。问题是,我只想更新我的桥表,代码可以与其他存储过程(如 INSERT)完美运行,但如果我使用 UPDATE,它不会。
  • 在微软论坛social.msdn.microsoft.com/Forums/en-US/…查看我对您问题的回复
【解决方案2】:

对不起,伙计们..我的代码是正确的..它工作得很好..我只是在我的 windows 窗体的组合框项目中插入了一个错误的条目,这使得 SQL 代码中的 SELECT 语句返回 0.. 它可以工作好吧..对不起各位,太可惜了。

“描述”也应替换为“[Sem.]”。我刚刚指定了错误的列名。太多的争论让我心烦意乱。对不起大家。这是一个很好的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多