Veröffentlicht 15. September 200916 j hi leute, ich schreibe momentan ein kleines Tool, welches die E-Mails über POP3 Protokoll abholt. Nun habe ich das Problem das diese im MIME Format ankommen. Da das schreiben einer solchen Klasse enorm aufwändig ist und ich das Rad ja nicht neu erfinden will , frage ich, ob jemand eine gute Klasse diesbezüglich kennt? Lg Gateway
16. September 200916 j Autor Klappt soweit, nun hab ich noch eine Frage. Ich hab in einer access Tabelle ein Feld mit dem typ OLE-Object belegt. Nun hab ich versucht in dieses ein file zu speichern das sieht in etwa so aus: 'Hier wird der anhangname in die DB gespeichert If entity.ContentType_Name IsNot Nothing Then Dim command As New OleDb.OleDbCommand command.Connection = con command.CommandText = "INSERT INTO Attachment(ID, Filename) VALUES(" & currentmail & ", '" & entity.ContentType_Name & "')" con.Open() command.ExecuteNonQuery() con.Close() Dim file() As Byte file = entity.DataEncoded 'Hier "soll" der Anhang in die DB gespeichert werden Dim sqlVO As New OleDb.OleDbCommand sqlVO.Connection = con sqlVO.CommandText = "Select * from Attachment where ID = " & currentmail & " AND Filename = '" & entity.ContentType_Name & "'" Dim adpVO As New OleDb.OleDbDataAdapter(sqlVO) Dim dsVO As New Data.DataSet adpVO.Fill(dsVO) Dim dtVo As Data.DataTable = dsVO.Tables(0) If dtVo.Rows.Count > 0 Then dtVo.Rows(0)("Binary") = file adpVO.Update(dsVO) End If End If Der Fehler der geworfen wird lautet: Aktualsieren erfordert einen gültigen UpdateComand, wenn eine Datarow-Auflistung mit modifizierten Zeilen weitergeben wird. Hat jemand eine Idee? Muss ich vielleicht bei Access die Connection manuel wieder öffnen? lg Gateway Ich muss dazu sagen das noch nie Files in eine access reingeschrieben habe. Die obige routine habe ich immer erfolgreich bei mssql servern benutzt und dachte ich könnte diese einfach für access ummodifizieren. Bearbeitet 16. September 200916 j von Gateway_man
16. September 200915 j Autor Hat sich erledigt, bin jetzt auf ne sqlce DB umgestiegen bei der alles wunderbar klappt.
17. September 200915 j Der Fehler der geworfen wird lautet: Aktualsieren erfordert einen gültigen UpdateComand, wenn eine Datarow-Auflistung mit modifizierten Zeilen weitergeben wird. Wenn du im CommandText ein SELECT statt ein UPDATE angibst, sollte das doch klar sein.
17. September 200915 j Autor ich hab den ganzen part dieser Update routine nicht gezeicht . Dim temparray() As Byte = entity.Data Dim sqlVO As New SqlServerCe.SqlCeCommand sqlVO.Connection = con2 sqlVO.CommandText = "SELECT * FROM Attachment WHERE MailID =" & currentmail & " AND Binary is NULL" Dim adpVO As New System.Data.SqlServerCe.SqlCeDataAdapter(sqlVO) Dim builder As SqlServerCe.SqlCeCommandBuilder = New SqlServerCe.SqlCeCommandBuilder(adpVO) builder.GetUpdateCommand() Dim dsVO As New Data.DataSet adpVO.Fill(dsVO) Dim dtVo As Data.DataTable = dsVO.Tables(0) If dtVo.Rows.Count > 0 Then dtVo.Rows(0)("MailID") = currentmail dtVo.Rows(0)("Filename") = entity.ContentType_Name dtVo.Rows(0)("Binary") = temparray adpVO.Update(dsVO) Else Dim dr As Data.DataRow dr = dtVo.NewRow dr("MailID") = currentmail dr("Filename") = entity.ContentType_Name dr("Binary") = temparray dtVo.Rows.Add(dr) adpVO.Update(dsVO) End If Das Select ist schon richtig, da wird kein update benötigt. Da ich ja erst Suche ob eine solche Row bereits existiert (mit dem Select). Wenn ja dann update ich diese, wenn nicht lege ich eine neue Row an. Funktioniert auch sehr gut muss ich sagen.
17. September 200915 j Ich behaupt einfach mal, dass sowas mit OleDbDataAdapter nicht weil: Wenn du einen OleDbDataAdapter anhand eines OleDbCommands erzeugst, wird dieses Command als SelectCommand gesetzt. Insert-, Update und DeleteCommand bleiben leer. Das wäre jedenfalls meine These.
17. September 200915 j Autor Hm der einzige Grund warum es bei OLEDB nicht auf diesem Weg funktioniert ist, es gibt bei oledb keinen CommandBuilder. Zum Ablauf und zu verständnis da es mir so vorkommt, als bestehen bei diesem codeschnipsel noch missverständnisse: ==>Erstelle einen Command mit einem Select umd eine bestimmte Row zu erhalten. ==>Erstelle einen Adapater dem der Command übergeben wird. ==>Erstelle und fülle ein Dataset mit dem Datensatz ==>Dann wird die Tabelle im Dataset einem Datatable übergeben ==>Nun wird eine Abfrage gestartet ob im Table mehr als 0 Rows vorhanden sind ==>Ist das der Fall werden die Daten geändert und der zuvor kreierte Dataadapter wird mit dem Inhalt des Dataset's upgedatet und wieder an die DB geschickt. ==>Ist es nicht der Fall wird eine Row mit den angegeben Daten ins Dataset eingefügt und wieder in den Adapter übertragen, dieser schreibt es wieder in die DB.
17. September 200915 j Hm der einzige Grund warum es bei OLEDB nicht auf diesem Weg funktioniert ist, es gibt bei oledb keinen CommandBuilder. Achso? Was ist dann das? Zum Rest: mir ist schon klar, wie der Algorithmus funktionieren sollte.
17. September 200915 j Autor hm sehr kurios da mir das IntelliSense dies nicht aufgelistet hat bin ich davon ausgegangen das es keinen CommandBuilder für Oledb gibt. :confused: Wie gesagt beim Compact sowie bei normalen Sql Servern funktioniert das einwandfrei.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.