应用程序中出现“必须声明标量变量@ClaimNum”错误

时间:2019-05-29 15:21:29

标签: sql vb.net

我正在设置一个程序,将日志条目写入数据库,以跟踪创建条目的人员,条目的类型,条目本身,打开日期,关闭日期(如果已经关闭),当前状态和对有关公司的风险。

我将该程序基于https://www.youtube.com/playlist?list=PLy4rL7t3MquXKhooLi3naV5F8OyMYSe8F上的教程系列,并使用VB Toolbox的SQLControl类实际执行查询。

问题是该代码可以很好地将新用户添加到数据库中的单独表中,但是对于日志条目表,则出现上述错误。

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

VB工具箱教程中的工作代码:

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错误,永远不要使用本教程所基于的“新建用户”过程。我们将不胜感激。

0 个答案:

没有答案