Avatar billede jaffafo Nybegynder
08. november 2004 - 19:27 Der er 42 kommentarer og
1 løsning

Object must implement IConvertible

hejsa

jeg prøver at bruge EditItemTemplate i en datagrid, men det går ikke så godt :)

jeg har fået editcommand og CancelCommand at virke, men har lidt problemer med UpdateCommand.

jeg har denne kode:

sub opdater(ObjSource as Object, objArgs as DatagridCommandEventArgs)
DataOleDb.Opendb("Futty")
           
dim con as oledbconnection = Dataoledb.con("futty")
Dim ins As OleDbCommand = New OleDbCommand ("UPDATE Manager SET VALUES(navn = @navn,email = @email,adgangskode = @adgangskode,motto = @motto);" , con)
ins.Parameters.Add("@navn", OleDbType.VarChar)
ins.Parameters.Add("@email", OleDbType.VarChar)
ins.Parameters.Add("@adgangskode", OleDbType.VarChar)
ins.Parameters.Add("@motto", OleDbType.varChar)
ins.Parameters("@navn").Value = CType(objArgs.Item.FindControl("txtNavn"), Textbox)
ins.Parameters("@email").Value = CType(objArgs.Item.FindControl("txtEmail"), Textbox)
ins.Parameters("@adgangskode").Value = CType(objArgs.Item.FindControl("txtadgangskode"), Textbox)
ins.Parameters("@motto").Value = CType(objArgs.Item.FindControl("txtmotto"), Textbox)
           
ins.ExecuteNonQuery

DataoleDb.Closedb()

end sub

Koden bliver kørt og jeg får denne fejl:


Exception Details: System.InvalidCastException: Object must implement IConvertible.

Source Error:

Line 58:            
Line 59:            
Line 60:             ins.ExecuteNonQuery
Line 61:
Line 62:         DataoleDb.Closedb()
Avatar billede arne_v Ekspert
08. november 2004 - 19:30 #1
Prøv og erstat

CType(objArgs.Item.FindControl("txtNavn"), Textbox)

med

CType(objArgs.Item.FindControl("txtNavn"), Textbox).Text

(også for de andre 3)
Avatar billede jaffafo Nybegynder
08. november 2004 - 20:24 #2
hejsa..  jeg bruger denne kode nu:

sub opdater(ObjSource as Object, objArgs as DatagridCommandEventArgs)
   
DataOleDb.Opendb("Futty")
           
dim con as oledbconnection = Dataoledb.con("futty")
Dim ins As OleDbCommand = New OleDbCommand("UPDATE Manager SET navn = @navn,email = @email,adgangskode = @adgangskode,motto = @motto WHERE ManagerID = @ManagerID" , con)
ins.Parameters.Add("@managerid", OleDbType.varCHar)
ins.Parameters.Add("@navn", OleDbType.VarChar)
ins.Parameters.Add("@email", OleDbType.VarChar)
ins.Parameters.Add("@adgangskode", OleDbType.VarChar)
ins.Parameters.Add("@motto", OleDbType.varChar)
ins.Parameters("@managerid").Value = CType(objArgs.Item.FindControl("lblID"), label).text
ins.Parameters("@navn").Value = CType(objArgs.Item.FindControl("txtNavn"), Textbox).text
ins.Parameters("@email").Value = CType(objArgs.Item.FindControl("txtEmail"), Textbox).text
ins.Parameters("@adgangskode").Value = CType(objArgs.Item.FindControl("txtadgangskode"), Textbox).text
ins.Parameters("@motto").Value = CType(objArgs.Item.FindControl("txtmotto"), Textbox).text

ins.ExecuteNonQuery
           
dgBrugere.EditItemIndex = -1
Binddatagrid()

           
DataoleDb.Closedb()
   
end sub

Der kommer ingen fejl eller exceptions, men det bliver ikke gemt i databasen.
Avatar billede arne_v Ekspert
08. november 2004 - 20:42 #3
Det er jo en UPDATE og ikke en INSERT.

Er der nogle rækker som matcher din WHERE betingelse ?
Avatar billede jaffafo Nybegynder
08. november 2004 - 23:24 #4
jeg har tjekket indholdet og alle "felter" i SQL'en bliver fyldt rigtigt.. og hvis jeg bruger laver en "normal" connection (dvs uden sqlparametre) fungerer det fint.. dvs det gemmes i databasen.

og jeg har også tjekket ManagerID'en og den passer ifht databasen.
Avatar billede jaffafo Nybegynder
08. november 2004 - 23:25 #5
jeg har fornemmelse af at det skyldes samme som i den her tråd:

http://www.eksperten.dk/spm/556953
Avatar billede jaffafo Nybegynder
19. november 2004 - 16:44 #6
hejsa arne_v

jeg har prøvet at arbejde videre med mit SQL Parameter problem..  og nu er jeg kommet videre.. jeg har prøvet at trace problemet, men ved ikke helt se hvad jeg skal kigge efter i Trace Output'et..
Avatar billede arne_v Ekspert
19. november 2004 - 20:48 #7
Sæt

<%@ Page Trace="true" %>

øverst på siden
Avatar billede jaffafo Nybegynder
19. november 2004 - 21:40 #8
jeg har enabled det i web.config..  men hvad skal jeg kigge efter i trace output'et?
Avatar billede arne_v Ekspert
19. november 2004 - 21:43 #9
Det du udskriver til trace vel !?
Avatar billede jaffafo Nybegynder
19. november 2004 - 21:55 #10
vel !?

det hjælper mig virkelig meget..  men jeg skal nok finde ud af det..
Avatar billede arne_v Ekspert
19. november 2004 - 21:58 #11
Du har sat nogle Trace.Write kald ind i din kode ikke ?
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:01 #12
ja nu har jeg..

men jeg har ikke kendskab til tracing og derfor er det lidt svært for mig at se hvordan jeg tjekker tingene..

jeg har dog en bog her, men den er ikke specielt hjælpsom..

Jeg har prøvet at smide den her ind:

trace.write(ins.ExecuteNonQuery)

og den giver et flot  0  i trace..
Avatar billede arne_v Ekspert
19. november 2004 - 22:09 #13
Se det er jo interessant.

ExecuteNonQuery returnerer "The number of rows affected", så den ved godt at den ikke har indsat noget.
Avatar billede arne_v Ekspert
19. november 2004 - 22:09 #14
Prøv også:

Trace.Write(ins.CommandText)
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:11 #15
hej igen..  jeg takker mange gange for hjælpen


den sidste der giver:

UPDATE Fixlist SET navn = @navn,tekst = @tekst,status = @status WHERE ID = @ID
Avatar billede arne_v Ekspert
19. november 2004 - 22:11 #16
Og:


    For i = 0 To ins.Parameters.Count - 1
        Trace.Write(ins.Parameters(i).ParameterName & " = " & ins.Parameters(i).Value)
    Next i
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:12 #17
@id = 1 0,960907 0,015175
@navn = Fixlist 0,960977 0,000071
@tekst = Fixlisten skal laves færdig. :) 0,961015 0,000037
@status = ikke lavet 0,961056 0,000041

UPDATE Fixlist SET navn = @navn,tekst = @tekst,status = @status WHERE ID = @ID
Avatar billede arne_v Ekspert
19. november 2004 - 22:14 #18
Umiddelbart ser den da suspekt ud !

Mener du virkeligt:

WHERE ID = '1 0,960907 0,015175'

?
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:15 #19
nåå nej..

det er bare det trace siden viser mig... 

@id = 1
@navn = Fixlist
@tekst = Fixlisten skal laves færdig. :)
@status = ikke lavet
UPDATE Fixlist SET navn = @navn,tekst = @tekst,status = @status WHERE ID = @ID
Avatar billede arne_v Ekspert
19. november 2004 - 22:17 #20
sorry - den havde jeg misset
Avatar billede arne_v Ekspert
19. november 2004 - 22:18 #21
Er ID feltet en VARCHAR ?
Avatar billede arne_v Ekspert
19. november 2004 - 22:18 #22
For i = 0 To ins.Parameters.Count - 1
    Trace.Write(ins.Parameters(i).ParameterName & " = " & ins.Parameters(i).Value & " " & & ins.Parameters(i).Value.Length)
Next i
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:19 #23
Nope.. det er faktisk Integer..  men jeg har ændret det nu og det virker stadig ikke
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:20 #24
@id = 1 1
@navn = Fixlist2 8
@tekst = Fixlisten skal laves færdig. :) 31
@status = ikke lavet2 11
Avatar billede arne_v Ekspert
19. november 2004 - 22:23 #25
Og der er en id 1 i databasen =
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:24 #26
Ja..  100% sikkert og Tabellen hedder Fixlist
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:31 #27
jeg har lige prøvet at skifte sql'en ud med denne:
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:31 #28
UPDATE Fixlist SET navn = 'Futty',tekst = 'Futty',status = 'Logget' WHERE ID = 1
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:32 #29
og det fungerer fint.. dvs det gemmes i databasen..

sorry for 3 posts.. kom til at trykke på send
Avatar billede arne_v Ekspert
19. november 2004 - 22:37 #30
Og typerne er 3 x OleDbType.VarChar og 1 x OleDbType.Integer ?
Avatar billede jaffafo Nybegynder
19. november 2004 - 22:39 #31
ja.  Jeg forstår det ikke..  det burde vel virke.
Avatar billede arne_v Ekspert
19. november 2004 - 22:51 #32
jep
Avatar billede jaffafo Nybegynder
19. november 2004 - 23:01 #33
har du et simpelt eksempel som fungerer som jeg kan se på?

for det her kan altså ikke passe..
Avatar billede arne_v Ekspert
19. november 2004 - 23:05 #34
Den her virker:

Imports System
Imports System.IO
Imports System.Data
Imports System.Data.OleDb

Class MainClass

    Public Shared Sub Main(ByVal args As String())
        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=")
        con.Open
        Dim cre As OleDbCommand = New OleDbCommand ("CREATE TABLE imgtest (id INTEGER PRIMARY KEY,img OLEObject)", con)
        cre.ExecuteNonQuery
        Dim imgfile As Stream = New FileStream ("C:\blue.jpg", FileMode.Open)
        Dim siz As Integer = imgfile.Length
        Dim imgdata(siz-1) As Byte
        imgfile.Read(imgdata, 0, imgdata.Length)
        imgfile.Close
        Dim ins As OleDbCommand = New OleDbCommand ("INSERT INTO imgtest VALUES(@id,@img)", con)
        ins.Parameters.Add("@id", OleDbType.Integer)
        ins.Parameters.Add("@img", OleDbType.VarBinary)
        ins.Parameters("@id").Value = 1
        ins.Parameters("@img").Value = imgdata
        ins.ExecuteNonQuery
        Dim sel As OleDbCommand = New OleDbCommand ("SELECT img FROM imgtest WHERE id = @id", con)
        sel.Parameters.Add("@id", OleDbType.Integer)
        sel.Parameters("@id").Value = 1
        Dim imgdata2 As Byte() = CType(sel.ExecuteScalar, Byte())
        Dim drp As OleDbCommand = New OleDbCommand ("DROP TABLE imgtest", con)
        drp.ExecuteNonQuery
        Dim imgfile2 As Stream = New FileStream ("C:\blue2.jpg", FileMode.Create)
        imgfile2.Write(imgdata2, 0, imgdata2.Length)
        imgfile2.Close
        con.Close
    End Sub
End Class
Avatar billede jaffafo Nybegynder
19. november 2004 - 23:11 #35
UPDATE Fixlist SET navn = @navn, tekst = @tekst, status = @status WHERE ID = 1;
rows affected: 1


Den gemmer indholder i tekst og status (men ikke navn) når jeg gør sådan der..  dvs jeg angiver ID'en manuelt.
Avatar billede jaffafo Nybegynder
19. november 2004 - 23:25 #36
Her kommer et langt og mærkeligt forslag til problemet.

Jeg har 5 felter i databasen:

ID (integer)
Navn (Char)
Tekst (Char)
Dato (date)
Status (Char)

Disse viser jeg i en customtemplate i en datagrid. Jeg har også en "rediger" knap som sætter datagrid'en i edittemplate hvor jeg så kan ændre i Navn, Tekst og Status. Dato og ID forbliver labels.

lad os sige at ID indholder 1, navn = 2, tekst = 3, dato (en dato) og status = 4. Når jeg trykker på rediger og kan ændre indholdet så skriver jeg: navn = a, tekst = b og status = c.

Gæt hvad sker..  Id forbliver 1, navn bliver til 1, tekst til a og status til b.

som om den data jeg gemmer bliver lagt i 1 felt ved siden af der hvor det skal.

hvis jeg nu gemmer igen. og denne skriver jeg navn = 9, tekst = 8 og status = 7 så gemmer den det som:

ID = 1, navn = 1, tekst = 9 og status = 8...

jeg er totalt på bar bund nu...
Avatar billede arne_v Ekspert
19. november 2004 - 23:30 #37
DataGrid ?

Betyder det at du også har et DataSet og en OleDbDataAdapter ?
Avatar billede jaffafo Nybegynder
19. november 2004 - 23:37 #38
jeg binder dataen sådan her:

sub binddatagrid()
    try
        dim sql as string = "SELECT * from Fixlist"
           
        dataoledb.opendb("futty")
               
            Dim objAdapter as OledbDataAdapter           
            Dim objDataSet as new DataSet()
            objAdapter = new OledbDataAdapter(SQL, dataoledb.objConn)
            objAdapter.Fill(objDataSet, "Fixlist") 
               
            Dim objDataTabel as DataTable
            objDataTabel = objDataset.Tables("Fixlist")
           
            dgFixlisten.DataSource = objDataTabel
            dgFixlisten.DataBind()
        dataoledb.closedb()
    catch ex as exception
        response.write(ex.tostring())
    end try
end sub
Avatar billede arne_v Ekspert
20. november 2004 - 18:56 #39
Så skulle du måske opdatere i data settet og update derfra ??
Avatar billede jaffafo Nybegynder
20. november 2004 - 19:14 #40
tjo..  hvordan?

Jeg er ikke så god til datasets. Har du et lille eksempel som kan hjælpe mig igang.?
Avatar billede arne_v Ekspert
20. november 2004 - 19:40 #41
Imports System
Imports System.Data
Imports System.Data.OleDb

Module Main
    Sub Main()
        ' initialize
        Dim con As OleDbConnection = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb")
        Dim da As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM T1", con)
        Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(da)
        Dim ds As DataSet  = New DataSet
        da.Fill(ds, "T1")
        Dim dt As DataTable = ds.Tables("T1")
        ' print all rows
        Dim i As Integer
        For i = 0 To (dt.Rows.Count - 1)
            Console.WriteLine(dt.Rows(i).Item("F1") & " " & dt.Rows(i).Item("F2"))
        Next
        ' add new row
        Dim dr As DataRow = dt.NewRow
        dr.Item("F1") = 12345
        dr.Item("F2") = "ABCDE"
        dt.Rows.Add(dr)
        ' print all rows
        For i = 0 To (dt.Rows.Count - 1)
            Console.WriteLine(dt.Rows(i).Item("F1") & " " & dt.Rows(i).Item("F2"))
        Next
        ' write changes back to database
        da.Update(ds, "T1")
        con.Close
    End Sub
End Module
Avatar billede jaffafo Nybegynder
15. marts 2005 - 11:49 #42
smid lige et svar her. :)
Avatar billede arne_v Ekspert
15. marts 2005 - 11:58 #43
ok
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