Toon posts:

[.Net] binair file in db met stored procedure *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo, in C# .net probeer ik een afbeelding binair in de database op te slaan, dit gaat goed met onderstaande code
btImage is een byte[]
code:
1
2
3
4
5
6
7
8
9
10
11
12
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString());
String sqlString = "INSERT INTO Afbeelding(filename, filecol)"
    + " VALUES (@filename, @filecol)";
SqlCommand UC = new SqlCommand(sqlString);

UC.Parameters.Add("@filename",  SqlDbType.VarChar, 50).Value = file.PostedFile.FileName.ToString();
UC.Parameters.Add("@filecol",   SqlDbType.Binary).Value      = btImage;

UC.Connection = conn;
conn.Open();
UC.ExecuteNonQuery();
conn.Close();


doe ik hetzelfde via een stored procedure dan krijg ik het niet voor elkaar
code:
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
53
public Int32 saveAfbeelding(String filename, byte[] filecol, Int32 size)
        {
            Int32 errorCode = -1;
            Int32 afbeeldingID = -1;
            Int32 rowsAffected;

            SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString());

            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "dbo.ldn_SaveAfbeelding";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;

            try
            {
                SqlParameter PA;

                PA = new SqlParameter("@filename", SqlDbType.VarChar, 255);
                PA.Value = filename;
                cmd.Parameters.Add(PA);

                PA = new SqlParameter("@filecol", SqlDbType.Binary, size);
                PA.Value = filecol;
                cmd.Parameters.Add(PA);

                PA = new SqlParameter("@size", SqlDbType.Int);
                PA.Value = size;
                cmd.Parameters.Add(PA);

                PA = new SqlParameter("@afbeeldingID", SqlDbType.Int, 4, ParameterDirection.Output, true, 10, 0, "", DataRowVersion.Proposed, afbeeldingID);
                cmd.Parameters.Add(PA);


                PA = new SqlParameter("@errorCode", SqlDbType.Int, 4, ParameterDirection.Output, true, 10, 0, "", DataRowVersion.Proposed, errorCode);
                cmd.Parameters.Add(PA);

                conn.Open();
            
                rowsAffected = cmd.ExecuteNonQuery();
                
                afbeeldingID = Int32.Parse(cmd.Parameters["@afbeeldingID"].Value.ToString());
                errorCode   = Int32.Parse(cmd.Parameters["@errorCode"].Value.ToString());
            }
            catch(Exception e)
            {
                System.Web.HttpContext.Current.Response.Write(e.Message.ToString());
            }

            conn.Close();
            cmd.Dispose();

            return afbeeldingID;
        }


de stored procedure
code:
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
ALTER PROCEDURE ldn_SaveAfbeelding
(
    @filename varchar(255),
    @filecol binary,
    @size int,
    @afbeeldingID int OUTPUT,
    @errorCode int OUTPUT   
)
AS

INSERT INTO afbeelding
(
    filename,
    filecol,
    grootte
)
VALUES
(
    @filename,
    @filecol,
    @size
)

    -- Get the Error Code for the statement just executed.
    SELECT @errorCode=@@ERROR
    -- Get the IDENTITY value for the row just inserted.
    SELECT @afbeeldingID=SCOPE_IDENTITY()
--  GO


het opslaan gaat prima, geen foutmeldingen bij beide methoden echter als ik vervolgens probeer de afbeelding te bekijken, krijg ik bij de eerste methode netjes mijn afbeelding maar bij mijn twee methode onderstaande melding:

?!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

wie kan mij verder helpen?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

**** Over topictitels in P&W - Updated 9 mei 04 ****
.Net in de topictitel gefrot, let er volgende keer graag op. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Sorrie was het even vergeten.

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 19:43

GrimaceODespair

eens een tettenman, altijd ...

Op welke manier vraag je de afbeeldingen op?

Wij onderbreken deze thread voor reclame:
http://kalders.be


Verwijderd

Topicstarter
cel.Text = "[img]\"getimage.aspx?id="[/img]";


getimage.aspx:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString());
String sqlString =  "SELECT filecol FROM afbeelding WHERE id = " + fotoID.ToString();

conn.Open();
SqlCommand cmd2 = new SqlCommand(sqlString, conn);
byte[] b = (byte[])cmd2.ExecuteScalar();
if (b.Length > 0)
{
    System.IO.MemoryStream stream = new System.IO.MemoryStream(b, true);
    stream.Write(b, 0, b.Length);
    
    if (Request.QueryString["maxWidth"] != null)
    {
        maxWidth = Int32.Parse(Request.QueryString["maxWidth"].ToString());
    }
    if (Request.QueryString["maxHeight"] != null)
    {
        maxHeight = Int32.Parse(Request.QueryString["maxHeight"].ToString());
    }

    stream = thumbnail(stream, maxHeight, maxWidth);
    Response.BinaryWrite(stream.ToArray());
}
conn.Close();

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

En als je gewoon getimage.apsx aanroept in browser met de parameters erachter, werkt dat wel?

Verwijderd

Topicstarter
nee, dan krijg ik juist die rare melding, echt vreemd je kunt toch wel gewoon zo'n byte[] met een stored procedure toevoegen?

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Verwijderd schreef op 04 juli 2004 @ 14:30:
nee, dan krijg ik juist die rare melding, echt vreemd je kunt toch wel gewoon zo'n byte[] met een stored procedure toevoegen?
Dat kan wel ja en als ik het zo bekijk doe je het gewoon goed. (tenminste er valt me nog geen fout op).

Wat is de source code verder dan van je getimage.apsx nadat hij geparsed is en die melding geeft?

Verwijderd

Topicstarter
code:
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
        private void Page_Load(object sender, System.EventArgs e)
        {
            Int32 fotoID;
            Int32 maxWidth = 100;
            Int32 maxHeight = 100;

            if (Request.QueryString["id"] != null)
            {
                fotoID = Int32.Parse(Request.QueryString["id"]);

                SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString());
                String sqlString =  "SELECT filecol FROM afbeelding WHERE id = " + fotoID.ToString();
                
                conn.Open();
                SqlCommand cmd2 = new SqlCommand(sqlString, conn);
                byte[] b = (byte[])cmd2.ExecuteScalar();
                if (b.Length > 0)
                {
                    System.IO.MemoryStream stream = new System.IO.MemoryStream(b, true);
                    stream.Write(b, 0, b.Length);
                    
                    if (Request.QueryString["maxWidth"] != null)
                    {
                        maxWidth = Int32.Parse(Request.QueryString["maxWidth"].ToString());
                    }
                    if (Request.QueryString["maxHeight"] != null)
                    {
                        maxHeight = Int32.Parse(Request.QueryString["maxHeight"].ToString());
                    }

                    stream = thumbnail(stream, maxHeight, maxWidth);
                    Response.BinaryWrite(stream.ToArray());
                }
                conn.Close();
            }
        }
    
        public MemoryStream thumbnail(MemoryStream input, Int32 maxHeight, Int32 maxWidth)
        {
            MemoryStream result = new MemoryStream();
            Int32 x, y;
            float r;

            Bitmap bmp = new Bitmap(input);

            x = bmp.Width;
            y = bmp.Height;

            r = (float)x / y;

            if (x > maxWidth)
            {
                x = maxWidth;
                y = (int)Math.Round(maxWidth / r);
            }

            /*
            if (x > y)
            {
                if (y > maxHeight)
                {
                    y = maxHeight;
                    x = (int)Math.Round(maxHeight * r);
                }
            }
            else
            {
                if (x > maxWidth)
                {
                    x = maxWidth;
                    y = (int)Math.Round(maxWidth * r);
                }
            }
            */

            Bitmap bmp2 = new Bitmap(bmp, x, y);

            bmp2.Save(result, System.Drawing.Imaging.ImageFormat.Jpeg);

            return result;
        }

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je HTTP headers staan waarschijnlijk niet goed, hoe ziet je .aspx er uit? Want je returnt een binary blob, en wellicht heb je een html tag staan in de .aspx, waardoor er een HTML header gestuurd wordt en daarna je blob wat fout gaat.

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


Verwijderd

Topicstarter
EfBe schreef op 04 juli 2004 @ 15:50:
Je HTTP headers staan waarschijnlijk niet goed, hoe ziet je .aspx er uit? Want je returnt een binary blob, en wellicht heb je een html tag staan in de .aspx, waardoor er een HTML header gestuurd wordt en daarna je blob wat fout gaat.
Hmm, ik zag net dat ik nog een aantal HTTP headers had staand in de aspx, niet in aspx.cs, die heb ik weggehaald, had ik natuurlijk al moeten doen, nu kom ik wel iets verder, wat blijkt de data uit de database is null, of te wel het opslaan gaat dus niet goed, het ligt niet aan de output kan, want er is niets uit te putten.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Ik lees ook niet goed, je kunt wel weer merken dat het zondag is.

[ Voor 255% gewijzigd door eghie op 04-07-2004 19:33 ]


Verwijderd

Topicstarter
ik had het ook wel afgekund met de bmp die ik daarvoor gebruik, ik gebruik hem puur om te resizen, maar daar gaat het eigenlijk uberhaupt niet om, het gaat op dit moment om het opslaan dat gaat mis.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Wellicht wat een rare opmerking, maar waarom staat de data niet in een image field? nu heb je een fixed sized blob van beperkte lengte.

Heeft de data die je schrijft wel een lengte? (dus is de byte[] array van een zekere grootte?)

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


Verwijderd

Topicstarter
hij wordt opgeslagen in een image, en ja de byte[] heeft wel een grootte, want bij het gewone opslaan op de andere manier gaat het wel goed.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

Vergelijk eens met Profiler wat je met beide varianten binnenkrijgt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 04 juli 2004 @ 20:08:
hij wordt opgeslagen in een image, en ja de byte[] heeft wel een grootte, want bij het gewone opslaan op de andere manier gaat het wel goed.
Als hij wordt opgeslagen in een image field in je db, moet je Image als DbType opgeven voor je parameters, niet binary.

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


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

EfBe schreef op 04 juli 2004 @ 20:17:
[...]

Als hij wordt opgeslagen in een image field in je db, moet je Image als DbType opgeven voor je parameters, niet binary.
Binary zou eigenlijk ook gewoon moeten werken, omdat het eig ook gewoon data is. Trouwens bij die byte array zitten de image headers ook al in en mischien is er de kans dat een image in een database er nog extra headers bijgooit/aanpast en dat kun je beter niet hebben. Ik weet verder niet hoe de database ermee omgaat hoor.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
eghie schreef op 04 juli 2004 @ 21:01:
Binary zou eigenlijk ook gewoon moeten werken, omdat het eig ook gewoon data is. Trouwens bij die byte array zitten de image headers ook al in en mischien is er de kans dat een image in een database er nog extra headers bijgooit/aanpast en dat kun je beter niet hebben. Ik weet verder niet hoe de database ermee omgaat hoor.
Nee dat blijkt :)
Binary is een fixed size binary field met een beperkte lengte. Image is een variable binary field met dus een variabele lengte. Er worden geen image headers bijgegooid, Image type is dus gewoon een BLOB. Omdat hij een verkeerd type opgeeft in de parameter kan het fout gaan, maar zeker weten doe ik dat niet, echter het zou me niet verbazen. Echter weten we dermate weinig over de toestanden tijdens de execution dat er weinig te zeggen valt waar het fout zit. Ik denk dat de TS eens een debugger moet opstarten of eens wat asserts moet gaan plaatsen om de verschillende stappen in het process nader te checken.

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


Verwijderd

Topicstarter
Nou dat was het dus wel, in de stored procedure had ik gekozen voor binary, dit had natuurlijk (STOM STOM) image moeten zijn, nu werkt dit prima, pfff bedankt voor de hulp
Pagina: 1