Hier eine kleine Sammlung an nützlichen Links zum Thema Audit in SQL-Server:
Blogartikel dazu (SQL 2005)
Trigger
Suchworte:
update()
columns_updated()
Alternative zum Selberschreiben (ab 2008):
Track Data Changes (SQL Server)
2.16.2018
1.24.2018
c# Liste generischer Klassen mit unterschiedlichen Typen
Ziel: Eine Liste von generischen Klassen (class) mit unterschiedlichen Typen (also unterschiedlichen T).
Vorarbeiten:
Nicht generische abstrakte BaseClass und generische Ableitung:
: ReportFilter
{
public T Value { get; set; }
}
var reportFilters = new List()
{
new ReportFilter {Description="Name",Type=typeof(string),Value="Test"},
new ReportFilter {Description="IsAktiv",Type=typeof(bool),Value=true}
};
foreach (var reportFilter in reportFilters)
{
var type = typeof(ReportFilter<>).MakeGenericType(reportFilter.Type);
var aktFilter = Convert.ChangeType(reportFilter, type);
var propertyInfo = type.GetProperty("Value");
if (propertyInfo != null)
{
var val = propertyInfo.GetValue(aktFilter, null);
}
}
Vorarbeiten:
Nicht generische abstrakte BaseClass und generische Ableitung:
public abstract class ReportFilter { public string Description { get; set; } public Type Type { get; set; } } public class ReportFilter: ReportFilter { public T Value { get; set; } }
Liste mit zwei Einträgen:
var reportFilters = new List() { new ReportFilter<string> {Description="Name",Type=typeof(string),Value="Test"}, new ReportFilter<bool> {Description="IsAktiv",Type=typeof(bool),Value=true} };
Auslesen:
foreach (var reportFilter in reportFilters) { var type = typeof(ReportFilter<>).MakeGenericType(reportFilter.Type); var aktFilter = Convert.ChangeType(reportFilter, type); var propertyInfo = type.GetProperty("Value"); if (propertyInfo != null) { var val = propertyInfo.GetValue(aktFilter, null); } }
Kopierbare Version der Code-Schnipsel:
public abstract class ReportFilter
{
public string Description { get; set; }
public Type Type { get; set; }
}
public class ReportFilter1.18.2018
ReportViewer - lokale Reports in z.B. WPF
Damit der Report-Viewer problemlos funktioniert müssen alle ReportViewer-DLLS dieselbe Version haben und lokal kopiert werden.
Wenn dann der Fehler "Report-Definiton fehlerhaft" auftritt, hilft es die DLL "Microsoft.ReportViewer.ProcessingObjectModel.dll" ins Projekt auf zu nehmen.
Siehe eine Anleitung hier.
Wenn dann der Fehler "Report-Definiton fehlerhaft" auftritt, hilft es die DLL "Microsoft.ReportViewer.ProcessingObjectModel.dll" ins Projekt auf zu nehmen.
Siehe eine Anleitung hier.
10.26.2016
EF liefert falsche Werte aus View auf SQL-Server
Manchmal liefert das EF falsche Werte aus einer View, die sich auf dem SQL-Server befindet (eventuelle auch aus anderen DBs, keine Erfahrung).
Das Problem wird durch fehlende bzw. falsche Entitäts-Schlüssel verursacht. Wenn das EF keine PrimaryKeys erkennt - und manchmal erkennt es auch die vorhandenen Keys in einer View nicht - dann wird ein ComponentKey aus allen nicht nullable Properties gebildet. Und der ist sowohl inhaltlich beliebig falsch als das er auch zu falschen Daten führt.
Abhilfe schafft die manuelle Korrektur der Entitätschlüssel im EF-Diagramm.
Hier noch eine Möglichkeit, wenn die View eigentlich keinen Schlüssel bietet. Diese verwendet eine Zeilennummer als Key (isnull(ROW_NUMBER() OVER (ORDER BY xy),-1) as rId). Isnull ist notwendig, da sonst die Zeilennummer manchmal nullable ist.
Das Verhalten kann komplett vermieden werden, wenn man eine Stored Procedure zwischenschaltet. Diese erlaubt auch das Sortieren der Daten.
Das Problem wird durch fehlende bzw. falsche Entitäts-Schlüssel verursacht. Wenn das EF keine PrimaryKeys erkennt - und manchmal erkennt es auch die vorhandenen Keys in einer View nicht - dann wird ein ComponentKey aus allen nicht nullable Properties gebildet. Und der ist sowohl inhaltlich beliebig falsch als das er auch zu falschen Daten führt.
Abhilfe schafft die manuelle Korrektur der Entitätschlüssel im EF-Diagramm.
Hier noch eine Möglichkeit, wenn die View eigentlich keinen Schlüssel bietet. Diese verwendet eine Zeilennummer als Key (isnull(ROW_NUMBER() OVER (ORDER BY xy),-1) as rId). Isnull ist notwendig, da sonst die Zeilennummer manchmal nullable ist.
Das Verhalten kann komplett vermieden werden, wenn man eine Stored Procedure zwischenschaltet. Diese erlaubt auch das Sortieren der Daten.
9.20.2016
Sicherer Filename
VB:
Imports System.IO
Namespace Helper
Public Class FileNameHelper
Public Shared Function GetSafeFilename(filename As String) As String
Return String.Join("_", filename.Split(Path.GetInvalidFileNameChars()))
End Function
End Class
End NameSpace
Namespace Helper
Public Class FileNameHelper
Public Shared Function GetSafeFilename(filename As String) As String
Return String.Join("_", filename.Split(Path.GetInvalidFileNameChars()))
End Function
End Class
End NameSpace
c#
public string GetSafeFilename(string filename)
{
return string.Join("_", filename.Split(Path.GetInvalidFileNameChars()));
}
{
return string.Join("_", filename.Split(Path.GetInvalidFileNameChars()));
}
Kopierversionen:
Imports System.IO Namespace Helper Public Class FileNameHelper Public Shared Function GetSafeFilename(filename As String) As String Return String.Join("_", filename.Split(Path.GetInvalidFileNameChars())) End Function End Class End Namespacepublic string GetSafeFilename(string filename) { return string.Join("_", filename.Split(Path.GetInvalidFileNameChars())); }
8.18.2016
VS kopieren der Build-Ergebnisse in bestimmten Ordner
Relativ zur Solution:
Absolutes Ziel:
xcopy $(TargetDir)*.* $(SolutionDir)..\dlls\ /y
Absolutes Ziel:
xcopy $(TargetDir)*.* c:\dlls\ /y
8.10.2016
5.24.2016
VS2013 meldet "EditorPackage does not load correctly"
Unter
%LOCALAPPDATA%\Microsoft\VisualStudio\12.0
das Verzeichnis ComponentModelCache löschen.
%LOCALAPPDATA%\Microsoft\VisualStudio\12.0
das Verzeichnis ComponentModelCache löschen.
4.28.2016
WPF - Kultur in Bindings nutzen
Folgende Zeile muss in der App.cs im OnStartup ergänzt werden:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
4.21.2016
IP-Adresse des Client in einem Web.API 2.x Controler ermitteln
Nach dem Einbinden von System.ServiceModel
funktioniert folgender Code:
private string GetClientIp(HttpRequestMessage request = null)
{
request = request ?? this.Request;
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)this.Request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
}
else if (HttpContext.Current != null)
{
return HttpContext.Current.Request.UserHostAddress;
}
else
{
return null;
}
}
{
request = request ?? this.Request;
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)this.Request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
}
else if (HttpContext.Current != null)
{
return HttpContext.Current.Request.UserHostAddress;
}
else
{
return null;
}
}
1.14.2016
WPF Listbox mit bleibender Markierung
Auch wenn ein anderes Element den Focus bekommt, bleibt der Eintrag "aktiv" markiert.
Events als Behaviors / Events in MVVM
Für WPF:
Verweis auf Microsoft.XAML.Interactions notwendig
...
xmlns:i=http://schemas.microsoft.com/expression/2010/interactivity
...
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Für WinPhone 8.1:
Verweis auf Behaviors SDK (XAML)
...
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
...
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Tapped">
<core:InvokeCommandAction Command="{Binding RufeNummerAnCommand, Mode=OneWay}"/>
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
Verweis auf Microsoft.XAML.Interactions notwendig
...
xmlns:i=http://schemas.microsoft.com/expression/2010/interactivity
...
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Für WinPhone 8.1:
Verweis auf Behaviors SDK (XAML)
...
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
...
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Tapped">
<core:InvokeCommandAction Command="{Binding RufeNummerAnCommand, Mode=OneWay}"/>
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
1.13.2016
Veröffentlichen von ASP.NET Web-API RESTService per FileCopy
Vorbereitung des Codes
- Im Projektmappenexplorer von VisualStudio das Webserver-Projekt rechtsklicken
- Neues "Custom"-Profil anlegen
- Publis method:"File System" wählen und Pfad angeben
- Assistent bis zu Ende benutzen
- Inhalt des Zielverzeichnisses auf den Server kopieren, auf dem der IIS läuft
Vorbereitung des IIS
Neue Website einrichten deren physikalischer Pfad auf das Verzeichnis verweist, in dem der Code auf dem Server liegt.11.11.2015
Singelton in C#
#region Singleton
private static xxx _instance;
private xxx() { }
public static xxx Instance
{
get
{
if (_instance == null)
{
_instance = new xxx();
}
return _instance;
}
}
#endregion
private static xxx _instance;
private xxx() { }
public static xxx Instance
{
get
{
if (_instance == null)
{
_instance = new xxx();
}
return _instance;
}
}
#endregion
Converter, die man (fast) immer braucht
Sichtbarkeit über Bool (unsichtbar):
public class Boolean2VisibleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Sichtbarkeit über Bool (ausgeblendet):
public class Boolean2VisibleCollapsedConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
5.08.2012
Oldi but goldi: Active-X Registrierung per Kontextmenu
Folgenden Text in eine Textdatei einfügen:
REGEDIT4
' -------------------------------------------------------
' Erweiterung des Windows Explorer-Kontextmenüs um die
' Einträge "Registrieren" und "Deregistrieren" bei Aus-
' wahl von DLL- und OCX-Dateien.
' -------------------------------------------------------
' Explorer-Kontextmenüerweiterung für DLL-Dateien:
[HKEY_CLASSES_ROOT\.dll]
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="DLL"
[HKEY_CLASSES_ROOT\dllfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\dllfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' Explorer-Kontextmenüerweiterung für OCX-Dateien:
[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"
[HKEY_CLASSES_ROOT\ocxfile]
@="OCX"
[HKEY_CLASSES_ROOT\ocxfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' -------------------------------------------------------
Datei als irgendwas.reg speichern, doppelklicken und Registrirung erweitern.
Ab da ist dann bei ActiveX-Dateien das Kontextmenu um Deregistrieren und Registriern erweitert.
Quelle: http://msdn.microsoft.com/de-de/library/bb979360.aspx
REGEDIT4
' -------------------------------------------------------
' Erweiterung des Windows Explorer-Kontextmenüs um die
' Einträge "Registrieren" und "Deregistrieren" bei Aus-
' wahl von DLL- und OCX-Dateien.
' -------------------------------------------------------
' Explorer-Kontextmenüerweiterung für DLL-Dateien:
[HKEY_CLASSES_ROOT\.dll]
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="DLL"
[HKEY_CLASSES_ROOT\dllfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\dllfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' Explorer-Kontextmenüerweiterung für OCX-Dateien:
[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"
[HKEY_CLASSES_ROOT\ocxfile]
@="OCX"
[HKEY_CLASSES_ROOT\ocxfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' -------------------------------------------------------
Datei als irgendwas.reg speichern, doppelklicken und Registrirung erweitern.
Ab da ist dann bei ActiveX-Dateien das Kontextmenu um Deregistrieren und Registriern erweitert.
Quelle: http://msdn.microsoft.com/de-de/library/bb979360.aspx
4.13.2012
ORACLE neu starten
1. Schau mal auf dem Datnbankserver in der Systemsteuerung unter Dienste, ob der Dienst "OracleService" gestartet ist, wobei Du durch den Namen der Oracle-Instanz ersetzen mußt. In Deinem Fall müßte (wenn ich es recht sehe) der Dienstname OracleServiceTest lauten. Sollte der Dienst nicht gestartet sein, starte ihn.
2. Öffne auf dem DB-Server eine DOS-Box. Setze die Umgebungsvariable ORACLE_SID auf den Namen der Datenbankinstanz und melde Dich dann als sysdba mit SQL*Plus an:
set ORACLE_SID= (Achtung: Auch hier wieder durch den Namen der Datenbankinstanz ersetzen!)
sqlplus / as sysdba
Danach setze mal folgende Abfrage in SQL*Plus ab:
SQL1.SELECT STATUS FROM v$instance;
Sollte hier irgendein anderer Status als "OPEN" zurückgegeben werden, ist die Datenbank nicht geöffnet. In diesem Fall würde ich die DB versuchen durchzustarten und zu öffnen:
SQL1.shutdown immediate;2.startup;
2. Öffne auf dem DB-Server eine DOS-Box. Setze die Umgebungsvariable ORACLE_SID auf den Namen der Datenbankinstanz und melde Dich dann als sysdba mit SQL*Plus an:
set ORACLE_SID=
sqlplus / as sysdba
Danach setze mal folgende Abfrage in SQL*Plus ab:
SQL1.SELECT STATUS FROM v$instance;
Sollte hier irgendein anderer Status als "OPEN" zurückgegeben werden, ist die Datenbank nicht geöffnet. In diesem Fall würde ich die DB versuchen durchzustarten und zu öffnen:
SQL1.shutdown immediate;2.startup;
1.25.2012
Datum zu Kalenderwoche in VB.NET
Private Function StartDatumDerKW(ByVal Jahr As Integer, ByVal KW As Integer) As DateTime
' > der vierte Januar des gegebenen Jahres wird erst mal benötigt
Dim dteStartTag As New DateTime(Jahr, 1, 4)
' > hole den ersten Wochentag der ersten Woche
Dim intWochentag As Integer = ((Int(dteStartTag.DayOfWeek) + 6) Mod 7) + 1
' > die Kalenderwoche beginnt aber eventuell n Tage vorher
Dim dteErsterTag As DateTime = dteStartTag.AddDays(1 - intWochentag)
Return CDate(dteErsterTag.AddDays((KW - 1) * 7))
End Function
' > der vierte Januar des gegebenen Jahres wird erst mal benötigt
Dim dteStartTag As New DateTime(Jahr, 1, 4)
' > hole den ersten Wochentag der ersten Woche
Dim intWochentag As Integer = ((Int(dteStartTag.DayOfWeek) + 6) Mod 7) + 1
' > die Kalenderwoche beginnt aber eventuell n Tage vorher
Dim dteErsterTag As DateTime = dteStartTag.AddDays(1 - intWochentag)
Return CDate(dteErsterTag.AddDays((KW - 1) * 7))
End Function
Kalenderwoche in Datum in ORACLE
SELECT
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 AS date_from,
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 + 6 AS date_to
FROM sys.dual;
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 AS date_from,
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 + 6 AS date_to
FROM sys.dual;
Abonnieren
Posts (Atom)
