Ralf Hüsing

September 26, 2008

Den Inhalt aller Tabellen einer Microsoft SQL-Datenbank löschen

Abgelegt unter: Programmierung, SQL — ralf @ 11:42 pm

Mit folgendem TSQL-Script wird der Inhalt aller in der aktuellen Datenbank vorhandenen Benutzer-Tabellen gelöscht:

Sollte TRUNCATE TABLE wg. Referenzen oä. nicht funktionieren kann es durch das etwas langsamere DELETE FROM ersetzt werden.

Bevor man das Script ausführt sollte man mehrfach Prüfen das man in der richtigen Datenbank / auf dem richtigen SQL Server ist.

DECLARE @table varchar(128)

DECLARE CUR CURSOR FOR
SELECT sysobjects.name FROM sysobjects WHERE type = 'U'

OPEN CUR

FETCH NEXT FROM CUR INTO @table

WHILE @@FETCH_STATUS = 0
BEGIN
	EXECUTE ('TRUNCATE TABLE [' + @table + ']')
	FETCH NEXT FROM CUR INTO @table
END

CLOSE CUR
DEALLOCATE CUR

August 6, 2008

Visual Basic 6 - Dezimal nach Hexadezimal und Dezimalzahlen in Hexadezimalzahlen konvertieren

Abgelegt unter: Programmierung — ralf @ 6:21 pm
' /**
' Konvertiert Dezimal Zahlen in Hex
' **/
Public Property Get pDec2Hex(lDec As Long, Optional ByVal lLength As Long = 4, Optional sPrefix As String = "0x") As String
  Dim sHex    As String
  Dim lHexLen As Long

  sHex = Hex(lDec)

  lHexLen = Len(sHex)

  If lLength < 0 Then lLength = 0

  If lHexLen < lLength Then
    sHex = String(lLength - lHexLen, "0") & sHex
  End If

  sHex = sPrefix & sHex

  pDec2Hex = sHex
End Property

' /**
' Hexadezimal nach Dezimal
' @bug: Es werden alle Zeichen in sHex verarbeitet bis zum zeichen ende oder zum ersten ungültigen Zeichen.
'       Beispiel: "0xFFz" ergibt 255
' **/
Public Property Get pHex2Dec(ByVal sHex As String, Optional sPrefix As String = "0x") As Long
  Dim lPrefix As Long

  lPrefix = Len(sPrefix)

  If Left(sHex, lPrefix) = sPrefix Then
    sHex = Mid(sHex, lPrefix + 1)
  End If

  On Local Error Resume Next

  pHex2Dec = CLng(Val("&H" & sHex))
End Property

Mai 3, 2008

Sichten und Vernichten

Abgelegt unter: Hirndefekt, Programmierung, SQL — ralf @ 6:14 pm

Eine sehr übersichtliche SQL Sicht:

SQL Sicht

April 25, 2008

Hexadezimal in Dezimal

Abgelegt unter: Programmierung — ralf @ 10:32 am

Folgendes Perl-Script konvertiert alle Hexadezimalen Zahlen (0x…) der Standardeingabe (stdin) in Dezimale Zahlen und gibt es auf der Standardausgabe (stdout) aus:

#!/usr/bin/perl -lw

use strict;

while (<>) {
        chomp;
        s/0[xX]([a-fA-F0-9]+)/sprintf('%d', hex('0x'.$1))/eg;
        print $_;
}

Benutzung in etwa wie folgt:

perl hex_2_dec.pl < hex.txt > dec.txt

“hex.txt” enthält beispielsweise folgende Zeile:

#define CSIDL_DESKTOP                   0x0000        // 

“dec.txt” enthält folgende Zeile:

#define CSIDL_DESKTOP                   0        // 

Visual Basic 6 Fehlerbehandlung

Abgelegt unter: Programmierung — ralf @ 6:54 am

Um in einer VB6-Routine (Function, Sub oder Property) mehrere Fehler ordentlich abzufangen muss eine etwas merkwürdige Kombination von “on local error” und “resume” verwendet werden.

Diese Beispiel-Sub geht von einem simplen “Form1″-Formular sowie einem “Command1″-Button aus.

Das Beispiel versucht mehrere Eigenschaften des aktuellen Objektes (”Form1″) abzufragen wobei die Sub verlassen werden soll wenn kein Fehler auftrat.
Die Eigenschaften sind “Error1″ gefolgt von “Error2″ und letztlich “Caption” was die Titel Zeile des Formulars ist.

Geht man diese Sub im Debug Modus Schritt für Schritt durch (F8 drücken) sieht man sehr schön wie “wild” hin und hergesprungen wird. Das ganze ist nicht ganz fein, funktioniert aber.

Private Sub Command1_Click()
  Debug.Assert ("F8 drücken um die Aufrufe einzeln durchzugehen" = "")

  On Local Error GoTo try_2

  Debug.Print CallByName(Me, "Error1", VbGet)
  Exit Sub

try_2_real:
  On Local Error GoTo try_3
  Debug.Print CallByName(Me, "Error2", VbGet)
  Exit Sub

try_3_real:
  On Local Error GoTo real_error
  Debug.Print CallByName(Me, "Caption", VbGet)
  Exit Sub

try_2:
  Debug.Print "try_1: " & Err.Number & " " & Err.Description
  Resume try_2_real

try_3:
  Debug.Print "try_2: " & Err.Number & " " & Err.Description
  Resume try_3_real

real_error:
  Debug.Print "real_error: " & Err.Number & " " & Err.Description
  Exit Sub
End Sub

Zum Vergleich mal ein nicht funktionierendes Beispiel:

Private Sub Command2_Click()
  Debug.Assert ("F8 drücken um die Aufrufe einzeln durchzugehen" = "")

  On Local Error GoTo try_2
  Debug.Print CallByName(Me, "Error1", VbGet)
  Exit Sub

try_2:
  On Local Error GoTo 0
  On Local Error Resume Next
  On Local Error GoTo try_3
  Debug.Print CallByName(Me, "Error2", VbGet)
  Exit Sub

try_3:
  On Local Error GoTo real_error
  Debug.Print CallByName(Me, "Caption", VbGet)
  Exit Sub

real_error:
  Debug.Print "real_error: " & Err.Number & " " & Err.Description
  Exit Sub
End Sub

Warum das zweite Beispiel nicht funktioniert bzw. nur das Erste liegt vermutlich daran das man während einer “Fehlerbehandlung” keine andere Fehlerbehandlung aktivieren oder die aktuelle deaktivieren kann. Aufgrund des “Resume try_2_real” im ersten Beispiel wird die Fehlerbehandlung zurück gesetzt um umgehend wieder gesetzt zu werden. Ein Vorteil könnte sein das man gezielt auf Spezielle Fehler reagieren kann.

März 29, 2008

suidexec

Abgelegt unter: Programmierung — ralf @ 10:21 am

suidexec führt Programme als root aus ohne jegliche Überprüfung wie zBspl. sudo oder suexec.

Lizenz ist .. mir egal.

Installation geht via make install, die Binary liegt dann in /usr/bin/suidexec.
Eine Deinstallation geht via make uninstall - oder man löscht einfach /usr/bin/suidexec.

Alle suidexec übergebenen Parameter werden an das zu startende Programm weitergereicht, suidexec selbst hat somit keinerlei Parameter.

Ich weise explizit darauf hin das man das Programm nur in vertrauenswürdigen Umgebungen installieren sollte da es schlichtweg eine Art Hintertür darstellt die es jedem erlaubt als root Programme zu starten.

Februar 3, 2008

SQL und die natürliche Sprache

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 7:35 am

Irgendwie hab ich im Hinterkopf das SQL entwickelt wurde um Benutzern eine Art verständliche Sprache zu geben um Daten abzufragen.

Allerdings ist SQL überhaupt nicht natürlich, es ist quasi widernatürlich, ein kleines Beispiel.

Ich gehe in einen beliebigen Konsumtempel und möchte folgendes kaufen:

  • 1x Kaffee Sorte A UND
  • 1x Kaffee Sorte B UND
  • 1x Kaffee Sorte C ODER 1x Kaffee Sorte D

Ich möchte also mit 3 Packungen Kaffee den Laden verlassen, ansich ganz einfach, nun das ganze mal in SQL:


SELECT Kaffee FROM KaffeeBestand WHERE
Sorte = 'Sorte A'
AND
Sorte = 'Sorte B'
AND
(Sorte = 'Sorte C' OR Sorte = 'Sorte D')
AND
Bestand > 0

Das Query wird nun natürlich immer nichts zurück liefern da die Sorte - je Datensatz - nur einen Wert haben kann.

Ich erspare mir jetzt ein korrektes SQL Beispiel.

Januar 23, 2008

Visual Basic 6 Überlauf bei einfacher Berechnung

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 12:24 am

Ein altbekannter Visual Basic Bug:


Private Sub Command1_Click()
Dim i As Long
i = 16000 * 3
End Sub

Ergibt den Fehler “Überlauf” mit der Fehlernummer “6″.

Problem hier ist das die Zahl “16000″ intern als Integer geführt wird und er versucht auf den Integer den Wert “48000″ zu Schreiben, das wiederrum geht nicht da Integer nur bis 32k geht.

Die Lösung hier ist den Datentyp (long) explizit anzugeben:


Private Sub Command1_Click()
Dim i As Long
i = CLng(16000) * 3
End Sub

Dolle Sache - dieses VB :-)

Januar 22, 2008

malloc binary - Benutzerdefinierte Speicherverschwendung

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 9:56 pm

Hier mal ein Programm was Speicher alloziert.

Kann genutzt werden um zBspl. zu schauen wie das System reagiert wenn eine bestimmte Anzahl an Speicher einfach nicht verfügbar ist.

Lizenz ist Public Domain.

screenshot: malloc.c

Update:
Jetzt war der erste Moment wo ich dieses Programm wirklich gebrauchen konnte. Ich hatte mir neuen Ram geholt und der kernel schmierte ständig ab.
Also hab ich das programm mal mit “3G” gestartet und siehe da: kernel crash.

Januar 13, 2008

Microsoft SQL Datenbank Offline Schalten

Abgelegt unter: Programmierung, SQL — ralf @ 7:53 pm

Folgendes SQL Script killt ALLE Prozesse die mit einer bestimmten SQL-Datenbank verbunden sind und schaltet die Datenbank offline.

Da ich gerade nicht weiß wie man einen Datenbank namen als Objekt (DECLARE .. database) definiert muss man den Datenbanknamen zweimal angeben, einmal oben bei “SET @db..” und einmal unten bei “ALTER DATABASE”.


USE [master]

DECLARE @spid int
DECLARE @db varchar(128)

SET @db = ‘–DatenbankName–’

DECLARE CUR CURSOR FOR
SELECT spid FROM sysprocesses WHERE dbid = DB_ID(@db) AND hostname <> ” AND spid <> @@SPID

OPEN CUR

FETCH NEXT FROM CUR INTO @spid

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE (’KILL ‘ + @spid)
FETCH NEXT FROM CUR INTO @spid
END

CLOSE CUR
DEALLOCATE CUR

SELECT @db AS ‘DB’, DATABASEPROPERTYEX (@db, ‘Status’) AS ‘State before’

ALTER DATABASE –DatenbankName– SET OFFLINE

SELECT @db AS ‘DB’, DATABASEPROPERTYEX (@db, ‘Status’) AS ‘State after’

Ältere Artikel »

Powered by WordPress ( WordPress Deutschland )