Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[CF.NET] BLOB uitlezen vanuit SQL server compact 3.5

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het rechtstreeks uitlezen van BLOB's vanuit mijn SQL server 2005 op de PDA vormt geen probleem.
Met merge replication maak ik een SQL server compact aan, met de identieke gegevens van SQL server 2005.
De C# code wordt enkel gewijzigd van voorbeeld SqlConnection naar SqlceConnection en dergelijke (zie code hieronder). Wanneer ik deze run op mijn PDA dan zal hij telkens bij startIndex = 200 een execption geven. Dus bij het afhalen 100 bytes startend bij byte 200.

Fout: '$exception.Message' threw an exception of type 'System.NotSupportedException'

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
SqlCeConnection cnn = new SqlCeConnection();
cnn.ConnectionString = Housekeeping.LocalMRDbConnectionString;
cnn.Open();
SqlCeCommand dbCmd = new SqlCeCommand("Select mcntImage from MonumentContent", cnn);


FileStream fs;                          // Writes the BLOB to a file (*.bmp).
BinaryWriter bw;                        // Streams the BLOB to the FileStream object.
int bufferSize = 100;                   // Size of the BLOB buffer.
byte[] outbyte = new byte[bufferSize];  // The BLOB byte[] buffer to be filled by GetBytes.
long retval;                            // The bytes returned from GetBytes.
long startIndex = 0;                    // The starting position in the BLOB output.

// Open the connection and read data into the DataReader.
SqlCeDataReader myReader = dbCmd.ExecuteReader(CommandBehavior.SequentialAccess);

while (myReader.Read())
{
                 // Create a file to hold the output.
                 fs = new FileStream("monument" + emp_id + ".jpg", FileMode.OpenOrCreate, FileAccess.Write);
                 bw = new BinaryWriter(fs);

    // Reset the starting byte for the new BLOB.
    startIndex = 0;

    // Read the bytes into outbyte[] and retain the number of bytes returned.
    retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize);

    // Continue reading and writing while there are bytes beyond the size of the buffer.
    while (retval == bufferSize)
    {
        bw.Write(outbyte);
        bw.Flush();

        // Reposition the start index to the end of the last buffer and fill the buffer.
        startIndex += bufferSize;
        retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
                                   [b]//Hier fout bij tweede loop[/b]
    }

    // Write the remaining buffer.
    bw.Write(outbyte, 0, (int)retval);
    bw.Flush();

    // Close the output file.
    bw.Close();
    fs.Close();
}

// Close the reader and the connection.
myReader.Close();
cnn.Close();


Waar aan zou dit kunnen liggen?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Welk deel van 'Not supported' begrijp je niet? ;)

Serieus: volgens de documentatie moet het werken. Je hebt het laatste service pack van CF.NET 2.0 op je pda staan?

[ Voor 54% gewijzigd door EfBe op 12-12-2007 08:27 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
EfBe schreef op woensdag 12 december 2007 @ 08:24:
Welk deel van 'Not supported' begrijp je niet? ;)

Serieus: volgens de documentatie moet het werken. Je hebt het laatste service pack van CF.NET 2.0 op je pda staan?
Ik werk al reeds met de nieuwe compact framework 3.5

Verwijderd

Topicstarter
Wanneer ik de buffersize plaats op: 3 000 000 bytes, dan kan ik de volledige foto afhalen, maar deze is dan wel 3mb groot voor een oorspronkelijke grootte van 3,6kb.
Dus op één of ander manier kan hij de while(retval == buffersize) maar 1 keer overlopen, de tweede keer gaat hij in fout.

Verwijderd

Topicstarter
Bestaat er geen manier om de grootte van uw BLOB te bepalen? dan kan ik de grootte van de buffersize aanpassen aan mijn BLOB

Verwijderd

Topicstarter
Via datalength kan je de BLOB size bepalen dus vb:
SQL:
1
Select DATALENGTH (column) as length from table
Pagina: 1