Laden...
Avatar #avatar-2534.gif
Khalid myCSharp.de - Experte
Softwareentwickler Hannover Dabei seit 19.07.2005 3.511 Beiträge
Benutzerbeschreibung

Forenbeiträge von Khalid Ingesamt 3.511 Beiträge

10.10.2012 - 13:04 Uhr

Beim DataContractSerializer kann man die Eigenschaft MaxItemsInObjectGraph verändern. Dieser wiederum liegt in einem Behavior. Also


<behaviors> 
    <endpointBehaviors> 
        <behavior name="MeinTollesBehavior"> 
            <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
        </behavior> 
    </endpointBehaviors> 
</behaviors>

02.10.2012 - 12:42 Uhr

Der Datentyp Image hat nichts mit Bildern zu tun. Das ist leider ein weit verbreiteter angenommener Irrtum. Für Binaries jeder Art nimmt man ein VARBINARY(MAX).

02.10.2012 - 12:40 Uhr

SSIS gibt es leider nicht für SQL Express.

Gut, da du dann leider SSIS nicht verwenden kannst, würde ich dann natürlich doch auf etwas selbst implementiertes setzten. Hierzu würde ich, da das ganze ja ein Workflow darstellt (Daten holen, einfügen, löschen etc...), auch mit der Workflow Foundation umsetzen. Somit kannst du jeden Schritt sauber in eine Activity packen und die nach und nach ausführen.

Um das ganze dann zeitlich zu steuern, würd eich dir Quartz.Netempfehlen.

Aber um noch deine Fragen zum SSIS zu beantworten:

kann man auch in der Pakette das löschen der daten in der der quelle-Tabelle nach dem Transfer auch implemenieren ?

Ja, du kannst in einem SSIS Paket so ziemlich alles machen, was der jeweilige Zielserver so bietet. Notfalls setzt man manuell mit SQL an.

wo wird das Paket ausgeführt? in sql server selbst?

In der SSIS Runtime, die Parallel zum SQL Server läuft.

und wie kann man einstellen dass der Paket (daten transfer) jede z.B. 10 min ausgeführt wird

Die zeitliche Steuerung übernimmt der SQL Agent über geplante Wartungsarbeiten. Man kann auch Wartungsarbeiten anlegen, die ein SSIS Paket ausführen.

28.09.2012 - 11:30 Uhr

Da würde ich gar keine Anwendung für schreiben, sondern das ganze über ein SSIS Paket im MS SQL Server lösen.

19.09.2012 - 11:27 Uhr

Zu Namenskonventionen und weiteres gab es meine ich schon hier was im Forum. Müsstest du mal suchen (und Ergebnisse hier bitte posten).

Ansonsten:
Alleine deine Klasse "formSettings" ist schon falsch benannt. Klassen/Interfaces/Enums etc. werden immer in PascalCase geschrieben und nicht in camelCase.

Daraus ergibt sich dann auch die Antwort, nämlich


var formSettings = new FormSettings();

19.09.2012 - 07:37 Uhr

Oder du benutzt ReSharper. Einfach den Typen des Controls hinschrieben und ReSharper übernimmt den Rest.

10.09.2012 - 16:39 Uhr

Zu 1)
Du kannst in c# vor jedem Bezeichner ein @ setzen. Der Compiler interpretiert das dann nicht mehr als Schlüsselwort. Nachteil ist, du musst immer ein @ vorsetzen.

Aber warum gibst du den DataMember nicht einfach einen Namen? Also [DataMember("class")]?

Also entweder


[DataMember]
public string @class { get; set; }

oder


[DataMember("class")]
public string ClassName { get; set; }

Wobei das zweite die wesentlich bessere Lösung ist.

06.09.2012 - 13:24 Uhr

Ich gebe mal einfach die Antwort, die ich bei solchen Fragen immer gebe: c#/.NET wird noch über Jahre hinweg aktuell sein. Gerade im Serverbereich. MS hat mittlerweile fast alle seine großen Kernkomponenten auf c# umgestellt oder zum großen Teil umgestellt (SharePoint, TFS, BizTalk, System Center). Im Desktopbereich mag es anders aussehen. Aber so viel ich weiß setzt MS beim Office 2013 auf eine komplett neue Komponente zum Anzeigen der z.B. Word Dokumente, da GDI+ zu langsam ist. Würde mich nicht wundern, wenn es WPF ist. Und zum Teil sind schon einige Office Funktionen .NET. Ach ja, Visual Studio sollte man auch nicht vergessen. Auch .NET (teilweise).

Also, warum sich "sorgen" machen, wenn einer der größten Softwarehäuser auch auf .NET setzt. Klar, sollte man sich Gedanken machen, ob die Sprache die man gerne einsetzt auch zukunftsträchtig ist, aber gerade bei .NET würde ich mir keine Gedanken machen.

Und was Tablets angeht: Da ich zu 80% Servergeschichten mache, sind mir Tablets total egal 😃

Der Desktop PC als solcher wird auch nicht aussterben. Auf einem PC arbeitet jeder wesentlich effektiver als auf einem Tablet. Alleine die Tastatur/Maus Kombo kann momentan einfach nichts ersetzen. Für z.B. Reisen oder lange fahrten sind Tablets klasse. Aber da arbeitet man ja auch selten. Sondern macht eher ein paar Mails und gut ist.

Und was z.B. Jobangebote angeht: Also bei uns hier in der Region sind .NETler zur Zeit sehr gefragt.

05.09.2012 - 07:38 Uhr

Hallo,

laut MSDN müsste es mit der WebClient Klasse hinhauen.

30.08.2012 - 11:22 Uhr

Setze den BindingMode mal auf TwoWay.

29.08.2012 - 09:01 Uhr

Hallo,

ja du musst INotifyPropertyChanged implementieren. Schau dir dazu mal Beispiele zum Thema MVVM an. Dann wirst du auch sicherlich weiterkommen.

27.08.2012 - 13:17 Uhr

Hallo,

welche Technologie verwendest du? WinForms, WPF, ASP? Bei allen dreien sind UserControls möglich.

Erster Gedanke dazu: Andere DPI Einstellung

17.08.2012 - 16:10 Uhr

Oh man. Danke. Hab überall nachgeschaut, aber natürlich nicht in den MSDN Downloads. handvormkopfklatsch

17.08.2012 - 15:25 Uhr

Blöde Frage am Rande: Bin ich blind, oder gibt es noch kein VS 2012 SDK? Scheint nur das RC SDK zu geben. Weiß jemand, ob das kompatibel ist?

03.08.2012 - 13:43 Uhr

Ein weiterer Vorteil der NVidias ist die Unterstützung von PhysX. Das sieht bei manchen Spielen schon echt schick aus, wenn die kleinsten Partikel durch die Gegend fliegen oder alles mögliche zu bruch geht 😃

03.08.2012 - 08:20 Uhr

Hallo,

muss es eine 240GB SSD sein? Für System reicht locker eine 128GB (nimm die Samsung 830. Top Teil). Als Grafikkarte würde ich momentan die günstigere, aber nicht wesentlich schlechtere, GTX 560 Serie von NVidia nehmen. Reicht vollkommen aus für alles was da ist, und in der nächsten Zeit noch kommt. Damit bist du schonmal locker 200€ güntiger. Kannst die ja mal ein paar Benchmarks dazu anschauen. Oder du packst das gesparte Geld der SSD in die nächst höhere 670 GTX von NVidia. Dann hast du da die nächsten Jahre ruhe.

Konfiguriere dir den rechner mal komplett bei Alternate. Manchmal sind die doch etwas günstiger, bzw. vergleiche mit HoH und hol dir ggf. die jeweils güntigeren Teile bei den einen, oder den anderen (wenn du den Aufwand nicht scheust).

Auf jeden Fall bekommst du für 1000€ ein Rechner, der die nächsten 2-3 Jahre sehr gut überbrücken sollte 😃

02.08.2012 - 10:48 Uhr

Da würde ich dann vom 12. September ausgehen

02.08.2012 - 08:11 Uhr

Da es heißt, das alle Editionen ab dem 15. August RTM sind, würde ich davon ausgehen, das damit auch die Express Versionen gemeint sind. Ob die allerdings wiederum ab dem 15. für die Allgemeinheit verfügbar sind, keine Ahnung 😃

Spätestens am 12. September, da dann weltweiter Launch für VS 2012 ansteht.

01.08.2012 - 08:12 Uhr

Hallo,

das mit F2 kann ich nicht nachvollziehen. Funktioniert ohne Probleme. Über die Kompabilität hab ich das noch nie ausprobiert. Ich gehe eigentlich immer den Weg über Rechtsklick auf Symbol in Taskleiste->Als Admin starten. Probiere ich allerdings mal aus. Hab momentan allerdings kein 2012er hier.

Was mich persönlich nervt ist, dass das Starten von ASP MVC Seiten unter dem IIS Express 8.0 ewig dauert. Gerade, wenn man nur mal fix eine kleine Änderung macht und anschließend wieder startet. Ist meist eine Verzögerung von gut 10-20 Sekunden.

18.07.2012 - 14:29 Uhr

Hallo,

wenn deine ComboBox nur anders aussehen soll, aber sich ansonsten wie eine normale ComboBox verhalten soll, dann ändere einfach nur den Style den ComboBox. Dann brauchst du kein UserControl zwischen legen. Wenn du den Ansatz mit dem UserControl weiter verfolgen willst, dann schaue dir mal DependencyProperties an.

12.07.2012 - 11:23 Uhr

Im Prinzip ist es das was du beschrieben hast. Texte dynamisch auf das Bild usw... Nur halt mit vielen Parametern, die das Ergebnis-Bild anpassen.

Das mit dem Query klingt sehr gut, da ich dann per Ajax - hast du ja auch erwähnt - das Bild auch per Preview anzeigen kann. Das wäre ein nettes Gimmick oben drauf. Mit GET hab ich so meine Befürchtung, da IMHO GET auf 255 Zeichen beschränkt ist. Das könnte unter Umständen mehr werden. Viel mehr. Ich könnte die ganzen Parameter auch persistieren und im GET nur eine ID übergeben und dann die Parameter wieder laden. Da muss ich dann mal schauen.

Danke für die Antworten, das bringt mich erst mal wesentlich weiter.

Mit asynchronen Controllern hab ich noch nichts gemacht. Das schau ich mir dann später mal an. Habe im Prinzip noch nicht allzuviel mit ASP.NET MVC gemacht 😃. Aber danke für den Tipp.

12.07.2012 - 10:03 Uhr

Hallo,

danke für dei Antwort. Ja, der ControllerCode ist nur so dahingeschrieben, deswegen fehlt das Controller 😃

Der Code des ActionResults ist folgender (siehe auch im Link)


public class ImageResult : ActionResult 
{ 
    public ImageResult() { } 

    public Image Image { get; set; } 
    public ImageFormat ImageFormat { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
        // verify properties 
        if (Image == null) 
        { 
            throw new ArgumentNullException("Image"); 
        } 
        if (ImageFormat == null) 
        { 
            throw new ArgumentNullException("ImageFormat"); 
        } 

        // output 
        context.HttpContext.Response.Clear(); 

        if (ImageFormat.Equals(ImageFormat.Bmp)) context.HttpContext.Response.ContentType = "image/bmp"; 
        if (ImageFormat.Equals(ImageFormat.Gif)) context.HttpContext.Response.ContentType = "image/gif"; 
        if (ImageFormat.Equals(ImageFormat.Icon)) context.HttpContext.Response.ContentType = "image/vnd.microsoft.icon"; 
        if (ImageFormat.Equals(ImageFormat.Jpeg)) context.HttpContext.Response.ContentType = "image/jpeg"; 
        if (ImageFormat.Equals(ImageFormat.Png)) context.HttpContext.Response.ContentType = "image/png"; 
        if (ImageFormat.Equals(ImageFormat.Tiff)) context.HttpContext.Response.ContentType = "image/tiff"; 
        if (ImageFormat.Equals(ImageFormat.Wmf)) context.HttpContext.Response.ContentType = "image/wmf";
 
        Image.Save(context.HttpContext.Response.OutputStream, ImageFormat); 
    } 
} 

Die Expressions kann ich ja entfernen, da an der Stelle nur der eigentliche Name extrahiert wird. Den kann ich auch statisch übergeben. Spielt keine Rolle.

Mein Problem ist halt, wie bekomme ich das Model weitergereicht. Es können bis zu 50! Parameter werden, die benötigt werden um das Bild korrekt zu erstellen. Diese wollte ich nicht alle im Link weitergeben. Aber wenn es nicht anders geht, muss ich das wohl tun.
Das hat mich aber auf jeden Fall schon weitergebracht.

12.07.2012 - 09:15 Uhr

Hallo,

sorry für den komischen Titel, aber mir ist nichts besseres eingefallen. Also zu dem Problem. Ich habe mit Hilfe vonMVC Custom ActionResults ein Controller erweitert, der mir dynamisch Bilder zusammenbaut und diese am Client ausgibt. Das funktioniert auch soweit sehr gut. Nur möchte ich ganz gerne an diese Action das Model des aktuellen Views weiterreichen, da ich eine Menge Informationen für die Grafik brauche.

Seht in etwa so aus


public class ImageGeneratorController
{
  public ActionResult Index()
  {
    return View();
  }

  
  public ActionResult GenerateLabel(LabelModel model)
  {
    return View();
  }

  public ActionResult GenerateLabelImage(LabelModel)
  {
    // Grafik erstellen
    return ImageResult { Image = DasImage };
  }
}

Die cshtml des GenerateLabel ungefähr so


@model LabelModel

@(Html.Image<ImageGeneratorLabel>(x => x.GenerateLabelImage(Model), 400, 300);

Die Extension Image<T> erstellt ja nur die URL. Das heißt, dass ja der Parameter Model überheupt kein Sinn macht, da dieser ja nicht ausgewertet wird. Wie schaffe ich es aber, dass das Model von GenerateLabel nach GenerateLabelImage übergeben wird. Mein jetziger "Hack", ist das ich in GenerateLabel das Model in TempData reinlege und bei GenerateLabelImage wieder raushole. Das finde ich ist allerdings sehr sehr unsauber und garantiert nicht richtig.

Bin für jeden Vorschlag dankbar 😉

10.07.2012 - 09:11 Uhr

Hallo,

ich find das Design auch gut. Beschränkt sich halt auf das wesentliche ohne grafischen firlefanz. Was man nicht auf den Screenshots sieht die so rumkursieren sind die verschiedenen Icons der Standardelemente. Wenn alle Icons von MS so blau sind, und dann die farbigen Icons der anderen Programme kommen, kann das glaub ich ganz schön hässlich werden.

10.07.2012 - 09:05 Uhr

EXEC sp_msforeachtable 'TRUNCATE TABLE ?'

Aber vorsicht: Das geht wirklich auf alle Tabellen. Notfalls schreib dir einfach einmal eine SP, die das macht und führe die SP aus.

06.07.2012 - 08:44 Uhr

Hallo,

sowas würde ich direkt über die Win API lösen. Also das nötige Interface IShellLink einbinden und nutzen. Der Link C# IShellLink COM Interop Example sollte dir weiter helfen.

30.06.2012 - 13:45 Uhr

Hallo herbivore,

ich habe die Konfiguration mit einer SSD (256GB) und einer HDD (1TB). Die Frage, wo man die Daten dann immer hinpackt, hatte sich eigentlich nie gestellt. Programme (Office, VS, etc.) und Sourcen packe ich immer auf die SSD (sonst ergibt sich während des kompilierens kein großer Vorteil). Große Datenmengen, wie z.B. Downloads, virtuelle Kisten oder Datenbanken kommen auf die HDD. Damit fahre ich nach meiner Erfahrung sehr erfolgreich und vor allem sehr schnell 😃

In unregelmäßigen Abständen prüfe ich die SSD immer auf Daten, die möglicherweise doch auf die HDD gehören. Gibt immer wieder mal Programme die meinen die Daten dahin packen zu wollen, wo die es wollen und nicht ich. Das ist vielleicht ein kleiner Nachteil. Aber ansonsten sehe ich keine. Mit Hybriden kenne ich mich nicht aus, da kann ich also nichts zu sagen.

Gruß
Khalid

06.06.2012 - 08:44 Uhr

Ich kenne mich mit Oracle nicht gut aus, aber es klingt auf dem ersten Blick nach einem Unicode/Nicht-Unicode Problem.

05.06.2012 - 11:29 Uhr

Der Context einer Connection ist 128 Byte breit und kann wie folgt gesetzt werden:


DECLARE @Ctx varbinary(128)
SELECT @Ctx = CONVERT(varbinary(128), 'Kontext-Daten')
SET CONTEXT_INFO @Ctx

Abrufen kannst du diese wieder über


CONTEXT_INFO()

D.h. bei jeder Connection die du öffnest, musst du die Context Daten schreiben und in den Triggern kannst du diese dann wieder abrufen.

29.05.2012 - 13:57 Uhr

Hallo,

klingt für mich auf den ersten Blick, dass deine Spaltendefinition nicht ein VARCHAR, sondern ein CHAR ist. Bei CHAR wird immer der gesamt reservierte Platz auch tatsächlich verwendet. Beim VARCHAR hingegen nur der genutzte Platz.

29.05.2012 - 13:56 Uhr

Das ActionPack ISV beinhaltet aber "nur" ein VS Pro. Aber ansonsten ist das auch ein gutes Angebot. Wobei das ActionPack ISV sich auch an nicht Startups richtet.

27.05.2012 - 08:32 Uhr

Startups bekommen meines Wissens nach Vergünstigungen, bzw. im ersten Jahr sogar kostenlos, beim MSDN Ultimate, wenn diese sich bei MS BizSpark anmelden und eine gewisse Vorraussetzung erfüllen. Dann kostet das Ding umgerechnet nur noch ein Bruchteil.

26.05.2012 - 15:54 Uhr

Such mal nach "Unattedned Setup/Install". Du kannst dem SQL Server Setup eine INI Datei mitgeben, in der alle Einstellungen vorkonfiguriert sind. Mit diesen Einstellungen wird dann der SQL Server installiert.

26.05.2012 - 12:09 Uhr

Benutze für sowas fertige Libraries, wie z.B. log4net.

11.05.2012 - 21:39 Uhr

Möglichkeit eins: Du hängst dich per EventToCommand Behavior (wie z.B. in MVVM Light) an das passende Event und löst somit ein Command aus.

Möglichjeit zwei: Du nimmst dir ein ItemTemplate und packst da ein Button rein. Per Style änderst du das Aussehen des Buttons und hängst das Template an das TreeViewItem.

11.05.2012 - 21:33 Uhr

Geht auch umgekehrt, nennt sich C++/CLI.

03.05.2012 - 08:16 Uhr

Ich kenn mich mit Access nicht aus, aber es gibt die folgenden Systemtabellen. Da ist garantiert was dabei, was dir weiterhilft:

MSysAccessObjects
MSysAccessXML
MSysACEs
MSysObjects
MSysQueries
MSysRelationships

24.04.2012 - 19:13 Uhr

Und wann testet ihr mit echten Daten?

Über anschließende Integrationstest, in dem die gesamten Workflows nochmal zusammengesetzt getestet werden. IMHO machen große Datenmengen bei Unit-Tests keinen Sinn. Ich kann mich da auch gerne irren 😃

Manchmal muss sowas auch auf Echtdaten laufen.

Da gebe ich dir vollkommen recht. Manuell kann ich jederzeit die Tests gegen Echt-DBs umschwenken (Sqlite, MSSQL, usw...). Passiert aber sehr selten, da dies halt die Integrationstests machen. Und die sagen mir auch früh genug bescheid, wenn was knallt, bzw. wenn bestimmte Timeouts überschritten werden.

24.04.2012 - 16:29 Uhr

sind Mocks nicht nur dazu da um Schnittstellen (Übergabepunkte) zu testen?

Das Laden der Daten läuft bei dir nicht über Interfaces? Kann ich mir fast nicht vorstellen.

Wie gesagt, ich kenne deine Architektur nicht. Das hängt IMHO von der Architektur ab. Meine "Lade dies und das" Tasks, holen ihre Daten z.B. über Mocks ab. Trotzdem kann ich die Logik dahinter testen. Die Daten sind zwar statisch, aber jeder Fall ist definiert.

Beispiel:


public interface ILadeTask
{
  IList<Daten> HoleDieDaten(DateTime von, DateTime bis);
}

public class LadeTask: ILadeTask
{
  private readonly IRepository<Daten> m_Repository;

  public LadeTask(IRepository<Daten> repository)
  {
    m_Repository = repository;
  }

  public IList<Daten> HoleDieDaten(DateTime von, DateTime bis)
  {
    return m_Repository.Where(x => x.Von >= von && x.Bis <= bis).ToList();
  }
}

Das Repository wird gemockt. Die Logik die korrekten Daten zu holen, liegt in der Implementation des Interfaces ILadeTask. Per IoC werden in den Tests jetzt die "statischen" Repositories reingeklinkt.

Keine Ahnung, ob dies jetzt der 100% richtige Weg ist, aber ich fahre damit sehr gut. Bei Massendaten kann ich somit z.B. das Mock Repository gegen ein z.B. Sqlite DB Repository jagen und mein ILadeTask tut immer noch das was es soll.

24.04.2012 - 15:09 Uhr

Tests sollten im Normalfall immer unabhängig voneinander laufen.

In deinem Fall sollte der Speichern Test natürlich in eine DB schreiben um zu schauen, ob die Daten korrekt ankommen. Das Laden hingegen sollte natürlich vom Schreiben unabhängig sein. Sprich die Daten müssen schon da sein. Sowas lößt man dann normalerweise über Mocks, die die entsprechenden Daten bereitstellen. Ich kenne deine Architektur nicht, aber wenn du z.B. mit Repositories arbeitest, ist es relativ simpel sowas zu mocken.

24.04.2012 - 11:24 Uhr

Wenn du hier so eine Art Offlinefähigkeit für die Clients einbauen willst - so sieht es jedenfalls aus für mich - dann verwende nie nicht nie INT als PrmaryKey, sondern GUIDs.

17.04.2012 - 08:55 Uhr

Hi,

Parameter funktionieren nur bei DML Abfragen. Nicht bei DDL, DCL oder TCL. ALTER LOGIN ist ein DDL Befehl.

Die Begriffe bitte selber nachschlagen 😃

29.03.2012 - 07:50 Uhr

Moin,

das Problem wird sein, dass der SQL Express den TCP-Port von Haus aus deaktiviert. Den musst du erst aktivieren (nennt sich auch Remotezugriff). Das hat mit den Instanznamen rein gar nichts zu tun.

09.03.2012 - 14:56 Uhr

Die centron GmbH wird das Microsoft SQL Server 2012 Betahosting bis zum Erscheinen der finalen Version kostenlos zur Verfügung stellen, ...

Deswegen?

09.03.2012 - 13:47 Uhr

Der SQL Server 2012 RTM ist soeben freigegeben wurden für alle MSDN und TechNet-User. Damit ist das Angebot ja hinfällig, oder?

27.02.2012 - 09:00 Uhr

Ist schwer zu sagen, ohne genauere Details.

Werden die Daten immer nur über einen bestimmten Zeitraum abgefragt? Dann würde hier Filtered Index sehr gut greifen. Ebenfalls sollte man in regelmäßigen Abständen über eine Partitionierung nachdenken (z.B. alle 6 Monate eine neue Partition).

Ein sehr wichtiger Punkt ist die Hardware, bzw. die I/O. Es nützt nichts, das hunderte Datensätze pro Tag eintrudeln, wenn die I/O dahinter der letzte Rotz ist. Das Backup der Datenbank kann dir hier auch voll reingrätschen, wenn alles über die gleiche Leitung geht.

Die Menge der Daten ist meist unwichtig. Die Infrastruktur ist das A und O.

24.02.2012 - 09:41 Uhr

Implementieren musst du dies selber, das stimmt 😃

Ein Automatismus gibt es da nicht. Wie gesagt, es gibt da einige Frameworks die dir das abnehmen könnten. Z.B. Thinktecture DataObject, oder auch CLSA.NET. Bei beiden musst du allerdings schauen, ob die in deine momentane Architektur passen.

Wenn du was eigenes bauen willst, müsstest du im BeginEdit eine Art Deep Copy deine Objektes erzeugen und ggf. im CancelEdit die Kopie wieder auf das eigentliche Objekt zurückschieben. Bei Objekten ohne Collections ist dies noch relativ einfach. Sobald aber Collections, oder sogar Nested Collectiosn vorkommen, wird es schon interessanter.

24.02.2012 - 08:38 Uhr

Moin,

deine Objekte sollten IEditableObject implementieren. Dann kannst du auf den Objekten BeginEdit, EndEdit und für sich dann wichtig CancelEdit aufrufen.

Dazu gibt es genug im Netz zu finden. Auch schon fertige Libraries die dich dabei unterstützen könnten.

24.02.2012 - 08:25 Uhr

Moin,

wie nicht anders zu erwarten, gibt es pünktlich zur Windows 8 Beta - tschulding, Consumer Preview - die Beta zu Visual Studio 11 inklusive Going-Live Lizenz. Die meisten wissen dies wahrscheinlich schon.

Visual Studio 11 Beta bald verfügbar

Was mich von eurer Seite aus mal interessieren würde, wie gefällt euch die UI? Ich persönlich finde die total genial. Absolut kein firlefanz mehr. Das einzige was mich etwas stört sind die doch "total farbenfrohen" Icons, da man sich seit VS2005 immer an die gleichen Icons gewöhnt hat. Nun sehen die jetzt halt anders aus, bzw. einfarbiger 😃

22.02.2012 - 19:07 Uhr

Hier mal der Trigger. Der ist für jede Tabelle gleich:


CREATE TRIGGER [YourSchema].[YourTable_Trigger] on [YourSchema].[YourTable]
FOR INSERT, UPDATE, DELETE
AS
	DECLARE @InsertedXml XML
	DECLARE @DeletedXml XML
	SET @InsertedXml = (SELECT * FROM inserted FOR XML AUTO)
	SET @DeletedXml = (SELECT * FROM deleted FOR XML AUTO)
	EXEC SaveAudit @InsertedXml, @DeletedXml

GO

Die SaveAudit Procedure ist die folgende. Allerdings etwas vereinfacht, müsste aber so funktionieren.


CREATE PROCEDURE [YourSchema].[SaveAudit]
	@OldValues XML,
	@NewValues XML
AS
	SET NOCOUNT ON
	DECLARE @TableName VARCHAR(128)
	DECLARE @SchemaName varchar(128)
	DECLARE @SystemUser varchar(80)
		
	SELECT @SystemUser=system_user

	SELECT 
		@TableName = OBJECT_NAME(resource_associated_entity_id),
		@SchemaName = OBJECT_SCHEMA_NAME(resource_associated_entity_id)
	FROM sys.dm_tran_locks 
	WHERE request_session_id = @@spid and resource_type = 'OBJECT'

	INSERT INTO Audit (TableName, SchemaName, SystemUser, OldValue, NewValue)
	VALUES (@TableName, @SchemaName,  @SystemUser, @OldValues, @NewValues)
GO

Der interessante Part ist das Auslesen der Audit Tabelle. Ich muss meine vorhandene dazu mal ein wenig umbauen, da in der jetzigen SP bissl zu viel drin ist. Wenn ich die vereinfachte Version fertig habe, poste ich die hier.

Damit du ungefähr weißt was in der SP passiert. Anhand des aktuellen Schemas der jeweiligen Tabelle wird ein dynamisches SQL zusammengebaut. Das SQL wird dann eigentlich schlussendlich ausgeführt. Der Xml Part ist nur etwas hässlich wegen dem dynamischen SQL. Ziemlich viel Stringfrickelei.