SQL Server & ASP .NET Blog

Interessantes und Wissenswertes

Reimers Google Maps .NET Control

Ich spiele gerade ein wenig mit Google Maps herum – genauer gesagt mit dem Google Maps .NET Control von Reimers. Mit diesem Control ist es sehr einfach eine Google Map auf die eigene Seite zu bringen.

Kleines Beispiel:

<Reimers:GoogleMap ID="myGMap" width="100%" Height="100%" runat="server">
</Reimers:GoogleMap>

…dieses Markup genügt um eine Map auf der Seite anzuzeigen. Einen Center-Punkt und Zoom im Markup festzulegen ist auch kein Problem:

<Reimers:GoogleMap ID="myGMap" width="100%" Height="100%" runat="server" Zoom="7">
<Center Latitude="50" Longitude="10" />
</Reimers:GoogleMap>

Hinzufügen von Markern im Code-Behind funktioniert folgendermaßen. Der Code fügt einen Marker an Position 50, 10 ein. Außerdem wird ein InfoWindow definiert, welches sich beim Klick auf den Marker öffnet und das eingefügte HTML anzeigt.

GoogleMarker gm1 = new GoogleMarker("mrkClick", 50, 10);
gm1.ClientSideHandlers.OnClick = gm1.OpenInfoWindowHTML(myGMap, "<b>Hallo vom SQL-ASP-Blog!!!</b>");
myGMap.Overlays.Add(gm1);

…das sieht dann so aus:

marker

Das Control beherrscht auch eigene Callbacks, so dass man auf bestimmte Events reagieren kann. So können zum Beispiel Marker nur hinzugefügt werden, wenn eine bestimmte Zoomstufe erreicht ist etc. – alles ohne Neu laden der Seite.

Wie gesagt – ich spiele erst einmal ein wenig damit herum. Aufgefallen ist mir bisher, dass es anscheinend keine einfache Möglichkeit gibt das Control und gleichzeitig UpdatePanels auf einer Seite zu verwenden. Finde ich etwas schade…

Trotzdem ist das Control auf jeden Fall einen Blick wert, wenn man mal einfach eine Google Map auf eine Seite bringen möchte.

Zu finden gibt es das Google Maps .NET Control hier: http://www.reimers.dk/. Für den Download ist eine Anmeldung notwendig.

ASP .NET Bild Upload in SQL Server speichern

Hier noch einmal ein Beitrag, wie es möglich ist Bilder (oder auch andere Dateien) von einer ASP .NET Seite aus im SQL zu speichern.

Eigentlich habe ich das mit diesem (hier) Beitrag schon beschrieben, aber hier nochmal konzentriert nur auf das Thema “Bild hochladen und im SQL Server speichern”. Ob es nun Sinn macht die Datei als solches zu speichern oder nur einen Verweis (als Pfad) soll hier nicht diskutiert werden – die Antwort darauf ist sowieso meist: “Es kommt drauf an…” (außerdem gibt es für solche Zwecke zumindest ab SQL Server 2008 auch den FILESTREAM Datentyp)

Also los. Wie kann ein hochgeladenes Bild im SQL Server gespeichert und wieder abgerufen werden? Ganz einfach! In nur drei einfachen Schritten :-)

1. Webseite

Wir brauchen die entsprechende Webseite. Also erstelle ich eine neue im Visual Studio und fülle die Seite mit einem FileUpload Control und einem Button zum Upload (FileUpload1 und Button1).

file_upload_1

2. Datenbank

In der Datenbank brauchen wir eine Tabelle zum Speichern der Bilder

CREATE TABLE pictures
(
picture VARBINARY(MAX)
,Name VARCHAR(255) 
,AddedAt DATETIME
)

Die Spalte “picture” wird das eigentliche Bild enthalten, daher der Datentyp VARBINARY(MAX).

3. Datei speichern

Nun kommt die eigentliche “Arbeit”: Beim Klick auf “Upload” soll das Bild mit dem Dateinamen und dem Datum in der Datenbank gespeichert werden. Im Event Button1.Click füge ich folgenden Code hinzu:

protected void Button1_Click(object sender, EventArgs e)
{
//die Datei aus dem FileUpload Control 
Byte[] myFile;
myFile = FileUpload1.FileBytes;
//der Dateiname ohne Pfad
string myFileName;            
myFileName = System.IO.Path.GetFileName(FileUpload1.FileName);
//connection to sql server
SqlConnection con = new SqlConnection("Data Source=192.168.1.13;Initial Catalog=TestDB;User ID=sa;Password=blah");
//Insert Statement mit den entsprechenden Parametern
SqlCommand cmd = new SqlCommand("INSERT INTO pictures VALUES (@picture, @name, GETDATE())", con);
//Parameter für das Bild an sich
SqlParameter paramPicture = new SqlParameter("@picture", System.Data.SqlDbType.VarBinary);
paramPicture.Value = myFile;
cmd.Parameters.Add(paramPicture);
//Parameter für den Dateinamen
SqlParameter paramFilename = new SqlParameter("@name", System.Data.SqlDbType.VarChar);
paramFilename.Value = myFileName;
cmd.Parameters.Add(paramFilename);
//Verbindung öffnen und INSERT ausführen (Achtung, kein Exception-Handling)
con.Open();
cmd.ExecuteNonQuery();
con.Close();     
}

Ich denke der Code ist so verständlich, dass ich diesen hier nicht näher erläutern muss. Fragen natürlich immer gern :-)

Ruft man nun die Webseite auf, wählt eine Datei und klickt auf Upload wird diese im SQL Server gespeichert, was dann so aussieht:

picture_2

Nun ist die Datei erst einmal im SQL Server. Wie man diese dann auch wieder da heraus bringt um bspw. das Bild anzuzeigen schreibe ich später nochmal. (das habe ich inzwischen  [hier] getan.)

Berechtigungen für Windows UserControl vergeben (caspol)

Das Screenshot-Usercontrol aus dem letzten Post wird wahrscheinlich nicht laufen, wenn es keine entsprechende Berechtigung hat. Das resultiert dann in einer solchen (oder so ähnlichen) Fehlermeldung:

07_Fehler

Um der Assembly, oder besser gesagt allen Assemblys die auf Webseiten in den Vertrauenswürdigen Sites (Trusted_Zone) laufen diese Rechte zu geben kann das Kommandozeilentool caspol.exe verwendet werden. Zu finden ist es unter “%Windir%\Microsoft.NET\Framework\v2.0.50727\

08_caspol

ACHTUNG! Mit dem im Screenshot gezeigten Befehl bekommen alle Assemblys in der Trusted_Zone alle  Rechte auf dem Computer. Für Tests genügt das sicherlich, für den Einsatz in der Praxis sollte die Berechtigungsvergabe differenzierter gestaltet werden :-)

Windows Usercontrol in ASP .NET Seite verwenden

Manchmal ist es nützlich Windows-Controls auf ASP .NET Seiten zu verwenden, beispielsweise, weil eine bestimmte Funktionalität gebraucht wird, die mit ASP oder JavaScript nicht oder nur sehr schwer umzusetzen ist.

Schonmal versucht einen Screenshot aus der Zwischenablage zu lesen um diesen dann in der Datenbank zu speichern? Mit ASP und JavaScript kenne ich keinen Weg, wie das zu machen ist, daher hier ein kurzes Tutorial, wie es durch das Einbinden eines Windows Usercontrol funktioniert. Selber ausgedacht habe ich mir das natürlich nicht, allerdings einige Male geschwitzt beim Implementieren :-) Daher hier noch einmal ausführlich. (Infos von [hier]und [hier] ).

Vorteile

  • es können Funktionen verwendet werden, die sonst via ASP .NET oder JavaScript nicht zur Verfügung stehen (Dateisystem auf dem Clientcomputer/Zwischenablage etc.)

Nachteile

  • funktioniert nur mit dem Internet-Explorer
  • für bestimmte Funktionen müssen der erstellten Assembly die entsprechenden Rechte vergeben werden 

Screenshot Usercontrol erstellen 

Zuerst öffne ich ein neues Projekt in Visual Studio, und zwar eine Windows Forms Control Library. 



Da ich einen Screenshot direkt im Browser machen möchte, nenne ich das Projekt der Einfachheit halber "Screenshot".

Das automatisch dem Projekt hinzugefügte Usercontrol nenne ich ebenso Screenshot. Dies wird das Control sein, mit dem später der Screenshot "aufgenommen" und gespeichert wird.


Um den Screenshot auf dem Usercontrol anzeigen zu können füge ich eine Picturebox (pbScreenshot), und als Hinweis noch ein Label (lblHinweis) zur Beschriftung hinzu. Das Ganze sieht dann so aus (also noch nicht wirklich spektakulär :-)): 


Die Form soll also heißen: "Wenn du mich anklickst und ein Bild in der Zwischenablage hast, dann zeig ich dir das an!". Durch Doppelklick auf die PictureBox lege ich den EventHandler an.

private void pbScreenshot_Click(object sender, EventArgs e)
{
if (System.Windows.Forms.Clipboard.ContainsImage()) //wenn im clipBoard ein Bild ist
{                
pbScreenshot.Image = System.Windows.Forms.Clipboard.GetImage(); //Bild anzeigen
lblHinweis.Visible = false;  //Hinweis unsichtbar
} 
else
{
MessageBox.Show("Kein Bild in der Zwischenablage!");   //Kein Bild => Hinweis
}
}

Ich denke der Quelltext ist selbstsprechend :-) Auf jeden Fall kann man nun bereits einen Screenshot auf das UserControl bringen. (Druck auf F5 und ausprobieren) Mehr...