sql - 来自应用程序的“必须声明标量变量@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
只在此过程中不断收到错误,而不是在构建的新用户过程中在本教程中,这是基于的。对此的任何帮助将不胜感激。
解决方案
推荐阅读
- twitter-bootstrap-3 - Bootstrap DataTable CSS 未正确加载 [搜索栏、分页按钮]?
- javascript - 将数据传递给 themeProvider
- sql - 添加了约束但忘记了
- java - 使用 espresso 在回收站视图中单击孩子的按钮
- javascript - 如何将 JSON 数据映射到表格/HTML?
- php - 如何在 $a 数组中查找特定字符串?
- json - 使用 Spring RabbitMQ 接收 JSON 时出现“致命消息转换错误”
- c# - Xamarin 形成 stacklayout 返回 null
- python - 如何将常规时间序列更改为日期光节约时间序列?
- mysql - 无法将 Azure 应用服务中的 NodeJS 应用连接到 Azure MySQL 数据库