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