How to edit/update records from the database using

2020-04-16 04:15发布

问题:

I'm using visual basic 2008 express edition by linq to sql for my database operation such as edit records. I did not use any sql server but I'm just using the built-in sql server within the visual basic 2008 express. I tried to revised the codes, no error in syntax but there's an error at runtime and it pops-up a window message saying its error message. What I want is to edit the records which were retrieved from the database into the text-boxes and when you click the button5 whatever the new value on the text-boxes should replace the previous one. The Account field is the field in my Table1 in memrec.dbml which I set up for primary key is true and the rest of the fields are false in its primary key. The code below still found an error when you run the program and it pops-up a window which says:

NotSupportedException was unhandled - Sql server does not handle comparison of NText, Text, Xml, or Image data types.

It highlights a yellow background on the line:

db.SubmitChanges()

These are what I see on each field's property on Table1 in memrec.dbml property window:

Access - Public
Type - String(System.String)
Server Data Type - Text
Auto-Generated Value - False
Auto-Sync - Never
Delay Loaded - False
Inheritance Modifier - (none)
Nullable - True
Read Only - False
Time Stamp - False
Update Check - Never
Primary Key - False ' Except for the Account field.

What do you see as possible error?

Is it in terms of its settings?

Here's my codes:


Private Sub Button5_Click(------------------) Handles Button5.Click 
    If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Or _
            TextBox4.Text   = "" Then 
        MsgBox("Please Fill It Up Completely", MsgBoxStyle.Exclamation) 
        Exit Sub 
    Else 

        Dim accnt As String 
            accnt = TextBox1.Text 
        Dim db As New memrecDataContext() 

        Dim editrecord = _ 
            From memrec In db.Table1s _ 
            Where memrec.Account.Contains(accnt) _ 
            Select memrec 

        For Each memrec In editrecord 
            If memrec.Account = accnt Then 

                memrec.Account = TextBox1.Text 
                memrec.Name = TextBox2.Text  
                memrec.Address = TextBox3.Text 
                memrec.Gender = TextBox4.Text 
                db.SubmitChanges() 
                Exit Sub 
            End If 
        Exit For 

        Next 

        MsgBox("No Records Match", MsgBoxStyle.Information) 
    End If 
End Sub 

Thank you for taking time with me to solve this issue.....

回答1:

Where memrec.Account.Contains(accnt) _

This code will perform a "like" in your database and such action is not permited on NText and Text field.

Try changing your field type from Text to Varchar(500) (or bigger if you think 500 won't be enough)

or

If you intended to search for a known value, try changing you where to :

Where memrec.Account = accnt


回答2:

Imports System.Data Imports System.Data.SqlClient

Public Class frmRpro

Private Sub frmRpro_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  lock()

End Sub

Private Sub autonum()
    Call main()
    Con.Open()
    Dim UserSelect As SqlCommand
    Dim myreader As SqlDataReader
    Dim sql As String
    Dim sum As Integer
    Dim no As Integer
    'sql = "select * from packwell_customers where customer_code like '" & (txt1.Text) & "%'"
    'sql.Max()
    sql = "select max(rcv_reference) from DOrproduct"
    UserSelect = New SqlCommand(sql, Con)
    myreader = UserSelect.ExecuteReader
    If (myreader.Read = True) Then
        no = 1
        txt1.Text = myreader(0)
        sum = txt1.Text + no
        txt1.Text = 0 & sum
        clear()
    End If

    Con.Close()
End Sub

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cnew.Click

    If cnew.Text = "New" Then

        cnew.Text = "Save"
        cedit.Text = "Cancel"
        clear()
        autonum()

        unlock()
        cdel.Enabled = False
        csearch.Enabled = False
        txt1.Enabled = False
        'Dim myDate As Date = Now
        'txt3.Text = Format(myDate, "MM/dd/yyyy")

    ElseIf txt1.Text = "" Or txt2.Text = "" Or txt3.Text = "" Or txt4.Text = "" Or txt5.Text = "" Or txt6.Text = "" Or txt7.Text = "" Or txt8.Text = "" Or txt9.Text = "" Or txt10.Text = "" Or txt11.Text = "" Or txt12.Text = "" Or txt13.Text = "" Or txt14.Text = "" Or txt15.Text = "" Or txt16.Text = "" Or txt17.Text = "" Or txt18.Text = "" Or txt19.Text = "" Or txt20.Text = "" Or txt21.Text = "" Or txt22.Text = "" Or txt23.Text = "" Or txt24.Text = "" Or txt25.Text = "" Or txt26.Text = "" Then
        MsgBox("Incomplete data")
    Else
        cnew.Text = "Save"
        cnew.Text = "New"
        cedit.Text = "Update"
        save()
        clear()
        lock()
        cdel.Enabled = True
        csearch.Enabled = True



    End If

    txt2.Focus()


End Sub
Private Sub save()
    Call main()
    Con.Open()
    Dim adapter As New SqlDataAdapter
    Dim sql As String



    sql = "insert into DOrproduct (rcv_reference,customer,expected_date,date_arrived,time_arrived,customer_bol,reference,cust_order,releaseno,carrier,trailerno,issuedto,date_rcv,product,accounting,trader,lot,pkg,supply_rcv,status,opened_by,odate,arrivedby,adate,closeby,cdate) values('" & txt1.Text & "','" & txt2.Text & "', '" & txt3.Text & "', '" & txt4.Text & "', '" & txt5.Text & "', '" & txt6.Text & "', '" & txt7.Text & "', '" & txt8.Text & "', '" & txt9.Text & "', '" & txt10.Text & "', '" & txt11.Text & "', '" & txt12.Text & "', '" & txt13.Text & "', '" & txt14.Text & "', '" & txt15.Text & "', '" & txt16.Text & "', '" & txt17.Text & "', '" & txt18.Text & "', '" & txt19.Text & "', '" & txt20.Text & "', '" & txt21.Text & "', '" & txt22.Text & "', '" & txt23.Text & "', '" & txt24.Text & "', '" & txt25.Text & "', '" & txt26.Text & "')"

    Try

        adapter.InsertCommand = New SqlCommand(sql, Con)
        adapter.InsertCommand.ExecuteNonQuery()
        MsgBox("Row inserted !! ")
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
    Con.Close()
End Sub

Private Sub clear()
    'txt1.Text = ""
    txt2.Text = ""
    txt3.Text = ""
    txt4.Text = ""
    txt5.Text = ""
    txt6.Text = ""
    txt7.Text = ""
    txt8.Text = ""
    txt9.Text = ""
    txt10.Text = ""
    txt11.Text = ""
    txt12.Text = ""
    txt13.Text = ""
    txt14.Text = ""
    txt15.Text = ""
    txt16.Text = ""
    txt17.Text = ""
    txt18.Text = ""
    txt19.Text = ""
    txt20.Text = ""
    txt21.Text = ""
    txt22.Text = ""
    txt23.Text = ""
    txt24.Text = ""
    txt25.Text = ""
    txt26.Text = ""

End Sub
Private Sub unlock()
    txt1.Enabled = True
    txt2.Enabled = True
    txt3.Enabled = True
    txt4.Enabled = True
    txt5.Enabled = True
    txt6.Enabled = True
    txt7.Enabled = True
    txt8.Enabled = True
    txt9.Enabled = True
    txt10.Enabled = True
    txt11.Enabled = True
    txt12.Enabled = True
    txt13.Enabled = True
    txt14.Enabled = True
    txt15.Enabled = True
    txt16.Enabled = True
    txt17.Enabled = True
    txt18.Enabled = True
    txt19.Enabled = True
    txt20.Enabled = True
    txt21.Enabled = True
    txt22.Enabled = True
    txt23.Enabled = True
    txt24.Enabled = True
    txt25.Enabled = True
    txt26.Enabled = True

End Sub

Private Sub lock()
    txt1.Enabled = False
    txt2.Enabled = False
    txt3.Enabled = False
    txt4.Enabled = False
    txt5.Enabled = False
    txt6.Enabled = False
    txt7.Enabled = False
    txt8.Enabled = False
    txt9.Enabled = False
    txt10.Enabled = False
    txt11.Enabled = False
    txt12.Enabled = False
    txt13.Enabled = False
    txt14.Enabled = False
    txt15.Enabled = False
    txt16.Enabled = False
    txt17.Enabled = False
    txt18.Enabled = False
    txt19.Enabled = False
    txt20.Enabled = False
    txt21.Enabled = False
    txt22.Enabled = False
    txt23.Enabled = False
    txt24.Enabled = False
    txt25.Enabled = False
    txt26.Enabled = False

End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    Dim frm As New frmRID
    frm.Show()
    frm.MdiParent = frmMain
    Me.Hide()
End Sub

Private Sub locked()
    txt1.Enabled = True
    txt2.Enabled = True

End Sub
Private Sub unlocked()
    txt1.Enabled = False
    txt1.Enabled = False

End Sub

Private Sub cedit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cedit.Click
    If cedit.Text = "Update" Then
        If txt1.Text = "" Or txt2.Text = "" Or txt3.Text = "" Or txt4.Text = "" Or txt5.Text = "" Or txt6.Text = "" Or txt7.Text = "" Or txt8.Text = "" Or txt9.Text = "" Or txt10.Text = "" Or txt11.Text = "" Or txt12.Text = "" Or txt13.Text = "" Or txt14.Text = "" Or txt15.Text = "" Or txt16.Text = "" Or txt17.Text = "" Or txt18.Text = "" Or txt19.Text = "" Or txt20.Text = "" Or txt21.Text = "" Or txt22.Text = "" Or txt23.Text = "" Or txt24.Text = "" Or txt25.Text = "" Or txt26.Text = "" Then
            MsgBox("you have no record to update please click command Search before update")

        Else
            updatesave()
            csearch.Text = "Search"
            clear()
            lock()
        End If

    ElseIf cedit.Text = "Cancel" Then
        cnew.Text = "New"
        cedit.Text = "Update"
        lock()
        clear()

        cdel.Enabled = True
        csearch.Enabled = True

    End If

End Sub


Private Sub updatesave()
    Call main()
    Con.Open()
    Dim adapter As New SqlDataAdapter
    Dim sql As String



    sql = "update DOrproduct set rcv_reference ='" & txt1.Text & "', customer='" & txt2.Text & "',  expected_date='" & txt3.Text & "', date_arrived='" & txt4.Text & "', time_arrived='" & txt5.Text & "',  customer_bol='" & txt6.Text & "', reference='" & txt7.Text & "', cust_order='" & txt8.Text & "', releaseno='" & txt9.Text & "' ,carrier='" & txt10.Text & "' ,trailerno='" & txt11.Text & "' ,issuedto='" & txt12.Text & "' ,date_rcv='" & txt13.Text & "' ,product='" & txt14.Text & "' ,accounting='" & txt15.Text & "' ,trader='" & txt16.Text & "' ,lot='" & txt17.Text & "' ,pkg='" & txt18.Text & "' ,supply_rcv='" & txt19.Text & "' ,status='" & txt20.Text & "' ,opened_by='" & txt21.Text & "' ,odate='" & txt22.Text & "' ,arrivedby='" & txt23.Text & "' ,adate='" & txt24.Text & "' ,closeby='" & txt25.Text & "', cdate='" & txt26.Text & "' where rcv_reference ='" & txt1.Text & "'"
    Try

        adapter.UpdateCommand = Con.CreateCommand
        adapter.UpdateCommand.CommandText = sql
        adapter.UpdateCommand.ExecuteNonQuery()
        MsgBox("records updated  !! ")
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
    Con.Close()
End Sub
Private Sub csearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles csearch.Click
    unlock()

    If csearch.Text = "Search" Then
        csearch.Text = "Cancel"
        cnew.Enabled = False
        txt1.Focus()
    ElseIf csearch.Text = "Cancel" Then
        csearch.Text = "Search"
        cnew.Enabled = True
        clear()

        lock()

    End If


End Sub



Private Sub cdel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cdel.Click
    On Error GoTo err

    If cdel.Text = "Delete" Then
        If txt1.Text = "" Or txt2.Text = "" Or txt3.Text = "" Or txt4.Text = "" Or txt5.Text = "" Or txt6.Text = "" Or txt7.Text = "" Or txt8.Text = "" Or txt9.Text = "" Or txt10.Text = "" Or txt11.Text = "" Or txt12.Text = "" Or txt13.Text = "" Or txt14.Text = "" Or txt15.Text = "" Or txt16.Text = "" Or txt17.Text = "" Or txt18.Text = "" Or txt19.Text = "" Or txt20.Text = "" Or txt21.Text = "" Or txt22.Text = "" Or txt23.Text = "" Or txt24.Text = "" Or txt25.Text = "" Or txt26.Text = "" Then
            MsgBox("you have no record to Delete please click command Search before update")
        Else : cdel.Text = "Delete"
            Select Case MsgBox("Are you sure You want to Delete this Record", MsgBoxStyle.YesNo)
                Case MsgBoxResult.Yes
                    deleterecord()
                    csearch.Text = "Search"
                    clear()
                    lock()
                Case MsgBoxResult.No
                    GoTo err
            End Select
        End If
    End If

err: Exit Sub End Sub

Private Sub deleterecord()
    Call main()
    Con.Open()


    Dim adapter As New SqlDataAdapter
    Dim sql As String

    sql = "delete DOrproduct where rcv_reference ='" & txt1.Text & "'"
    Try

        adapter.DeleteCommand = Con.CreateCommand
        adapter.DeleteCommand.CommandText = sql
        adapter.DeleteCommand.ExecuteNonQuery()
        MsgBox("Records deleted  !! ")
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
    Con.Close()
End Sub

Private Sub txt1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt1.TextChanged
    searchrcv_reference()

End Sub
Private Sub searchrcv_reference()
    Call main()
    Con.Open()

    Dim cmd As New SqlCommand("SELECT rcv_reference FROM DOrproduct", Con)
    Dim ds As New DataSet
    Dim da As New SqlDataAdapter(cmd)
    da.Fill(ds, "My List") 'list can be any name u want

    Dim col As New AutoCompleteStringCollection
    Dim i As Integer
    For i = 0 To ds.Tables(0).Rows.Count - 1
        col.Add(ds.Tables(0).Rows(i)("rcv_reference").ToString())
        If txt1.Text = True Then
            showsearch()
        End If
    Next

    txt1.AutoCompleteSource = AutoCompleteSource.CustomSource
    txt1.AutoCompleteCustomSource = col
    txt1.AutoCompleteMode = AutoCompleteMode.Suggest
    Con.Close()
End Sub
Private Sub showsearch()
    Call main()
    Con.Open()
    Dim UserSelect As SqlCommand
    Dim myreader As SqlDataReader
    Dim sql As String

    sql = "select * from DOrproduct where rcv_reference like '" & (txt1.Text) & "%'"
    UserSelect = New SqlCommand(sql, Con)
    myreader = UserSelect.ExecuteReader

    If (myreader.Read = True) Then

        'txt1.Text = myreader(0)
        txt2.Text = myreader(1)
        txt3.Text = myreader(2)
        txt4.Text = myreader(3)
        txt5.Text = myreader(4)
        txt6.Text = myreader(5)
        txt7.Text = myreader(6)
        txt8.Text = myreader(7)
        txt9.Text = myreader(8)
        txt10.Text = myreader(9)
        txt11.Text = myreader(10)
        txt12.Text = myreader(11)
        txt13.Text = myreader(12)
        txt14.Text = myreader(13)
        txt15.Text = myreader(14)
        txt16.Text = myreader(15)
        txt17.Text = myreader(16)
        txt18.Text = myreader(17)
        txt19.Text = myreader(18)
        txt20.Text = myreader(19)
        txt21.Text = myreader(20)
        txt22.Text = myreader(21)
        txt23.Text = myreader(22)
        txt24.Text = myreader(23)
        txt25.Text = myreader(24)
        txt26.Text = myreader(25)
    End If
    Con.Close()
End Sub
Private Sub txt2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt2.TextChanged
    showCustomer()
End Sub
Private Sub showCustomer()
    Call main()
    Con.Open()

    Dim cmd As New SqlCommand("SELECT customer_name,customer_code FROM packwell_customers", Con)
    Dim ds As New DataSet
    Dim da As New SqlDataAdapter(cmd)
    da.Fill(ds, "My List") 'list can be any name u want

    Dim col2 As New AutoCompleteStringCollection
    Dim i As Integer
    For i = 0 To ds.Tables(0).Rows.Count - 1

        col2.Add(ds.Tables(0).Rows(i)("customer_code").ToString())
        col2.Add(ds.Tables(0).Rows(i)("customer_name").ToString())
    Next
    txt2.AutoCompleteSource = AutoCompleteSource.CustomSource
    txt2.AutoCompleteCustomSource = col2
    txt2.AutoCompleteMode = AutoCompleteMode.Suggest

    Con.Close()
End Sub

End Class



回答3:

The code is a little hard to read, but from what I could understand, it should work. You just need to put the SubmitChanges() method invocation outside the for loop.