我有一个任务,我必须创建一个数据库和一个应用程序来运行存储。作业快完成了,只需要修改这部分代码。问题是我不知道错误是什么。我有一个存储过程可以将客户端插入数据库:
CREATE PROCEDURE Projeto.Add_newClient
(@NIF BIGINT,
@Address VARCHAR(40),
@Name VARCHAR(20),
@Phone BIGINT)
AS
IF EXISTS (SELECT * FROM Projeto.Cliente WHERE Cliente.NIF = @NIF)
BEGIN
RAISERROR ('The client with NIF %I64i already exists', 14, 1, @NIF);
END
ELSE
BEGIN
INSERT INTO Projeto.Cliente (NIF, Morada, Nome, NumTelem)
VALUES (@NIF, @Address, @Name, @Phone);
END
GO
当我在SQLServerManagementStudio中测试它时,它工作得很好,完全符合它应该做的。
然后我必须在应用程序中使用这个存储过程,我这样做:
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
If NIFTextBox.Text.Length <> 9 Then
MsgBox("Client's NIF Must Have 9 Numbers!", MsgBoxStyle.Information, "ERROR")
ElseIf NameTextBox.Text.Equals("") Then
MsgBox("Please Insert Client's Name!", MsgBoxStyle.Information, "ERROR")
ElseIf PhoneTextBox.Text.Length <> 9 Then
MsgBox("Client's Phone Number Must Have 9 Numbers!", MsgBoxStyle.Information, "ERROR")
Else
Dim NIF As Integer = NIFTextBox.Text
Dim name As String = NameTextBox.Text
Dim address As String = AddressTextBox.Text
Dim phone As Integer = PhoneTextBox.Text
addClient(NIF, address, name, phone)
NIFTextBox.Text = ""
NameTextBox.Text = ""
AddressTextBox.Text = ""
PhoneTextBox.Text = ""
End If
End Sub
``` `addClient` 具有以下代码:
Private Sub addClient(ByVal NIF As Integer, ByVal address As String, ByVal name As String, ByVal phone As Integer)
CMD = New SqlCommand()
CMD.Connection = CN
CMD.CommandText = "EXEC Projeto.Add_newClient @NIF, @Address, @Name, @Phone"
CMD.Parameters.Add("@NIF", SqlDbType.BigInt)
CMD.Parameters.Add("@Address", SqlDbType.VarChar, 40)
CMD.Parameters.Add("@Name", SqlDbType.VarChar, 20)
CMD.Parameters.Add("@Phone", SqlDbType.BigInt)
CMD.Parameters("@NIF").Value = NIF
CMD.Parameters("@Address").Value = address
CMD.Parameters("@Name").Value = name
CMD.Parameters("@Phone").Value = phone
Dim NIFbool As Boolean = checkNIF(NIF)
Dim PhoneBool As Boolean = checkPhone(phone)
If (NIFbool = True And PhoneBool = True) Then
CN.Open()
Dim test As Object = CMD.ExecuteScalar()
MessageBox.Show(test)
loadClients()
CN.Close()
ElseIf (NIFbool = False And PhoneBool = True) Then
MsgBox("The NIF inserted already exists!", MsgBoxStyle.Information, "ERROR")
ElseIf (NIFbool = True And PhoneBool = False) Then
MsgBox("The Phone number inserted already exists!", MsgBoxStyle.Information, "ERROR")
Else
MsgBox("The NIF and Phone number inserted already exists!", MsgBoxStyle.Information, "ERROR")
End If
End Sub
``` NIFBool
以及 PhoneBool
这些变量只是用来检查那些手机或nif是否已经存在,它们是否正常工作。
我的问题是,当我运行应用程序时,我填写文本框,按下按钮,什么都没有发生。客户端不会添加到数据库,应用程序也不会崩溃。我添加了变量 test
看看结果如何 ExecuteScalar()
. 因为它是一个插入,所以结果应该是空的。但是,结果总是0。我使用了许多其他存储过程,这是唯一发生这种情况的地方。
有人知道是什么导致了这个问题吗?
编辑:使用完整代码链接到存储库https://github.com/tiagoadonis/mtssportsline
显然是布尔变量 NIFBool
以及 PhoneBool
如果在错误的代码位置,则验证是在sime时间执行的,因为应该执行存储的过程。通过在代码中向上移动它们,现在可以正常工作了
1条答案
按热度按时间mfpqipee1#
请打开选项“严格”。这是一个由两部分组成的过程。首先,对于当前项目-在解决方案资源管理器中双击“我的项目”。选择左边的compile。在“选项严格”下拉列表中,选择“开”。第二,对于将来的项目-转到“工具”菜单->选项->项目和解决方案->vb默认值。在“选项严格”下拉列表中,选择“开”。这将使您在运行时免受bug的困扰。我从github下载了你的代码,它就像一棵圣诞树。这些问题需要纠正。
我怀疑
bigint
为了NIF
以及phone
. 一个九位数的数字可以很容易地用int(+或-2万亿)表示。还有,我不知道你怎么把地址拼成40个字符。你为什么用这个
checkNIF
当您将其构建到存储过程中时?为什么不使用Or
在Where
合同条款Select
? 然后去掉这两种检查方法。这比多次点击数据库要好。将您的连接保持在使用它的方法的本地。这样,您就可以确保它是关闭的,并处理
Using...End Using
阻碍。这里的命令也包含在块中。编辑
用try块环绕button click事件的最后一行