cmd.executescalar()对插入数据的存储过程返回0

4ktjp1zp  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(414)

我有一个任务,我必须创建一个数据库和一个应用程序来运行存储。作业快完成了,只需要修改这部分代码。问题是我不知道错误是什么。我有一个存储过程可以将客户端插入数据库:

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时间执行的,因为应该执行存储的过程。通过在代码中向上移动它们,现在可以正常工作了

mfpqipee

mfpqipee1#

请打开选项“严格”。这是一个由两部分组成的过程。首先,对于当前项目-在解决方案资源管理器中双击“我的项目”。选择左边的compile。在“选项严格”下拉列表中,选择“开”。第二,对于将来的项目-转到“工具”菜单->选项->项目和解决方案->vb默认值。在“选项严格”下拉列表中,选择“开”。这将使您在运行时免受bug的困扰。我从github下载了你的代码,它就像一棵圣诞树。这些问题需要纠正。
我怀疑 bigint 为了 NIF 以及 phone . 一个九位数的数字可以很容易地用int(+或-2万亿)表示。还有,我不知道你怎么把地址拼成40个字符。
你为什么用这个 checkNIF 当您将其构建到存储过程中时?为什么不使用 OrWhere 合同条款 Select ? 然后去掉这两种检查方法。这比多次点击数据库要好。
将您的连接保持在使用它的方法的本地。这样,您就可以确保它是关闭的,并处理 Using...End Using 阻碍。这里的命令也包含在块中。

Private ConStr As String = "Your connection string"

Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    Dim NIF As Integer
    Dim phone As Integer
    If NIFTextBox.Text.Length <> 9 AndAlso Not Integer.TryParse(NIFTextBox.Text, NIF) Then
        MsgBox("Client's NIF Must Have 9 Numbers!", MsgBoxStyle.Information, "ERROR")
        Exit Sub
    ElseIf NameTextBox.Text.Equals("") Then
        MsgBox("Please Insert Client's Name!", MsgBoxStyle.Information, "ERROR")
        Exit Sub
    ElseIf PhoneTextBox.Text.Length <> 9 AndAlso Not Integer.TryParse(PhoneTextBox.Text, phone) Then
        MsgBox("Client's Phone Number Must Have 9 Numbers!", MsgBoxStyle.Information, "ERROR")
        Exit Sub
    End If
    addClient(NIF, AddressTextBox.Text, NameTextBox.Text, phone)
End Sub

Private Sub addClient(ByVal NIF As Integer, ByVal address As String, ByVal name As String, ByVal phone As Integer)
    Dim RetVal As Integer
    Using CN As New SqlConnection(ConStr),
            CMD As New SqlCommand("Add_newClient", CN)
        CMD.CommandType = CommandType.StoredProcedure
        CMD.Parameters.Add("@NIF", SqlDbType.BigInt).Value = NIF
        CMD.Parameters.Add("@Address", SqlDbType.VarChar, 40).Value = address
        CMD.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = name
        CMD.Parameters.Add("@Phone", SqlDbType.BigInt).Value = phone
        CN.Open()
        RetVal = CMD.ExecuteNonQuery() 'This returns number of records affected
    End Using
    If RetVal = 1 Then
        MessageBox.Show("Successful Insert")
        ClearTextBoxes()
    Else
        MessageBox.Show("Error inserting data")
    End If
End Sub

Private Sub ClearTextBoxes()
    NIFTextBox.Text = ""
    NameTextBox.Text = ""
    AddressTextBox.Text = ""
    PhoneTextBox.Text = ""
End Sub

编辑
用try块环绕button click事件的最后一行

Try
        addClient(NIF, AddressTextBox.Text, NameTextBox.Text, phone)
    Catch ex As SqlException
        MessageBox.Show(ex.Message)
    End Try

相关问题