Tags: , | Categories: VB.Net, Entity Framework, SQL Posted by Christoph on 5/28/2010 6:44 PM | Comments (0)

Man kann natürlich auch TSQL mit dem Entity Framework direkt benutzen.

Das ganze funktioniert folgendermaßen:

Dim Con As EntityClient.EntityConnection = Ctx.Connection
Dim Conn = Con.StoreConnection
Dim Stat = Conn.State

If Not Stat = ConnectionState.Open Then Conn.Open()

Using Cmd = Conn.CreateCommand
	Cmd.CommandText = Sql.ToString
	Cmd.ExecuteNonQuery()
End Using

If Not Stat = ConnectionState.Open Then Conn.Close()
Tags: | Categories: ASP.Net, VB.Net Posted by Christoph on 5/17/2010 3:12 PM | Comments (0)

Wenn Sonderzeichen, die z.B. aus einem Silverlight-Control kommen, noch numerische HTML Entities haben, also sowas wie “ü”, kann man das mit folgender Funktion in echte ANSI Zeichen konvertieren:

Public Shared Function CleanNumericEntities(ByVal InText As String) As String
    Return Regex.Replace(InText, "&#\d{3};", New MatchEvaluator(AddressOf ReplaceNumericHTML))
End Function

Private Shared Function ReplaceNumericHTML(ByVal Ma As Match) As String
    Dim Val = Ma.Value.Substring(2, 3)
    If IsNumeric(Val) Then Return Chr(Val)
    Return "?"
End Function
Tags: | Categories: Silverlight, VB.Net Posted by Christoph on 1/15/2010 11:58 AM | Comments (0)

in einem Silverlight Projekt hatten wir die Notwendigkeit, eine Textbox zu benutzen, die nur die Eingabe einer Fliesskommazahl (in dem Fall eines Währungwertes) zu erlauben.

Da wir nicht dringend eine externe Komponente einsetzen wolllten habe ich das Problem mit folgendem Code gelösst:

Dabei wird im New-Event des Controls ein KeyDown-Event an die Textbox gebunden, der bei jesem Tastendruck überprüft, ob es ein für eine Fliesskommazahl gültiges Zeichen ist.

Leider ist das “,” nicht in der Key Enumeration, und muss händisch über den KeyCode abgehandelt werden. Dabei ist zu beachten, dass das “,” in 3 Varianten abgefragt werden muss: normales “,”, Zehnertastatus und auf dem Mac gibts (wie sollte es anders sein) einen anderen Zahlencode für das “,”.

und hier der Codesnippet:

Public Sub New()
	InitializeComponent()
	AddHandler tbTbx.KeyDown, AddressOf OnlyNumbers
End Sub



Public Sub OnlyNumbers(ByVal sender As Object, ByVal e As KeyEventArgs)

	Select Case e.Key

		Case Key.Tab
			Return

		Case Key.D0
		Case Key.D1
		Case Key.D2
		Case Key.D3
		Case Key.D4
		Case Key.D5
		Case Key.D6
		Case Key.D7
		Case Key.D8
		Case Key.D9

		Case Key.NumPad0
		Case Key.NumPad1
		Case Key.NumPad2
		Case Key.NumPad3
		Case Key.NumPad4
		Case Key.NumPad5
		Case Key.NumPad6
		Case Key.NumPad7
		Case Key.NumPad8
		Case Key.NumPad9

		Case Key.Decimal				' ,

		Case Else

			Select Case e.PlatformKeyCode
				Case 188, 110, 43 ' ",", ", Numpad" , ", Mac"
					If tbTbx.Text.IndexOf(",") > -1 Then
						e.Handled = True
						Return
					End If

				Case Else
					e.Handled = True
					Return

			End Select

	End Select

End Sub
Tags: , , | Categories: ASP.Net, VB.Net Posted by Christoph on 10/16/2009 3:28 PM | Comments (0)

Für die Benutzung von SEO freundlichen URLs (Search Engine Optimisation) benutze ich das URL Rewriting Modul des IIS (-> http://www.iis.net/extensions/URLRewrite).

Wenn nun ein Datapager z.B. an ein Listview Control gebunden wird, benutzt dieser leider als Linkadresse nicht die “schöne” URL, sondern die aus dem Rewriting entstehende URL.

Man kann dem Datapager aber mit dieser Funktion die neuen (schönen) Links beibringen:

Private Sub FixPagerURLs(ByVal Pager As DataPager)
    For Each Pag As DataPagerFieldItem In Pager.Controls
        For Each Ctrl In Pag.Controls
            If TypeOf Ctrl Is HyperLink Then
                Dim Hyp As HyperLink = Ctrl

                Dim Req = Hyp.NavigateUrl.Replace(Request.Path, "").Replace("?", "")
                Dim Params = Req.Split("&")
                Dim NewPage = (From item In Params Where item.StartsWith("page")).FirstOrDefault

                Dim URL = Request.RawUrl
                If URL.Contains("?") Then URL = URL.Substring(0, URL.IndexOf("?"))

				If NewPage = "page=1" Then
					Hyp.NavigateUrl = URL
				Else
					Hyp.NavigateUrl = String.Concat(URL, "?", NewPage)
				End If

            End If
        Next
    Next
End Sub

und den dann im DataBound Event des Listview aufrufen:

FixPagerURLs(dpProducts)

Die Idee dazu habe ich von dieser Webseite:
http://blog.anasghanem.com/post/Programmatically-Modifying-the-HyperLinks-in-the-DataPager-control.aspx

Tags: | Categories: VB.Net Posted by Christoph on 5/22/2009 6:18 PM | Comments (0)

Wenn man eine List(of Integer) in ein String umwandeln möchte, benötigt man zuerst einen Helper, der die Formatierung eines einzelnen Items vornimmt:

Private Shared Function I2S(ByVal Nummer As Integer) As String
Return Nummer.ToString
End Function

und diesen kann man dann benutzen, um eine komplette Liste in das gewünschte Zielformat zu konvertieren:

Dim Arr1 as New List(of Integer)
Dim Arr2 As List(Of String) = Arr1.ConvertAll(New Converter(Of Integer, String)(AddressOf I2S))
Return String.Join(", ", Arr2.ToArray)
Tags: | Categories: ASP.Net, VB.Net Posted by Christoph on 4/7/2009 1:14 PM | Comments (0)

Wenn man Daten über eine Webseite zu Excel exportieren will, geht das eigentlich ganz einfach, indem man eine HTML Seite ausgibt, die eine Tabelle enthält, und dann den Contentyp setzt.

Dazu kann man noch den Tabellenzellen bestimmte CSS Attribute mitgeben, so dass die dann von Excel auch passent erkannt werden.

Hier mal ein ganz grober Dummy, der aber das Vorgehen veranschaulicht:

Response.Clear()Response.ClearHeaders()Response.ContentEncoding = Encoding.DefaultResponse.Buffer = TrueResponse.ContentType = "application/vnd.ms-excel"Response.AddHeader("Content-Disposition", "inline; filename=Statistik.xls")Dim Out As New StringBuilderOut.Append("<html>")Out.Append("<style>")Out.Append("body,th,td{font-size:10px;font-family:arial;color:black;}")Out.Append("table{mso-displayed-decimal-separator:""\,"";mso-displayed-thousand-separator:""\."";}")Out.Append("td{padding-top:1px;padding-right:1px;padding-left:1px;mso-ignore:padding;color:black;font-size:10.0pt;font-weight:400;font-style:normal;text-decoration:none;font-family:Calibri,sans-serif;mso-font-charset:0;mso-number-format:General;text-align:left;vertical-align:top;mso-background-source:auto;mso-pattern:auto;white-space:normal;}")Out.Append(".th{background:#d8d8d8;font-size:10px;font-family:arial;color:black;mso-pattern:black none;}")Out.Append(".date{mso-number-format:""Short Date"";}")Out.Append("</style>")Out.Append("<body>")Out.Append("<table>")Out.Append("<tr>")Out.Append("<td class='.date' align='left'>7.4.2009</th>")Out.Append("</tr>")Out.Append("</table>")Out.Append("</body>")Out.Append("</html>")Response.Write(Out.ToString)Response.End()

Folgende Formatierungsmöglichkeiten hat man für mso-number-format:

"0" NO Decimals "0\.000" 3 Decimals "\#\,\#\#0\.000" Comma with 3 dec "mm\/dd\/yy" Date7 "mmmm\ d\,\ yyyy" Date9 "m\/d\/yy\ h\:mm\ AM\/PM" D -T AMPM "Short Date" 01/03/1998 "Medium Date" 01-mar-98 "d\-mmm\-yyyy" 01-mar-1998 "Short Time" 5:16 "Medium Time" 5:16 am "Long Time" 5:16:21:00 "Percent" Percent - two decimals "0%" Percent - no decimals "0\.E+00" Scientific Notation "\@" Text "\#\ ???\/???" Fractions - up to 3 digits (312/943) "\0022£\0022\#\,\#\#0\.00" £12.76 "\#\,\#\#0\.00_ \;\[Red\]\-\#\,\#\#0\.00\ " 2 decimals, negative numbers in red and signed (1.56   -1.56) 
Tags: , | Categories: LINQ, VB.Net, XML Posted by Christoph on 3/17/2009 11:47 AM | Comments (0)

Ich hatte das Problem, zu einem bestehenden XML noch weitere Elemente hinzufügen zu müssen. Das XML war als String im System vorhanden, und da hab ich das ganze per LINQ gelösst:

Als erstes muss folgender Namespace als Referenz im Projekt eingebunden, und in der entsprechenden Klasse importiert sein:

Imports System.Xml.Linq

und dann funktioniert das ganze recht einfach so:

Dim Doc As XDocument = XDocument.Parse(XmlString)Dim Root As XElement = Doc.Element("root")Dim xNewElement As New XElement("newnode")xNewElement.Value = MyValuexNewElement.SetAttributeValue("id", MyID)Root.AddxNewElementReturn Doc.ToString
Tags: , , | Categories: Entity Framework, VB.Net, Visual Stutio Posted by Christoph on 2/2/2009 8:12 PM | Comments (0)

Neulich hatte ich das Problem, dass ich hier lokal auf dem SQL Server 2008 entwickel, aber unsere Livesysteme noch den SQL Server 2005 haben.

Das ist im grossen und ganzen ja kein Problem, allerdings versucht das Mapping-Tool vom Entity Framework immer das Datenbankschema zu benutzen, dass bei der Entwicklung benutzt worden ist, wass dann zu solchen Fehlern führt:

  1. Serverfehler in der Anwendung /.   
  2. Die verwendete SQL Server-Version unterstützt nicht den Datentyp 'datetime2'.   
  3. Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.   
  4.   
  5. Ausnahmedetails: System.ArgumentException: Die verwendete SQL Server-Version unterstützt nicht den Datentyp 'datetime2'.  

Man kann aber das Visual Studio auch dazu bringen, den Code für den 2005’er zu kompilieren, indem man das .edmx im Texteditor öffnet, und ganz am Anfang das Attribut ProviderManifestToken von “2008” zu “2005” ändert. neu Builden, und … na meistens kommt dann so ein Fehler:

  1. Serverfehler in der Anwendung /.   
  2. --------------------------------------------------------------------------------   
  3.   
  4. Das angegebene Schema ist ungültig. Fehler:    
  5. Model1.ssdl(108,6) : Fehler 0040: Typ date ist nicht mit einem Namespace oder Alias qualifiziert. Nur PrimitiveTypes können ohne Qualifizierung verwendet werden.   
  6. Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.    
  7.   
  8. Ausnahmedetails: System.Data.MetadataException: Das angegebene Schema ist ungültig. Fehler:    
  9. Model1.ssdl(108,6) : Fehler 0040: Typ date ist nicht mit einem Namespace oder Alias qualifiziert. Nur PrimitiveTypes können ohne Qualifizierung verwendet werden.   
  10.   
  11. Quellfehler:    
  12.   
  13. Beim Ausführen der aktuellen Webanforderung wurde einen unbehandelte Ausnahme generiert. Informationen über den Ursprung und die Position der Ausnahme können mit der Ausnahmestapelüberwachung angezeigt werden.    

Tataaaaa…. jetzt muss man noch (wieder im .edmx und per Textedior ) alle Type="date” in Type="datetime" ändern, und dann sollte es aber funktionieren.

Ich habe diesen Tipp hier gefunden

Tags: , | Categories: Entity Framework, LINQ, VB.Net Posted by Christoph on 1/15/2009 12:34 PM | Comments (0)

In einem Projekt benutze ich das Microsoft Entity Framework um Daten aus der Datenbank an ein Gridview zu binden.

Nun will ich aber zeilenweise bestimmte Zellen ausblenden, wenn das Datenobjekt z.B. bestimmte Arten von Eigenschaften/Kindern hat.

Um im RowDataBound Handler des Gridview aber das jewilige Entity zu bekommen, benötigt man eine kleine Hilfsfunktion:

 

Public Function GetRowItem(Of TEntity As Class)(ByVal dataItem As Object) As TEntity    Dim Entity = TryCast(dataItem, TEntity)    If Entity IsNot Nothing Then Return Entity    Dim td = TryCast(dataItem, ComponentModel.ICustomTypeDescriptor)    If td IsNot Nothing Then Return DirectCast(td.GetPropertyOwner(Nothing), TEntity)    Return NothingEnd Function
Danach kann man dann in der RowDataBound folgenden Code benutzen, um die Entität (in meinem Fall fom Typ "Attribute”) zu bekommen:

 

Private Sub gvAttribs_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvAttribs.RowDataBound    If e.Row.RowType = DataControlRowType.DataRow Then        Dim Attrib = GetRowItem(Of Attribute)(e.Row.DataItem)		'-- Und hier gehts dann weiter ...    End IfEnd Sub

 

Ich habe diesen Hinweis im MSDN Social gefunden.

Categories: VB.Net Posted by Christoph on 12/3/2008 2:21 PM | Comments (1)

Wenn die im Filesystem liegenden Dateien nach dem Änderungsdatum sortiert ausgegeben werden sollen, muss man sich zuerst einen kleinen Helper schreiben, der die Sortierung übernimmt:

Public Class Sorter
	Implements IComparer
	Public Function CompareDesc(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
		Dim F1 As FileInfo = DirectCast(x, FileInfo)
		Dim F2 As FileInfo = DirectCast(y, FileInfo)
		CompareDesc = DateTime.Compare(F1.LastWriteTime, F2.LastWriteTime)
	End Function
End Class

dann kann man die Files folgendermassen sortieren und z.B. in einer Dropdown Liste ausgeben:

Dim Dir As New DirectoryInfo("d:\import")
Dim Files() As FileInfo = Dir.GetFiles("*.jpg")

Array.Sort(Files, New Sorter)

ddlFiles.Items.Clear()

For Each FI As FileInfo In Files
	ddlFiles.Items.Add(New ListItem(String.Format("{0:dd}.{0:MM}.{0:yy} {0:HH}:{0:mm} - {1}", FI.LastWriteTime, FI.Name), FI.FullName))
Next

Diesen Hinweis habe ich hier gefunden.