Monday, December 27, 2010

sqlserver managementstuido spaltenüberschriften in abfrageergebnis Copy

Optionen / Abfrageergebnis / SQL Server / Ergebnisse in Raster / Spaltenheader beim Kobieren ... einschliessen

Tuesday, December 21, 2010

COM (OLE) Server in C#

Com Überblick:

OLE Automation dient dem Zugriff auf Com Objekten con Script Sprachen aus, diese benötigen ein Late Binding, da ja kein Compiler vorhanden ist, der das Binding vor der Laufzeit macht. Daher gibt es das IDispatch Interface, alle OLE Server müssen dieses Implementieren.

In c# erledigt die ganze Interfacedefinition usw. die Attributierung der Klasse, die COM zur Verfügung gestellt werden soll - wichtig: in VS2008 und VS2010 muss man ComVisible(true) explizit angeben, früher war dies im Attribut ClassInterface enthalten ... im Projekt vom Typ Class Library sollte unter Properties/Build/Output register for Com interop angehackt sein, das registriert den OLE Server gleich und generiert die Type Librarty, die für Script Sprachen die vorhandenen Methoden zur Verfügung stellt. Man kann dies aber auch mit regasm oder tlbexp Ole6.dll /out:Ole5.tlb machen


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace Ole6
{
[Guid("9C78E2DB-E664-47BE-A2C2-213AA2005078"),
ClassInterface(ClassInterfaceType.AutoDual),
ComVisible(true)]
public class Ole6
{
public Ole6() { }
public string Test()
{
return "Test";
}

}

}

Sunday, December 19, 2010

.net TextfileTracelistener adden

ins app.config File einfügen:

system.diagnostics
trace autoflush="true" indentsize="2"
listeners
add name="textfilelistener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Log.txt"
listeners
trace
system.diagnostics

im code verwenden:

Trace.TraceInformation(Application.ExecutablePath + " started at " + DateTime.Now.ToString());

windows forms anzeige refrehsen während hintergrundtask im selben thread läuft

eigentlich ist es ja nicht schön, einen längerdauernden task im GUI Thread laufen zu lassen, aber bei quick & dirty testforms macht es ab und zu sinn. Wenn man den status des länger dauernden tasks dann anzeigen will, ist es sinnvoll nicht nur
this.refresh(); aufs formular in der langdauernden schleife aufzurufen sondern auch
Application.DoEvents(); ... dann werden die ganzen Windwos Messages abgearbeitte, die z.b. durch progressbar.PerformStep() ausgelöst werden ...

Thursday, December 02, 2010

eigene config klasse

muss von ConfigurationSection abgeleitet sein, braucht eine Property SectionName, anbei der Code zum lesen und Schreiben, bei Fehlersuche ist es ratsam im Visual Studio unter Debug/Exceptions bei CLR Exceptions das Häckchen bei Thrown anzuhacken, da Fehler sonst vom Configurationmanager unterdrückt werden. Aktiviert man aber dass die Ausführung bei thrown Exceptions unterbricht,bekommt man die Orignal Fehlermeldung des Configurationmanagers.


private string _SectionName;
public string Name
{
get
{
return this.SectionInformation.Name;
}
}
public string SectionName
{
get
{
return _SectionName;
}
set
{
_SectionName = value;
}
}

public static List GetSectionsFromConfig()
{
Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSectionGroup csg = c.GetSectionGroup("DataContextParams");
List ldcp = new List();
foreach (DataContextParams dcp in csg.Sections)
{
ldcp.Add(dcp);
}
return ldcp;
}

///
/// schreibt dieses Objekt in die Config
///

/// wenn null wird in die execonfig geschrieben
public void SaveSectionToConfig(string configfile)
{
ExeConfigurationFileMap oConfigFile = new ExeConfigurationFileMap();
Configuration oConfiguration;
if (null == configfile)
{
oConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
else
{
oConfigFile.ExeConfigFilename = configfile;
oConfiguration = ConfigurationManager.OpenMappedExeConfiguration(oConfigFile, ConfigurationUserLevel.None);
}

//Add it to the configuration's sections
oConfiguration.Sections.Add(SectionName, this);

//Save the given section in the configuration file
this.SectionInformation.ForceSave = true;
oConfiguration.Save(ConfigurationSaveMode.Full);

}

schreiben in app.config

Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
configuration.AppSettings.Settings.Remove("Test");
configuration.AppSettings.Settings.Add("Test","meinTestWert");
configuration.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

Tuesday, November 16, 2010

PostgresSql

einspieln von sql scripts:
-h host
--username=...
-f file
-d datenbank

psql -h localhost --username=s2010_admin -f c:\sql\test.sql -d s2010

autoincrement=bigserial (=8byte integer), zusätzlich primary key angeben !

create table Einnahmeform ( javascript:void(0)
ID BIGSERIAL CONSTRAINT PK PRIMARY KEY,
Einnahmeform varchar(80)
);

alle tabellen in einem schema
SELECT table_name FROM information_schema.tables where table_schema='schemaname'

Thursday, October 21, 2010

delagtes Übersicht

delegate void TestDelegate(string s);
TestDelegate testDelA = new TestDelegate(M); //C#1.0 explicite Method M must me declared
TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); }; //C#2.0 inline "anonymos method
TestDelegate testDelC = (x) => { Console.WriteLine(x); }; // C# 3.0. lambda expr.
Action TestDelegate; //C#4.0 DelegateDefinition einfacher //C# 4.0 Actions

In Windows Forms muss eine anonyme Methode noch zu einem MethodInvoker konvertiert werden:
this.Invoke(new MethodInvoker(delegate() { pgbStatus.Minimum = 0; }));

In Wpf zu einer Action:
Application.Current.Dispatcher.Invoke((Action)delegate
{
SetButtonsEnabled(true);
}, null);

Sql Server 2008 Resource Governator

Resource Governtor steuert CPU und Memory Consumption von Connections. Eine ResourceGovernorClassifier Funktion wird verwendet um LoginName zu einer Workloadgruppe zuzuordnen, die ihrerseits wieder einem ResourcePool zugeordnet ist. Ein Resourcepool kann mehrere Workloadgruppen haben, die sich auch in Resourcezuordnung unterscheiden können, also ein 2 stufiges Resourcevergabeschema.

Funktion zum Zuordnen der Logins zu den Workloadgruppen (setzt Vorraus dass diese existieren):

Alter Function dbo.fn_ResourceGovernorClassifier()
Returns sysname
WITH Schemabinding
as
BEGIN
DECLARE @group sysname
IF SUSER_SNAME()='Executive' SET @group='ExecutivesWL'
ELSE IF SUSER_SNAME()='Customer' SET @group='CustomersWL'
ELSE IF SUSER_SNAME()='Report' SET @group='ReportWG'
ELSE SET @group='default'

RETURN @group
END
GO

ALTER RESOURCE GOVERNOR WITH (Classifier_Function = dbo.fn_ResourceGovernorClassifier)
GO

ALTER RESOURCE GOVERNOR RECONFIGURE
GO

Create Login Executive with password='pwd'
Create Login Customer with password='pwd'
Create Login Report with password='pwd'

SELECT b.name,a.login_name, a.session_id
from sys.dm_exec_sessions a inner join sys.dm_resource_governor_workload_groups b on a.group_id=b.group_id
where b.name<>'internal'

Thursday, October 14, 2010

Outlook Autovervollständigungen in 2010 importieren

bis outlook 2007 wurden die AUtovervollständigungen in AppData/Roaming/Microsoft/Outlook/Profilname.nk2 gespeichert. In 2010 werden diese am Exchange Server gespeichert. Daher Nk2 Datei in obiges Verzeichnis mit Profilnamen kopieren, dann Outlook.exe /importnk2 ausführen ...

Friday, September 10, 2010

Clustering

Windows Server Clustering:
==========================
Standard Clustering: eine Quorum Datenbank = Single Point of Failure
Majority: jede node eine Kopie der Quorum Datenbank \\%NodeName%\%ResourceGUID%$ share auf Quorum Db in %SystemRoot%\Cluster\QuN.

%ResourceGUID%$\%ResourceGUID%\MSCS
ClusterAccount muss locale Admin Rechte haben

Disk:
-----
keine dyn. Disk unterstütz, SCSI oder Fibre HD
MS DTC Disk
Antivirus software: Database Dirs ausnehmen, da sonst failover zu lange dauert
Network:
--------
2 Netwerkkarten: internes Netzwerk (Cluster Netzwerk) über dieses wird ping looksalive gesendet, wenn keine Antwort failover process

gestartet, öffentliches Netzwek
RPC wird benötigt
beim failover wird der netzwerkname des clusterst vom DNS unregisterded, dann wird die cluster Ip auf die netzwerkkarte des anderen

nodes geslegt und neu im dns registriert

SQLServerClustering:
====================
jede SQL Server Instanz bruacht einen eigenen Drive Letter, Transaktionen werden zurückgerollt beim Failover, es gibt kein Load Balancing bei SQL Server
Security Grouppe für jedes SQL Service als Domain Gruppe

Wichtig: Es können nach der Installation keine weiteren Features mehr hinzugefügt werden => Analysis Services z.b. gelich hinzufügen !

Tuesday, September 07, 2010

DateTimePicker an Dataset gebunden: Out of range exception

bei Dataset.Clear() ...

woraround: clear des tableadaptes verwenden, sodass das dataset gleich wieder gefüllt wird

Monday, September 06, 2010

ASP.Net C# Inline Markup

Mit spitzer Klammer auf, Prozent Zeichen wird ein c# inline Markup eingeleitet:

InlineDemo1: <%Response.Write("Date="+DateTime.Now); %>


config werte direkt in control properties schreiben (geht auch mit Resourcen):
InlineConfigValue: < asp:Literal runat="server" Text="<% $ AppSettings: test%>" />"

http://translate.google.at/translate?hl=de&langpair=en%7Cde&u=http://msdn.microsoft.com/en-us/library/d5bd1tad.aspx

Thursday, September 02, 2010

Rapid GUI Development mit VS2008 & Datasets

Vorgehensweise:
===============
1) fertiges Datenbank Design
2) Vs2008/Menü Data / Add New Datasource / Tabeeln, Views Functions 6 Stored Proc. aussuchen
3) einstellen ob Tabellen / Detailansicht und mittels Drag & Drop die Datatabels aus dem Dataset in den Windows Forms Designer ziehen
4) Namen der generierten Tableadapter, BindingSource eventuell anpassen, Shortcut für Datatables erstellen
5) Spalten der Datagrids Formatieren
6) anpassen des generierten Codes

Was wird generiert ?
====================
1) Datenbankobjekte -> Dataset ziehen:
generiert Tableadapter und Datatable pro Tabelle / SotredProc oder Function
2) Datatables aus dem Dataset -> Formular ziehen:
genereirt Instanz des Datasets, Tableadapter+tableAdapterManager, Bindingsource, bindingsourceNavigator, toolstrip + Datagridview / einzelne Controls für Felder

Was bringt das ?
================
Der Columndesigner des Datasets erspart viel Tipparbeit, die generierten Datenzugriffselemente müssen meist händisch angepasst werden ...

Wednesday, September 01, 2010

Dataset und TableAdapter generieren und updaten

Um Datasets von einer bestehenden Datenbank zu erzeugen, einfach im Visual Studio im Menü Data "Create New Datasource" auswählen. Ein Wizard frägt die Datenbankverbindung ab, dann kann man auswählen welcehe Tabellen, Views und Functions/StoredProcedures man im Dataset haben möchte (bei Lightswitch gehen nur Tabellen und Views derzeit).
Dann werden für die ausgewählten Einträge DataTables und TableAdapter (zum Befüllen) erzeugt. bei Auswahl von Tabellen kann der Dataadapter auch Updates und Deletes sowie INserts machen. bei StoredProc usw. nur Select.
ändert sich an der Definition des Datenbankobjektes etwas, so kann man das im Dataset Designer mit rechter Maustaste auf die Datatable und Configure anpassen. Wenn Tabellendefinitionen geändert werden, ist es wichtig auch alle table valued functions, die darauf passieren anzupassen. Hinzufügen von Feldern ist dem Dataset egal, da es das SQL REsultset und die Dataset Spalten per Name mapped.
Wichtig: Constraint Fehlerkönnen sich sowohl auf Schlüsselverletzungen aber auch Feldconstraint (nicht null, Länge) beziehen, da ist die Fehlermeldung der Tableadapter.Fill Methode sehr unaussagekräftig.

Tuesday, August 31, 2010

javascript debugging

Im Firefox gibts das Plugin Firebug, und dann kann man mit
console.log("my trace"); im consolen Fenster logs erzeugen - internet explorer 8 bricht das javascript ab wenn copnsole.log erscheint

Friday, August 20, 2010

Properties / Settings in C#

Wenn man in einem Windows Forms Projekt Settings hinzufügt (über Projekteigenschaften Settings oder Ordner Porperties Settings.settings)
wird in der App.config ein je nach Einstellung ApplicationSettings bzw. UserSettings Abschnitt erzeugt. Ist dieser nciht vorhanden, oder fehlen Settings darus, ist auch die Klasse dann im c# Code nicht über den Namespace Properties.Settings zu erreichen. Weiters werden Connectionstrings, also Settings vom Typ Connectionstings in die appconfigsection Connectionsstrings geschrieben (werden z.b. beim Anlegen eines Datasets über den Datasource Wizard erzeugt).
User Settings lassen sich über die Save Methode abspeichern (in den AppData Ordner des jeweiligen Benutzers in user.config), appsettings sind schreibgeschützt














testSettingValue






userTestValue



XPATH & Namespace

Sobald man mit XPATH Elemente mit Namespace finden will, braucht man ja nach verwendeter XPath Implementierung, eine Möglichkeit Namespaces und dazugehörige Prefixe zu übergeben.
//test sucht alle Elemente, die den Namen test und KEINEN NAMESPACE haben.

//pref:test sucht alle Elemente, die den Namen test und den Namespace, der dem prefix pref zugeordnet ist haben.

in .Net braucht man den XmlNamespaceManager:

XmlNode ret= ret = listService.UpdateListItems(strListID, batchElement);
XmlNamespaceManager xmlNsM = new XmlNamespaceManager(ret.OwnerDocument.NameTable);
xmlNsM.AddNamespace("z","#RowsetSchema");
sharepointGUID = ret.SelectSingleNode("//z:row/@ows_GUID", xmlNsM).Value;

siehe auch

Thursday, August 19, 2010

log4net config für Rolling file, Datenbank und smtp

appender schreiben die messages in files, mails, datenbanken; die messages werden mit den loggern erzeugt, wobei es eine logger hirachie gibt an deren SSpitze der root logger steht, der auch alle messages die in von anderen loggern erzeugt wurden loggt (also an seine appender weitergibt). So ist es möglich mit einem logger z.b. alle log messages eines namespaces (+subnamespaces) zu loggen, also einfaches Beispiel:

im Code:
public class Myclass
{
protected static ILog log = log4net.LogManager.GetLogger("System.Windows.Forms");

public static void TestLog()
{
log.Info("UpdateStockValues"+DateTime.Now);
}
}
in App.config:














nach Level filtern im Appender (loggt keine Info und Debug)





Levels:
•ALL
•DEBUG
•INFO
•WARN
•ERROR
•FATAL
•OFF

Beispiel für config die mittels root logger alles loggt in 3 Appender: file, datenbank und email:
























































































Tuesday, August 17, 2010

Windwos VPN Server

einfach Routing und access services mit wizard konfigurieren, wichtig: benutzer müssen einwahlrechte haben (Eigenscahften des Benutzers, Einwählen)
Protokolle: VPN Server: Routing und Acess, rechte Maustaste Eigenschaften, letzetses Tab Protokolle
Im System Protokoll findet man IP des Client von dem aus versucht wurde einzuloggen
PPTP: 1723 Port