首页 > 解决方案 > 来自应用程序的“必须声明标量变量@ClaimNum”错误

问题描述

我正在设置一个程序来将日志条目写入数据库,该数据库跟踪谁创建了条目、它是什么类型的条目、条目本身、打开日期、关闭日期(如果已经关闭)、当前状态和风险有问题的公司。

我将此程序基于此处找到的教程系列:https ://www.youtube.com/playlist?list=PLy4rL7t3MquXKhooLi3naV5F8OyMYSe8F并且正在使用 VB Toolbox 的SQLControl类来实际执行查询。

问题是代码在将新用户添加到数据库中的单独表时工作正常,但对于日志条目表,我收到上述错误。

该数据库基于 SQL Server Express,并使用 SSMS 构建。我一直在与一位从事数据库设计师的朋友合作,以使数据库本身站起来,但他们也不确定我为什么会收到此错误。我已经尝试了基于 VB Toolbox's tutorial 的原始执行查询,我还尝试添加DECLARE执行查询开始时的语句,看看这是否会解决问题,我想它确实解决了问题,但是它似乎覆盖了我在过程开始时作为参数传递的值,并给了我一个空值错误它到达了一个不能为空的字段。我已经在 Stack Overflow 和其他编码论坛中搜索了解决方案,但我发现的所有内容都集中在在 SSMS 本身内构建查询,或者唯一的答案是“确保正确声明参数”这没有帮助,因为从我所看到的一切来看,日志输入过程应该可以工作,因为我没有对SQLControl实际驱动所有查询和参数定义的类进行任何更改。当我在查询中输入一个值来替换它时,NULL由于该字段将接受空值,我只是在下一个参数上得到相同的错误,所以必须在某处断开连接,但我想不出它可能在哪里。

VB Toolbox 教程中的工作代码:

With SQL
            .AddParam("@FirstName", firstNameTB.Text)
            .AddParam("@LastName", lastNameTB.Text)
            .AddParam("@Title", jobTitleTB.Text)
            .AddParam("@Company", companyCB.Text)
            .AddParam("@OfficeNum", offNumTB.Text)
            .AddParam("@CellNum", cellNumTB.Text)
            .AddParam("@EmailAddress", emailTB.Text)
            .AddParam("@Username", userTB.Text)
            .AddParam("@TempPassword", passTB.Text)

            .ExecQuery("INSERT INTO dbo.TeamMembers (FirstName, LastName, Title, Company, OfficeNum, CellNum, EmailAddress, Username, TempPassword) " &
                        "VALUES (@FirstName, @LastName, @Title, @Company, @OfficeNum, @CellNum, @EmailAddress, @Username, @TempPassword);")
            'Report And Abort on Error
            If .HasException(True) Then Exit Sub

            If SQL.DBDT.Rows.Count > 0 Then
                Dim r As DataRow = SQL.DBDT.Rows(0)
                MsgBox(r("LastID").ToString)
            End If

            MsgBox("User added successfully.")
        End With

引发错误的代码:

With SQL
            .AddParam("@MemberName", cbxTeamMembers.Text)
            .AddParam("@EntryType", cbxEntryType.Text)
            .AddParam("@ClaimNum", tbClaimID.Text)
            .AddParam("@StatusType", cbxStatus.Text)
            .AddParam("@LogEntry", tbEntry.Text)
            .AddParam("@OpenDate", dtpOpened.Value)
            .AddParam("@Risk", tbRisk.Text)
            If dtpClosed.Enabled = True Then
                .AddParam("@CloseDate", dtpClosed.Value)
            Else
                .AddParam("@CloseDate", "NULL")
            End If

            Dim MemberID As Integer, EntryID As Integer, StatusID As Integer

            .ExecQuery("SELECT ID FROM dbo.TeamMembers tm WHERE CONCAT(tm.FirstName, ' ', tm.LastName) = @MemberName;")
            For Each r As DataRow In .DBDT.Rows
                MemberID = r("ID")
            Next

            .ExecQuery("SELECT ID FROM dbo.EntryType et WHERE et.Description = @EntryType;")
            For Each r As DataRow In .DBDT.Rows
                EntryID = r("ID")
            Next

            .ExecQuery("SELECT ID FROM dbo.StatusTable s WHERE s.Description = @StatusType;")
            For Each r As DataRow In .DBDT.Rows
                StatusID = r("ID")
            Next

            .ExecQuery("INSERT INTO dbo.DailyLog(MemberID, TypeID, ClaimNumber, Notes, StatusID, DateOpen, DateClosed, Risk) " &
                       "VALUES (" & MemberID & "," & EntryID & ",@ClaimNum,@LogEntry," & StatusID & ",@OpenDate,@CloseDate,@Risk);")

            If .HasException(True) Then Exit Sub
        End With

修改了覆盖先前参数的查询:

.ExecQuery("DECLARE @MemberName varchar(50); DECLARE @ClaimNum varchar(50); DECLARE @LogEntry varchar(max); DECLARE @OpenDate Date; DECLARE @CloseDate Date; DECLARE @Risk varchar(max); " &
                       "INSERT INTO dbo.DailyLog(MemberID, TypeID, ClaimNumber, Notes, StatusID, DateOpen, DateClosed, Risk) " &
                       "VALUES (" & MemberID & "," & EntryID & ",@ClaimNum,@LogEntry," & StatusID & ",@OpenDate,@CloseDate,@Risk);")

执行及参数程序:

Public Sub ExecQuery(Query As String, Optional ReturnIdent As Boolean = False)
        RecordCount = 0
        Exception = ""

        Try
            DBCon.Open()

            DBCmd = New SqlCommand(Query, DBCon)

            Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))

            Params.Clear()

            DBDT = New DataTable
            DBDA = New SqlDataAdapter(DBCmd)
            RecordCount = DBDA.Fill(DBDT)

            If ReturnIdent = True Then
                Dim RetQuery As String = "SELECT @@IDENTITY AS LastID;"

                DBCmd = New SqlCommand(RetQuery, DBCon)
                DBDT = New DataTable
                DBDA = New SqlDataAdapter(DBCmd)
                RecordCount = DBDA.Fill(DBDT)
            End If
        Catch ex As Exception
            Exception = "ExecQuery Error: " & vbNewLine & ex.Message
        Finally
            If DBCon.State = ConnectionState.Open Then DBCon.Close()
        End Try
    End Sub

    Public Sub AddParam(Name As String, Value As Object)
        Dim NewParam As New SqlParameter(Name, Value)
        Params.Add(NewParam)
    End Sub

当我基于教程中的添加用户过程的日志条目过程时,我曾期望此过程将新的条目数据输入数据库表,但我Must declare Scalar Variable @ClaimNUm只在此过程中不断收到错误,而不是在构建的新用户过程中在本教程中,这是基于的。对此的任何帮助将不胜感激。

标签: sqlvb.net

解决方案


推荐阅读