Avatar billede jakse79 Nybegynder
03. august 2006 - 10:15 Der er 18 kommentarer og
1 løsning

update i sql db med SqlCommand

Hej

Jeg håber at der er nogen som kan hjælpe mig med et problem som jeg ikke længere kan overskue. Jeg har en simpel sql database ved navn "test" med et felt "ID" som er af typen char. Denne db indeholder 10 rækker med værdier fra 0-9. Den kaster en exception og kan ikke opdaterer.

Er der nogen som kan hjælpe mig med dette problem som efter hånden har ædt en go del af min tid :-(

Jeg ønsker at kunne opdatere disse vha af følgende kode:

<%@ Page Language="VB" AutoEventWireup="True" Debug="true"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <title>Guestlogin management</title>
       
    <script language="VB" runat="server">
   
        Dim myConnection As SqlConnection
       
        Sub Page_Load(Src As Object, E As EventArgs)
       
            myConnection = New SQLConnection("server=XXXXXXX;uid=xxxxxxxxxx;pwd=xxxxxxxxx;database=COMMONxxxxxxx")
                   
            If Not IsPostBack Then
                    BindGrid()
                  End If                       
        End Sub
       
        Sub ItemsGrid_Edit(sender As Object, e As DataGridCommandEventArgs)

                ' Set the EditItemIndex property to the index of the item clicked
                ' in the DataGrid control to enable editing for that item. Be sure
                ' to rebind the DateGrid to the data source to refresh the control.
                grd.EditItemIndex = e.Item.ItemIndex
                BindGrid()               
        End Sub
       
        Sub ItemsGrid_Cancel(sender As Object, e As DataGridCommandEventArgs)

                ' Set the EditItemIndex property to -1 to exit editing mode.
                ' Be sure to rebind the DateGrid to the data source to refresh
                ' the control.
                grd.EditItemIndex = -1
                BindGrid()       
        End Sub
       
        Sub ItemsGrid_Update(sender As Object, e As DataGridCommandEventArgs)
       
            Dim updateCmd As String = "UPDATE test SET ID = @ID WHERE ID = @ID"
           
            Dim  myCommand As SqlCommand = New SqlCommand(updateCmd, myConnection)
                 
                  myCommand.Parameters.Add(New SQLParameter( "@ID", SqlDbType.Int))
                 
                  Dim cols() As String = {"@ID"}
                 
                  Dim numCols As Integer = e.Item.Cells.Count
            Dim i As Integer
            Dim colvalue As String
            Dim txtBox As Textbox
           
            For i = 2 To numCols-1
                txtBox = e.Item.Cells(i).Controls(0)
                colvalue = txtBox.Text
               
                If (i<6 And colvalue = "")
                    Message.InnerHtml = "ERROR: Null values not allowed for " & "ID and Country"
                    Message.Style("color") = "red"
                    Exit Sub
                End If
               
                myCommand.Parameters(cols(i-1)).Value = colvalue
            Next i
           
            ' Append the last field, converting true/false values to 0/1.
            txtBox=e.Item.Cells(numCols-1).Controls(0)
           
            ' Test whether the data was updated, and display the appropriate message to the user.
            Try
                ' Connect to the database and update the information.
                myCommand.Connection.Open()
               
                myCommand.ExecuteNonQuery()
                                           
                Message.InnerHtml = "<b>Record Updated.</b><br>"+myCommand.CommandText()
                grd.EditItemIndex = -1
            Catch ex As SqlException
           
                If ex.Number = 2627 Then
                    Message.InnerHtml = "ERROR: A record already exists" & " with the same primary key"
                Else
                    Message.InnerHtml = "ERROR: Could not update record," _
                      & " please ensure the fields are correctly filled out."
                    Message.Style("color") = "red"
                End If
            End Try
           
            ' Close the connection.
            myCommand.Connection.Close()
           
            ' Rebind the DataGrid to show the updated information.
            BindGrid()           
        End Sub
           
        Public Sub BindGrid()
           
            ' Set the data source and bind to the Data Grid control.
            myConnection = New SQLConnection("server=xxxxxx;uid=xxxxxxx;pwd=xxxxxxxx;database=xxxxxxxx")
            Dim myCommand As SqlDataAdapter = New SqlDataAdapter("select * from test", myConnection)
            Dim ds As DataSet= New DataSet()
            myCommand.Fill(ds)
            grd.DataSource = ds
            grd.DataBind()                   
        End Sub
       
        </script>   
</head>
<body style="font: 10pt verdana">

<form runat="server">

      <span id="Message" EnableViewState="false"
      style="font:arial 11pt;" runat="server"/><p>     

      <asp:DataGrid id="grd"
            HorizontalAlign="center"         
          OnEditCommand="ItemsGrid_Edit"
          OnCancelCommand="ItemsGrid_Cancel"
          OnUpdateCommand="ItemsGrid_Update"
          AutoGenerateColumns="false"
          runat="server">

        <HeaderStyle BackColor="#aaaadd">
        </HeaderStyle>

        <Columns>

            <asp:EditCommandColumn
                EditText="Edit"
                CancelText="Cancel"
                UpdateText="Update"
                HeaderText="">

              <ItemStyle Wrap="False">
              </ItemStyle>

              <HeaderStyle Wrap="False">
              </HeaderStyle>

            </asp:EditCommandColumn>
           
            <asp:BoundColumn HeaderText="ID"
                DataField="ID"/>

        </Columns>

      </asp:DataGrid>

  </form>

</body>

</html>
Avatar billede snepnet Nybegynder
03. august 2006 - 10:17 #1
myCommand.Parameters.Add(New SQLParameter( "@ID", SqlDbType.Int))
Der har du angivet typen til en int - du skriver at det er af typen char.
Avatar billede snepnet Nybegynder
03. august 2006 - 10:19 #2
Men altså ... hvis det er en autogeneret nøgle (int) du har i basen, giver det måske meget god mening at du ikke kan opdatere.
Mvh
Avatar billede jakse79 Nybegynder
03. august 2006 - 10:21 #3
Det er en skrive fejl i koden fra min side. Jeg har lige rettet det så der står myCommand.Parameters.Add(New SQLParameter( "@ID", SqlDbType.Char)) og den kommer stadigvæk med samme tilbagemelding:

ERROR: Could not update record, please ensure the fields are correctly filled out.
Avatar billede jakse79 Nybegynder
03. august 2006 - 10:22 #4
Den er ikke autogenereret i db og ikke gjort til primær nøgle.
Avatar billede jakse79 Nybegynder
03. august 2006 - 10:28 #5
Jeg får flg udskrevet:

ERROR: Index #0 Message: Prepared statement '(@ID int)UPDATE test SET ID = @ID WHERE ID = @ID' expects parameter @ID, which was not supplied. LineNumber: 0 Source: .Net SqlClient Data Provider Procedure:

når jeg indsætter denne kode under catch i try blokken:

Catch ex As SqlException
           
Dim errorMessages As String
Dim c As Integer
               
For c = 0 To ex.Errors.Count - 1
  errorMessages += "Index #" & c.ToString() & ControlChars.NewLine _
  & "Message: " & ex.Errors(c).Message & ControlChars.NewLine _
  & "LineNumber: " & ex.Errors(c).LineNumber & ControlChars.NewLine _
  & "Source: " & ex.Errors(c).Source & ControlChars.NewLine _
  & "Procedure: " & ex.Errors(c).Procedure & ControlChars.NewLine

Next c

Message.InnerHtml = "ERROR: " +errorMessages
Avatar billede jakse79 Nybegynder
03. august 2006 - 10:31 #6
Jeg prøver lige igen :-)

  ERROR: Index #0 Message: Prepared statement '(@ID char(8000))UPDATE test SET ID = @ID WHERE ID = @ID' expects parameter @ID, which was not supplied. LineNumber: 0 Source: .Net SqlClient Data Provider Procedure:

Dette er fejlmeddelsen jeg får udskrevet.
Avatar billede snepnet Nybegynder
03. august 2006 - 10:33 #7
Kan du ikke droppe løkken indtil videre, og så bare sætte parameteren
myCommand.Parameters("@ID").Value = colvalue
Mvh
Avatar billede jakse79 Nybegynder
03. august 2006 - 10:40 #8
Hvis jeg sætter i til at være 1 melder den ingen fejl men opdaterer ikke. 2 og opefter melder den fejl.

Dim numCols As Integer = e.Item.Cells.Count
Dim i As Integer
Dim colvalue As String
Dim txtBox As Textbox
                       
txtBox = e.Item.Cells(i).Controls(0)
colvalue = txtBox.Text
                       
myCommand.Parameters("@ID").Value = colvalue
Avatar billede snepnet Nybegynder
03. august 2006 - 10:45 #9
Du har jo også kun én kolonne udover knaplolonnen, så det ville være mærkeligt hvis du kunne få fat i noget i andre kolonner end den.
Du må debugge ned igennem, og se hvordan din kode eksekverer, og om de værdier du benytter er som de skal være.
Du skal nok også benytte SqlDbType.Char, og så sørge for at sætte en charværdi, og ikke en tekst.
Mvh
Avatar billede jakse79 Nybegynder
03. august 2006 - 11:04 #10
Jeg har lige fundet fejlen.
Den ligger i sql forspørgslen idet jeg søger efter "where ID = @ID". Dette giver selvfølgelig ikke nogen mening idet denne ikke findes. Jeg satte den med et tal som var inkluderet i tabellen og så blev den række opdateret. Hvordan skal jeg gøre hvis jeg ønsker denne statiske værdi erstattet med et tal som altid symboliserer hvad der stod i tekstboksen inden det blev ændret?
Avatar billede jakse79 Nybegynder
03. august 2006 - 11:07 #11
Hvis jeg forsøger med dette:
myCommand.Parameters("@ID").Value = grd.DataKeys(CInt(E.Item.ItemIndex))
Får jeg flg fejl:
"Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"
Avatar billede snepnet Nybegynder
03. august 2006 - 11:17 #12
Så vidt jeg kan se har du heller ikke defineret datakey på dit datagrid.
Prøv bare til en start at give den en eller anden værdi - og se om du kan få din update til at fungere.
Mvh
Avatar billede jakse79 Nybegynder
03. august 2006 - 11:20 #13
Det kan jeg. "where ID = 3" og jeg skriver 10 i feltet som kommer frem efter jeg har trykket update, så opdatere den med et 10-tal hvor der før stod 3.
Avatar billede snepnet Nybegynder
03. august 2006 - 11:33 #14
Jamen det er jo et fint skridt på vejen, så skal du så bare suge værdien ud af dit grid.
Du kan godt bruge den kode du skal før, men du bliver nødt til at sætte DataKeyField på dit datagrid til ID - ellers kan du ikke hente id'erne ud.
Mvh
Avatar billede jakse79 Nybegynder
03. august 2006 - 11:36 #15
Hvordan gør jeg det?
Avatar billede snepnet Nybegynder
03. august 2006 - 12:06 #16
<asp:DataGrid id="grd"
  HorizontalAlign="center"       
  OnEditCommand="ItemsGrid_Edit"
  OnCancelCommand="ItemsGrid_Cancel"
  OnUpdateCommand="ItemsGrid_Update"
  AutoGenerateColumns="false"
  DataKeyField="ID"
  runat="server">
Mvh
Avatar billede jakse79 Nybegynder
03. august 2006 - 12:09 #17
Tak for hjælpen
Avatar billede snepnet Nybegynder
03. august 2006 - 12:25 #18
Det var bestemt så lidt :o)
Skal du have et svar så?
Mvh
Avatar billede jakse79 Nybegynder
03. august 2006 - 12:50 #19
Selvfølgelig :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester