Avatar billede hilton2305 Nybegynder
13. januar 2005 - 22:38 Der er 7 kommentarer

Billede til og fra sql med ASP.NET

Er der nogle der ligger inde med et par kodestumper der viser hvordan man gemmer et billede i sql, og henter det ud igen. Og kan man vise et billede hentet fra sql'en, uden at man først skal gemme det på serveren?
Avatar billede snepnet Nybegynder
13. januar 2005 - 22:46 #1
hej hilton... der er mange der har skrevet om det.
du kan se et eksempel her :
http://www.dotnetbips.com/displayarticle.aspx?id=60
Spørg endelig løs hvis der er noget.

mvh
Avatar billede snepnet Nybegynder
13. januar 2005 - 22:49 #2
det der er det lidt specielle ved det, er nok det med at du bliver nødt til at have en slags "imageserver". altså en side der angiver content-type til et billede, og så bare hælder de rå bytes ud i response-streamen.
du kan så (på en anden side) sætte et billede ind, og sætte en url med en parameter, der så peger på "imageserveren".
mvh
Avatar billede hilton2305 Nybegynder
16. januar 2005 - 15:04 #3
Først tak for det hurtige svar. Linket ser fint ud, men jeg har ikke forklaret min problemstilling ordentligt (sorry). Jeg skal hente en række billeder ind i en datalist, hvor jeg skal vise dem med andre informationer. Hvordan kan jeg få billederne ind i en datalist fra sql databasen?
Avatar billede snepnet Nybegynder
16. januar 2005 - 16:51 #4
ahhh.... du kan sørge for at sætte din ImageUrl på dine billeder på denne form :
ImageUrl="ImageServer.aspx?ImageId="+someImageId

og så kan din ImageServer så være bygget op som vist i eksemplet ... altså f.eks. en page_load som følger :

private void Page_Load(object sender, System.EventArgs e)
{
    SqlConnection connection = new SqlConnection(Settings.ConnectionString);
    SqlCommand command = new SqlCommand("select ContentType, [Data] from [Image] where ImageId = " + ImageId, connection);
    connection.Open();
    SqlDataReader dr = command.ExecuteReader();
    if(dr.Read())
    {
        Response.ContentType = dr["ContentType"].ToString();
        Response.BinaryWrite( (byte[]) dr["Data"] );
    }
    connection.Close();
}

En lille eksempelside kunne være sådan her :
<body>
    <form id="Form1" method="post" runat="server">
        <asp:DataList id="SomeList" runat="server">
            <ItemTemplate>
                <asp:Image id="someImage" runat="server" ImageUrl='<%# GetImageUrl((int) DataBinder.Eval(Container, "DataItem.ImageId")) %>'>
                </asp:Image>
            </ItemTemplate>
        </asp:DataList>
    </form>
</body>

Bemærk at du skal skal implementere en metode der returnerer dig linket - f.eks. sådan her :

protected string GetImageUrl(int imageId)
{
    return "ImageServer.aspx?ImageId=" + imageId;
}       

Du må sige til hvis der er noget af det der er tåget... Så kan jeg evt. lægge noget kode du kan kopiere ind direkte.
(i den forbindelse må du gerne lige skrive hvad du udvikler i... VS.NET WebMatrix eller hvad det nu er + om du helst skriver aspx-kode, eller om du bedre kan lide at have funktionaliteten i din code-behind).

Mvh
Avatar billede hilton2305 Nybegynder
30. januar 2005 - 21:08 #5
Beklager meget den lange svartid fra min side, der har været lidt tryk på. Jeg kunne godt tænke mig lidt copy-paste kode hvordan man gemmer et billede i sql og hvordan man hiver det ud igen. Jeg bruger VS 2003, og bruger som regel code-behind.
Avatar billede snepnet Nybegynder
31. januar 2005 - 17:45 #6
hej hilton :o)

det er vel sådan set copy/paste du fik til det med at sætte billeder ind i en liste, men kan du ikke spørge specifikt til eksemplet, hvis der er noget af det du er i tvivl om ?

mht. til det med at gemme billeder :

Hvis du bruger en sql-server, kunne du lave dig et setup som følger :

// tabel til billeder
[ImageId] [int] IDENTITY (1, 1) NOT NULL ,
[ContentType] [nvarchar] (4) NULL,
[Name] [nvarchar] (50),
[Size] [int] NULL,
[Data] [image] NULL

// og en procedure til at indsætte et billede
CREATE PROCEDURE dbo.InsertImage
(
    @ContentType nvarchar(4),
    @Name nvarchar(50),
    @Size int,
    @Data image
)
AS
    SET NOCOUNT OFF;
INSERT INTO Image(ContentType, Name, Size, Data) VALUES (@ContentType, @Name, @Size, @Data);
    SELECT @@IDENTITY

Så kan du fra din kode gøre noget i denne stil :

public int InsertImage(string contentType, string name, int size, byte[] image)
{
        SqlConnection connection = new SqlConnection(Settings.ConnectionString);
        SqlCommand insertCommand = new SqlCommand("InsertImage", connection);
        insertCommand.CommandType = CommandType.StoredProcedure;
       
        insertCommand.Parameters["@ContentType"].Value = contentType;
        insertCommand.Parameters["@Name"].Value = name;
        insertCommand.Parameters["@Size"].Value = size;
        insertCommand.Parameters["@Data"].Value = image;

        insertCommand.Connection.Open();
        int imageId = Convert.ToInt32(insertCommand.ExecuteScalar());
        insertCommand.Connection.Close();
        return imageId;
}

Du får så id'et på billedet med tilbage... Det kan nogle gange være praktisk.

mvh
Avatar billede snepnet Nybegynder
07. september 2005 - 18:15 #7
hvordan går det her?
(et svar hvis noget kunne bruges)
mvh
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