简体   繁体   中英

if record exists update else insert sql vb.net

I have the following problem, I am developing a Clinic application using vb.net, the doctor has the ability to add medical information using checkboxes checkbox2.text = "Allergy" textbox15.text is the notes for Allergy, I want to insert the record if the patient's FileNo(Textbox2.text) doesn't exist, if it does then update the notes only, so far I was able to update it after 3 button clicks I don't know why????

any help is appreciated :) thanks in advance

    Dim connection3 As New SqlClient.SqlConnection
    Dim command3 As New SqlClient.SqlCommand
    Dim adaptor3 As New SqlClient.SqlDataAdapter
    Dim dataset3 As New DataSet
    connection3.ConnectionString = ("Data Source=(LocalDB)\v11.0;AttachDbFilename=" + My.Settings.strTextbox + ";Integrated Security=True;Connect Timeout=30")
    command3.CommandText = "SELECT ID,Type FROM Medical WHERE FileNo='" & TextBox2.Text & "';"
    connection3.Open()
    command3.Connection = connection3
    adaptor3.SelectCommand = command3
    adaptor3.Fill(dataset3, "0")
    Dim count9 As Integer = dataset3.Tables(0).Rows.Count - 1
    If count9 > 0 Then
        For countz = 0 To count9
            Dim A2 As String = dataset3.Tables("0").Rows(countz).Item("Type").ToString
            Dim B2 As Integer = dataset3.Tables("0").Rows(countz).Item("ID")
            TextBox3.Text = A2
            If A2 = CheckBox1.Text Then
                Dim sql4 As String = "update Medical set MNotes=N'" & TextBox22.Text & "' where FileNo='" & TextBox2.Text & "' and Type = '" & CheckBox1.Text & "' and ID='" & B2 & "';"
                Dim cmd4 As New SqlCommand(sql4, connection3)
                Try
                    cmd4.ExecuteNonQuery()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            ElseIf A2 = CheckBox2.Text Then
                Dim sql4 As String = "update Medical set MNotes=N'" & TextBox15.Text & "' where FileNo='" & TextBox2.Text & "' and Type = '" & CheckBox2.Text & "' and ID='" & B2 & "';"
                Dim cmd4 As New SqlCommand(sql4, connection3)
                Try
                    cmd4.ExecuteNonQuery()
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
        Next
    Else
        If CheckBox1.Checked = True Then
            Dim sql4 As String = "insert into Medical values('" & CheckBox1.Text & "',N'" & TextBox22.Text & "','" & TextBox2.Text & "')"
            Dim cmd4 As New SqlCommand(sql4, connection3)
            Try
                cmd4.ExecuteNonQuery()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
        If CheckBox2.Checked = True Then
            Dim sql4 As String = "insert into Medical values('" & CheckBox2.Text & "',N'" & TextBox15.Text & "','" & TextBox2.Text & "')"
            Dim cmd4 As New SqlCommand(sql4, connection3)
            Try
                cmd4.ExecuteNonQuery()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If

    End If

I think one of your problems may be related to your reducing the count of your table rows by 1 and then testing it above 0:

Dim count9 As Integer = dataset3.Tables(0).Rows.Count - 1
If count9 > 0 Then

Try changing to:

Dim count9 As Integer = dataset3.Tables(0).Rows.Count
If count9 > 0 Then

Also, make sure one of the check-boxes ( CheckBox1 or CheckBox2 ) mentioned later in your code is ticked.

-- EDIT --

Sorry - didn't explain why! The reason is that the majority of array/list like structures in .NET are zero based (ie start counting from 0 instead of 1).

The best course of action for you is to maximize your productivity by allowing SQL to do what it does best. Assuming you are using SQL Server 2008, the MERGE function is an excellent use case for the conditions that you have supplied.

Here is a very basic example that is contrived based upon some of your code:

CREATE PROCEDURE [dbo].[csp_Medical_Merge]
    @MType int, @FileNo varchar(20), @MNotes varchar(max), @ID int,  @OtherParams
AS
BEGIN

MERGE INTO [DatabaseName].dbo.Medical AS DEST
USING 
    ( 
        /*
            Only deal with data that has changed.  If nothing has changed,
            then move on.
        */
        SELECt @MType, @MNotes, @FileNo, @ID, @OtherParams
        EXCEPT
        Select [Type], MNotes, FileNo, ID, OtherFields from [DatabaseName].dbo.Medical
) As SRC ON SRC.ID = DEST.ID
WHEN MATCHED THEN
    UPDATE SET
        DEST.MNOTES = SRC.MNOTES,
        DEST.FileNo = SRC.FileNo,
        DEST.Type = SRC.Type
WHEN NOT MATCHED BY TARGET THEN
    INSERT (FieldsList) 
    VALUEs (FileNo, MNotes, etc, etc);

END
GO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM