Mittwoch, 16. November 2011

Ein Gewinnspiel? Da mache ich doch mit!

Ich habe zwar keine Ahnung, ob ich mich als Comicfigur sehen will, doch kann ich einem solch ungewöhnlichem Gewinnspiel nicht widerstehen: Gewinnspiel!!! Again!

Aber auch ohne Gewinnaussicht will ich dieses Comicblog preisen: Katzenfuttergeleespritzer.

Anders als es der Name vermuten lässt geht es dort mehr um Schildkröten als um Katzen. Und um das Nerdiversum. Empfehlung!

PS: Auf Facebook folgen geht auch.

Dienstag, 27. September 2011

E-Mail mit Visual Basic.Net verschicken

Dieses Beispiel ist als Modul angelegt (da für eine Konsolenanwendung), kann aber fix auf OO-Programmierung geändert werden. In erster Linie will ich mir Sucherei ersparen.

  1. Imports mail = System.Net.Mail
  2.  
  3. Module EMail
  4.     Friend Function EMail(ByVal sAdressat, ByVal sBetreff, ByVal sText) As Boolean
  5.         Const csTrennzeichen As String = ";"
  6.         Dim oCredentials As New System.Net.NetworkCredential
  7.         Dim oClient As New mail.SmtpClient
  8.         Dim oEMail As New mail.MailMessage
  9.         Dim bReturn As Boolean
  10.         Dim asAdressen As String (), sAdresse As String
  11.  
  12.         bReturn = True
  13.         asAdressen = Split(sAdressat, csTrennzeichen)
  14.  
  15.         With oCredentials
  16.             .UserName = My.Settings.EMailUsername
  17.             .Password = My.Settings.EMailPasswort
  18.         End With
  19.  
  20.         With oClient
  21.             .Host = My.Settings.EMailSmtp
  22.             .Port = My.Settings.EMailSmtpPort
  23.             .UseDefaultCredentials = False
  24.             .Credentials = oCredentials
  25.         End With
  26.  
  27.         Try
  28.             With oEMail
  29.                 .IsBodyHtml = False
  30.                 .From = New mail.MailAddress (My.Settings.EMailAbsender)
  31.  
  32.                 For Each sAdresse In asAdressen
  33.                     .To.Add(sAdresse)
  34.                 Next
  35.  
  36.                 .Subject = sBetreff
  37.                 .Body = sText
  38.             End With
  39.  
  40.             oClient.Send(oEMail)
  41.  
  42.         Catch ex As Exception
  43.             Console .WriteLine("Fehler: " & ex.Message)
  44.             bReturn = False
  45.         End Try
  46.  
  47.         Return bReturn
  48.     End Function
  49. End Module
  50.  
  51.  

Info für mich: Liegt auf dem Asus im Projekteordner.

Freitag, 16. September 2011

Mit Visual Basic die IP-Adresse des eigenen Rechners ermitteln.

Diese Aufgabe stellte sich mir gerade. Im Internet fand ich zwei Lösungswege; der Weg über NetworkInformation erschien mir besser:

  1.  
  2. Imports N = System.Net.NetworkInformation
  3.  
  4. Module Module1
  5.  
  6.     Sub Main()
  7.         Dim aoAlleInterfaces() As N.NetworkInterface
  8.         Dim oInterface As N.NetworkInterface, oUnicastIpAdressInfoCollection As N.UnicastIPAddressInformationCollection
  9.         Dim iAnzahl As Integer , iZaehler As Integer , oUnicastIpAdressInfo As N.UnicastIPAddressInformation
  10.  
  11.         Console.WriteLine("Start" )
  12.  
  13.         aoAlleInterfaces = N.NetworkInterface.GetAllNetworkInterfaces
  14.  
  15.         For Each oInterface In aoAlleInterfaces
  16.             oUnicastIpAdressInfoCollection = oInterface.GetIPProperties().UnicastAddresses
  17.             iAnzahl = oUnicastIpAdressInfoCollection.Count
  18.             For iZaehler = 0 To iAnzahl - 1
  19.                 oUnicastIpAdressInfo = oUnicastIpAdressInfoCollection(iZaehler)
  20.                 If oUnicastIpAdressInfo.Address.AddressFamily = Net.Sockets.AddressFamily.InterNetwork Then
  21.                      Console.WriteLine("Treffer" )
  22.                     Console.WriteLine(oUnicastIpAdressInfo.Address.ToString)
  23.                 End If
  24.  
  25.              Next
  26.          Next
  27.  
  28.          Console.WriteLine("Ende" )
  29.         Console.ReadKey()
  30.     End Sub
  31.  
  32.  End Module

Als Vorbild diente ein Beispiel von Justus Bisser. Seine Lösung ist in C# geschrieben und nutzt LINQ; zur Anschauung habe ich es aufgedröselt.

Mittwoch, 6. Juli 2011

Hinzufügen einer NOT-NULL-Spalte zu einer bestehenden, gefüllten Tabelle

Was tun, wenn eine neue Spalte zu einer Tabelle hinzugefügt werden soll, diese neue Spalte keine NULL-Werte enthalten darf, doch die Tabelle bereits Datensätze enthält? Eine schlichte "ALTER TABLE"-Anweisung lässt der MS SQL Server nicht zu.

Die Lösung ist schlicht, aber wie mir im I-Net auffiel nicht für jeden gleich offensichtlich.

Bei mir eine aktuelle Aufgabe: Gegeben ist eine Tabelle "Hersteller", welche schon Datensätze enthält. Hinzugefügt werden soll eine Spalte mit dem Namen "AutoAnlegen" vom Datentyp "bit", welche keine NULL-Werte enthalten darf und als Standard auf "false" steht. Die Umsetzung erfolgt in drei Schritten:

  1.  ALTER TABLE Hersteller
  2.     ADD AutoAnlegen bit DEFAULT 0
  1.  Update Hersteller SET AutoAnlegen = 0
  1.  Alter Table Hersteller
  2.     Alter Column AutoAnlegen bit Not NULL

Mittwoch, 15. Juni 2011

Tool zur Erstellung der 'stored procedures' für Sortierungen

Hinweis:
Dieser Beitrag macht nur für mich Sinn; nicht wundern.

Das Tool SortierungStoredProcedureBuilder erstellt die vier für die Sortierung nach Art des Hauses benötigten 'stored procedures' bereit.
Die benötigten Parameter sind aus der Abbildung ersichtlich.

Abbildung zeigt Userinterface (Ausschnitt)
Die Eingabefelder des Tools.

Speicherort

VB-Projekte Juni 2011; Asus

Programm

Das Programm liegt in der "Hermann Leopold"-Suite.

Samstag, 11. Juni 2011

Ordnen der Datenbank-Sortierung nach Art des Hauses via Stored Procedure

Hinweis:
Dieser Beitrag macht nur für mich Sinn; nicht wundern.

Diese Stored Procedure ist ein Muster für die Neuordnung der "Sortierung"-Spalte nach einer Umsortierung. Die Namen des Schemas, der Tabelle und der Sortierungsspalte sind fix, da dynamisches SQL lt. diverser Autoren Performanceeinbußen bringt.
Da hingegen das Datenbankdesign bezüglich der Sortierung unveränderlich ist, sollte pro Tabelle eine Stored Procedure keine unüberwindliche Hürde darstellen.

Das "Create"-Statement

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5.  
  6. -- =============================================
  7. -- Author: Hermann J. Leopold
  8. -- Create date: 09.6.2011
  9. -- Description: Glättet die Sortierungsspalte
  10. -- =============================================
  11. CREATE PROCEDURE [dbo].[spGlaetteSortierung]
  12. AS
  13. BEGIN
  14. -- SET NOCOUNT ON added to prevent extra result sets from
  15. -- interfering with SELECT statements.
  16. SET NOCOUNT ON;
  17.  
  18.      -- temporäre Tabelle
  19. DECLARE @Vorsortiert AS TABLE(ID bigint, Sortierung int)
  20. -- Daten in die temporäre Tabelle schreiben
  21. SELECT [ID], ROW_NUMBER() OVER (ORDER BY [Sortierung]) AS Sortierung
  22. INTO #Vorsortiert FROM [test1].[dbo].[Sortiertest]
  23. ORDER BY [Sortierung]
  24. -- Tabelle 'Sortiertest' aktualisieren
  25. UPDATE [test1].[dbo].Sortiertest
  26. SET [Sortiertest].[Sortierung] = #Vorsortiert.Sortierung * 2
  27. FROM #Vorsortiert
  28. INNER JOIN [Sortiertest] ON #Vorsortiert.ID = [Sortiertest].[ID]
  29. END
  30. GO
  31.  

Hinweis

Diese Stored Procedure ist nur ein Muster; es fehlt insbesondere jegliche Form von Fehlerbehandlung.

Die Tabelle zum obigen Beispiel

  1. USE [test1]
  2. GO
  3.  
  4. /****** Object: Table [dbo].[Sortiertest] Script Date: 06/11/2011 10:48:34 ******/
  5. SET ANSI_NULLS ON
  6. GO
  7.  
  8. SET QUOTED_IDENTIFIER ON
  9. GO
  10.  
  11. CREATE TABLE [dbo].[Sortiertest](
  12. [ID] [bigint] IDENTITY( 1, 1) NOT NULL,
  13. [Muster] [nchar]( 10) NULL,
  14. [Sortierung] [int] NOT NULL,
  15.   CONSTRAINT [PK_Sortiertest] PRIMARY KEY CLUSTERED
  16. (
  17. [ID] ASC
  18. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  19. ) ON [PRIMARY]
  20.  
  21. GO
  22.  

Speicherort

SQL-Scripte; Asus

SQLQuery3.sql

Dienstag, 7. Juni 2011

Einschraenkung

Hinweis:
Dieser Beitrag macht nur für mich Sinn; nicht wundern.

Im Prinzip wurde diese Klasse für die Update-Klasse geschrieben; es funktioniert aber auch für SELECT- oder DELETE-Statements. Keine besondere Raffinesse; es können jedoch mehrere
Einschränkungen mit AND oder OR verknüpft werden.

Der Nutzen steckt in der Kurzschreibweise: Dim x as new Einschraenkung(23) ergibt WHERE ID = 23

Ob es Sinn macht zeigt die Zukunft.

Stammnamespace

leopoldnet.tinytools.DatenbankTools

Speicherort

VB-Projekte Juni 2011; Asus

Beispiel:

  1. Imports tt = leopoldnet.tinytools.DatenbankTools
  2.  
  3. Module Module1
  4.  
  5.     Sub Main()
  6.         Dim oWhere As New tt.Einschraenkung(23)
  7.         Dim oFremdschluessel As _
  8.             New tt.Einschraenkung("FK_Muster" , 42)
  9.  
  10.         oWhere.und(oFremdschluessel)
  11.  
  12.         MsgBox(oWhere.toWhere)
  13.     End Sub
  14.  
  15. End Module

Montag, 6. Juni 2011

Tool für Textumwandlung.

Hinweis:
Dieser Beitrag macht nur für mich Sinn; nicht wundern.

Ein arg dreckiges Tool zum Umwandeln von Text in HTML liegt in der Hermann-Leopold-Suite: Der TextHtmlizer. Nichts für die große weite Welt, aber für die Shoptemplates doch sehr gut geeignet.

Speicherort:

VB-Projekte Juni 2011; Asus

Freitag, 3. Juni 2011

Tool für hübscheren Quellcode

Hinweis: Dieser Beitrag macht nur für mich Sinn; nicht wundern.

Ein kleines Tool zu Erstellen von schöneren Quellcodeangaben im Internet: Code2Html.

Das Tool bockt zwar mehr als ein Esel auf Red Bull und hat mehr Bugs als ein "Starship Troopers"-Film, aber dafür ist alles schön bunt.

Speicherort:VB-Projekte Mai 2011; Asus

Beispiel:

  1. #Region "Konstruktoren"
  2.      ''' <summary>
  3.      ''' Konstruktor
  4.      ''' </summary>
  5.      ''' <param name="iNummer">Die Nummer der Farbe</param>
  6.      ''' <param name="iRot">Der Wert für die Farbe "rot"</param>
  7.      ''' <param name="iGruen">Der Wert für die Farbe "grün"</param>
  8.      ''' <param name="iBlau">Der Wert für die Farbe "blau"</param>
  9.      ''' <remarks></remarks>
  10.      Public Sub New (ByVal iNummer As Integer , ByVal iRot As Integer , ByVal iGruen As Integer , ByVal iBlau As Integer )
  11.         With Me
  12.              .rot = iRot
  13.             .gruen = iGruen
  14.             .Blau = iBlau
  15.             .Nummer = iNummer
  16.         End With
  17.      End Sub

Samstag, 28. Mai 2011

SqlExceptionMeldung

Erstellt eine Meldung bei einem Ausnahmefehler während einer Datenbankaktion nach meinem üblichen Muster.

Stammnamespace
leopoldnet.LeoMeldungContainer

Speicherort
VB-Projekte Mai 2011; Asus

Beispiel

  1. Imports leo = leopoldnet.LeoMeldungContainer
  2. Imports System.Data.SqlClient
  3.  
  4. Public Class Class1
  5.     Sub x()
  6.         Dim sSql As String , oCmd As SqlCommand, oCn As SqlConnection
  7.         Dim oMeldung As leo.SqlExceptionMeldung
  8.         sSql = "Delete from Muster"
  9.          oCn = New SqlConnection("nixda" )
  10.         oCn.Open()
  11.         Try
  12.              oCmd = New SqlCommand(sSql, oCn)
  13.             oCmd.ExecuteNonQuery()
  14.         Catch ex As Exception
  15.             oMeldung = New leo.SqlExceptionMeldung
  16.             With oMeldung
  17.                 .Nachricht = "Fehler bei x"
  18.                  .Sql = sSql
  19.                 .ExceptionMeldung = ex.Message
  20.                 .Typ = leo.DarstellungTyp.Zeilenumbruch
  21.             End With
  22.              MsgBox(oMeldung.erstelleMeldung)
  23.         End Try
  24.          oCn.Close()
  25.     End Sub
  26.  End Class

Hinweis
Es existiert auch eine "shared"-Methode um auf eine Instanz verzichten zu können: erstelleSqlExceptionMeldung

Freitag, 27. Mai 2011

LeoMeldungContainer

Erstellt eine Meldung aus mehreren Zeichenketten nach meinem üblichen Muster.

Stammnamespace
leopoldnet.LeoMeldungContainer

Speicherort
Vb-Projekte Mai 2011; Asus

Beispiel

  1.  
  2. Imports leo = leopoldnet.LeoMeldungContainer
  3.  
  4. Public Class Class1
  5.     Sub muster()
  6.         Dim oMeldung As New _
  7.          leo.LeoMeldungContainer(leo.DarstellungTyp.HtmlListe)
  8.         With oMeldung
  9.             .addMeldung("Fehler im Muster" )
  10.             .addMeldung("SQL: " & "Select * From x" )
  11.             .addMeldung("Meldung: " & "ex.Message" )
  12.         End With
  13.          MsgBox("Meldung" , MsgBoxStyle.OkOnly, oMeldung.zeigeMeldungen)
  14.     End Sub
  15.  End Class

Hä? Ich werde alt!

Na Klasse.

Da schreibe ich den ganzen Tag eine Klasse, nur um festzustellen dass ich vor ca. 2,5 Jahren so etwas schon einmal gemacht habe. Mist.

Gut. Da ich dieses Blog eh nicht nutze, nutze ich es ab heute um meine eigenen Klassen für mich zu protokollieren.
Sowas habe ich zwar schonmal "offline" getan, aber die Liste ist auf irgend einem Rechner verschollen. Daher ab jetzt hier.

Nur zur Erläuterung.