[C#] webclient byte array inserten in SQL mislukt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
Na veel zoeken, googlen, proberen en testen ben ik aan het eind van mijn latijn en vestig ik mijn hoop op jullie mede-gotters.

Ik ben bezig om met webdav mail uit te lezen en deze te importeren in een CRM systeem.
Alles goed en wel, behalve het inserten van de attachments in de database.

C#:
1
2
3
4
5
6
7
8
9
10
11
//Attachment downloaden
System.Net.WebClient webClient = new System.Net.WebClient();
webClient.Credentials = MyCredentialCache;
webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
webClient.Headers.Add("Translate", "F");

//HrefNodes[i].InnerText is de URI van de attachment
byte[] bijlage = webClient.DownloadData(HrefNodes[i].InnerText);

//attachment lokaal opslaan (ook als test om te zien of de byte array correct gevuld is
System.IO.File.WriteAllBytes(@C:\temp\ + filename, bijlage); //quotes weggelaten om c:\temp vanwege code=c# bugje ofzo


Dit gaat goed en geeft geen problemen.
Zodra ik echter de bijlage in een tabel INSERT (column van type image) dan krijg ik geen foutmelding te zien, het record blijft gewoon leeg. Probeer ik in dit record een String, int of iets anders te INSERTEN krijg ik wel netjes een foutmelding.

Dan ga je toch denken dat je INSERT method bugged is, dit heb ik als volgt getest:

C#:
1
2
ASCIIEncoding enc = new ASCIIEncoding();
byte[] bijlage = enc.GetBytes("test");


En ja hoor, ik zie dan netjes 0x74657374 in het record staan.
De byte array klopt, de insert method klopt. Wat zie ik over het hoofd?
Het zal ongetwijfeld iets kleins zijn, maar ik zie het niet meer.

PS:
Geen idee waarom, maar ik kan geen code=c# tags gebruiken voor de bovenste tags. Krijg dan een time-out.
quotes op de laatste regel buggen de boel... 8)7

[ Voor 4% gewijzigd door Xiliath op 20-05-2010 21:56 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Xiliath schreef op donderdag 20 mei 2010 @ 21:31:
PS:
Geen idee waarom, maar ik kan geen code=c# tags gebruiken voor de bovenste tags. Krijg dan een time-out.
Klopt, gemeld: pedorus in "RML Execution Timeout"

Gaat het downloaden op regel 8 nu fout ofzo, of is er een ander probleempje? Je hebt het over een insert, maar ik zie die code niet..

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
Nee, het downloaden gaat goed, dan controleer ik op regel 10 door de bijlage naar een file te schrijven.
Als je wilt, kan ik de insert code erbij plaatsen, maar zit een hele class achter.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Xiliath schreef op donderdag 20 mei 2010 @ 22:05:
Nee, het downloaden gaat goed, dan controleer ik op regel 10 door de bijlage naar een file te schrijven.
Als je wilt, kan ik de insert code erbij plaatsen, maar zit een hele class achter.
Nou ja, het is lastig kijken wat er fout gaat, als er alleen maar code is die het gewoon goed doet... :p

Het lijkt me dat je in een database waar het naar toegaat een willekeurige byte-array moet kunnen stoppen. Dat die byte-array toevallig uit webdav komt boeit niet..

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ligt het nou aan mij of heb je geen code gepost die daadwerkelijk de insert doet?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
De resterende code:
(heb een aparte methode met een update gemaakt om t kort en overzichtelijk te houden, probleem is nog steeds hetzelfde)

De aanroep.
C#:
1
2
3
Data.Database.Connect connection = new Data.Database.Connect("ConnectionString");
connection.SaveDocument(documentID, bijlage);
connection.CloseConnection();


De methode:
C#:
1
2
3
4
5
6
7
public void SaveDocument(Guid id, byte[] document) 
        {
            SqlCommand sqlCommand = new SqlCommand("UPDATE BacoDiscussions SET Document = @document WHERE id = @id", this.SQLConnect);
            sqlCommand.Parameters.AddWithValue("@document", document);
            sqlCommand.Parameters.AddWithValue("@id", id);
            sqlCommand.ExecuteNonQuery();
        }

[ Voor 9% gewijzigd door Xiliath op 20-05-2010 22:56 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Misschien een gevalletje http://chrisrickard.blogspot.com/2007/06/addwithvalue-is-evil.html bij byte[]-arrays groter dan 8000. En als je iets als cmd.Parameters.Add("@document", SqlDbType.Image).Value = document doet?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
Heb de blog gelezen en jouw idee van sqlCommand.Parameters.Add("@document", SqlDbType.Image).Value = document; getest, maar helaas.
Nog steeds geen errormelding en een leeg record.
Ik zal eens een textbestand met slechts een paar woorden proberen.

Edit: Met een textbestand met slechts 1 woord gaat het nu inderdaad wel goed!
Nu nog uit zien te vogelen hoe ik grotere bestanden erin krijg.

Edit:
http://msdn.microsoft.com...ystem.data.sqldbtype.aspx
suggereert dat jouw idee van SqlDbType.Image het probleem zou moeten oplossen, maar doet t dus niet helaas.

[ Voor 41% gewijzigd door Xiliath op 20-05-2010 23:44 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Geef je wel de size mee? Ik geef toe, had dat in het voorbeeld moeten zetten (Add("@document", SqlDbType.Image,document.Length).Value = document).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
Had ik niet meegegeven, nu wel. Maar heeft helaas niet geholpen.
En we zoeken verder. Bedankt voor alle moeite tot nu toe. Wordt zeer gewaardeerd.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Xiliath schreef op vrijdag 21 mei 2010 @ 00:06:
Had ik niet meegegeven, nu wel. Maar heeft helaas niet geholpen.
En we zoeken verder. Bedankt voor alle moeite tot nu toe. Wordt zeer gewaardeerd.
Mm, het zou hier natuurlijk ook niet moeten uitmaken trouwens (alleen nodig bij output/bidirectional parameters, of als je de parameter wil hergebruiken met groter wordende data). Het viel me alleen op dat het in het voorbeeld wel stond. Alternatief kun je updaten in delen, maar eigenlijk snap ik niet waar het maximum hier vandaan komt. Overigens is dat artikel achterhaald - Het image type is deprecated en update+.write moet tegenwoordig worden gebruikt. SQL Server heeft voor zover ik weet enkel niet echt een maximum, dus ik blijf me afvragen waar dit probleem vandaan komt.. Wat is de grens waarbij het misgaat?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
Ok, het werkt.
Ik heb sinds het aanmaken van het update statement alleen gekeken op databaseniveau of het veld wel/niet leeg was.
Als ik het bestand oproep vanuit het CRM systeem dan gaat dit gewoon goed, ook al zie ik in het record niets staan.
Weet dus niet precies vanaf waar het nu goed gaat, ik vermoed dankzij de sqlCommand.Parameters.Add("@document", SqlDbType.Image).Value = document; tip van Pedorus.

Anyway, proof of concept werkt nu en ik kan mail + attachements uitlezen en opslaan in het CRM.
Bedankt!
Pagina: 1