Zum Inhalt springen

.NETter

Mitglieder
  • Gesamte Inhalte

    177
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von .NETter

  1. Hallo, kannst Du mal das SQL aus dem Trigger oder der Prozedur posten? Gruß, Thomas
  2. Hallo, ich kann Dr.Dimitri da nur zustimmen. Ein Wert der geändert wird ist als PK gänzlich ungeeignet. Anstatt wie in Oracle eine Sequence zu verwenden (die gibts im SQL Server in diesem Sinn nicht) definierst Du den neuen PK als [iNT IDENTITY(1,1)]. Somit hast du einen PK vom Typ INT welcher sich selbsständig inkrementiert. Ein Trigger könnte in etwas (nur ein Vorschlag) so aussehen: CREATE TRIGGER PID_Trigger ON dbo.Produkt AFTER UPDATE AS BEGIN DECLARE @PIDvorher char(2) DECLARE @PIDnachher char(2) SELECT @PIDvorher = PID FROM DELETED SELECT @PIDnachher = PID FROM INSERTED IF(@PIDvorher <> @PIDnachher) BEGIN UPDATE dbo.Kauf SET PID = @PIDnachher WHERE PID = @PIDvorher END END Die PID soll ja nur in der Tabelle Kauf geändert werden wenn sie einen neuen Wert erhalten hat... Viele Grüße, Thomas
  3. Hallo, um hier nicht alle Schlüssel von Hand anlegen zu müssen, würde ich das Statement meines Vorgängers zum Erstellen der Tabelle auswählen. Ansonsten könnte man auch ein "SELECT * INTO NeueTablle FROM VorhandeneSicht" ausführen. Um die Daten allerdings zu kopieren würde ich eher zu einem SSIS (SQL Server Integration Services)-Paket greifen. Da ich mal davon ausgehe, dass eine große Menge Daten kopiert werden muss. Hier wäre SSIS einfach schneller. Aber eine Frage mal vorweg... Wo liegt denn das Performanceproblem? Zu viele Festplattenzugriffe, zu wenig vorhandener Arbeitsspeicher? Und um welche Version des SQL Server gehts denn eigentlich (2000, 2005 oder 2008)? Viele Grüße, Thomas
  4. Hallo ! Ein Tabellenname kann nicht parametrisiert werden. Dies ist der Fehler. Der SQL Server kann so keinen Ausführungsplan erstellen wenn er nicht weiß um welche Tabelle es sich handelt... Kannst Dir höchstens mit dem Parameter einen String zusammenbasteln und diesen dann über Execute ausführen. Ist aber eine nicht empfehlenswerte Lösung. Gruß, Thomas
  5. Schau mal hier: FILESTREAM-Daten in SQL Server 2008 (ADO.NET)
  6. .NETter

    Select *+???

    Bei dieser Variante wirst Du auch Probleme mit den Datentypen bekommen. Ist hier ein int-Wert oder ähnliches dabei wird es nicht funktionieren. Es sei denn Du wandelst ihn explizit in einen kompatiblen Datentyp um. Wenn Du nur Spaltenname und deren Typ anhand des Tabellennamen ermitteln möchtest, könntest Du Systemsichten bemühen: SELECT so.Name AS Tabelle, sc.name AS Feld, st.[name] AS Datentyp FROM sys.objects so LEFT JOIN sys.columns sc ON so.object_id = sc.object_id LEFT JOIN sys.types st ON sc.system_type_id = st.system_type_id WHERE [type] = 'U' AND st.system_type_id = st.user_type_id AND so.[Name] = 'Mitarbeiter' Aber wozu benötigst du eine derartige Konkatenierung der Feldwerte? Vielleicht gibts da noch einen anderen Weg wenn Du das Ziel verrätst. Gruß, Thomas
  7. Hallo! Es könnte so aussehen: UPDATE dbo.TabTarget SET num12 = CASE WHEN [type] = '1' THEN 1 ELSE NULL END, num13 = CASE WHEN [type] = '2' THEN 1 ELSE NULL END, num14 = CASE WHEN [type] = '3' THEN 1 ELSE NULL END, num15 = CASE WHEN [type] = '4' THEN 1 ELSE NULL END Vorausgesetzt [type] ist ein Char-Wert und die num-Felder sind Int-Werte. Viele Grüße, Thomas
  8. Hallo, da ihr einen SharePoint Server oder WSS einsetzt, habt ihr doch eh den IIS als Webserver im Einsatz. Falls Du hier nicht SharePoint nutzen willst oder kannst... Einfach eine neue Website unter einem beliebigen neuen Port erstellen (Port 80 ist zu 99,9% die SharePoint Standardwebsite). Dann kannst Du das ganze mit ASPX handeln. Visual Web Developer (Express) herunterladen, welches kostenlos ist und eine neue Website erstellen und diese auf der erstellten Website im IIS veröffentlichen. Zum Thema Datenbanken und ASPX gibt es unzählige Tutorials im Netz. Ich denke die einfache Aufnahme von Ideen sollte auch für einen Anfänger in diesem Bereich gut umzusetzen sein.
  9. .NETter

    Arbeitsspeicher Freigeben

    Zum Beispiel um mehr Arbeitsspeicher für Anwendungen frei zu geben. Wie auch der SQL Server nutzen manche Anwendungen so viel Arbeitsspeicher wie zur Verfügung steht, geben diesen aber sofort frei wenn andere Anwendungen ihn benötigen. Beispiel SQl Server... Es ist genügend RAM für alle Anwendungen frei, was heißt der GC läuft nur los wenn er es gerade für richtig hält und genügend CPU-Zeit verfügbar ist. Der Speicher den ich nun mit meinen Objekten belege, die eigentlich entsorgt werden könnten, bleibt belegt und der SQL Server kann ihn nichts nutzen, was dazu führt, dass er nicht so viele Daten in den Speicher laden kann wie er gerne würde und immer wieder auf die Platte zugreifen muss um Abfragen bedienen zu können. Das hat zur Folge das der SQL Server "langsamer" wird obwohl eigentlich mehr Speicher (den ich mit meinen entsorgbaren Objekten belege) zur Verfügung stehen könnte. Der GC wird keine Speicherknappheit erkennen, da der SQL Server nicht mehr Speicher anfordert und eben nur den nutzt der auch zur Verfügung steht. Habe ich nun eine Anwendung geschrieben die auch noch hohe CPU-Zeit erfordert, was den GC-Durchlauf zeitlich erstmal weiter nach hinten schiebt, wird der SQL Server immer mehr Speicher frei geben um Platz für meinen Objekte-Friedhof zu machen. Irgendwann wird der GC dann greifen, aber bis dahin geht die Performance vom SQL Server oder einer anderen Anwendung erstmal runter. Das ist denke ich ein guter Grund den GC durchaus mal von Hand zu bemühen. Natürlich, wie gesagt immer gezielt.
  10. .NETter

    Arbeitsspeicher Freigeben

    Es ist durchaus manchmal vorteilhaft den GC manuell anzustoßen. Auch wenn viele der Meinung zu sein scheinen, dass der Mechanismus des GC "gottgegeben genial" ist. Er arbeitet zugegebener Weise recht gut. Sind Ressourcen allerdings sehr knapp kann es sehr wohl einen Vorteil bieten den GC per Hand zu bemühen. Der GC ist ein Dienst mit sehr niedriger Priorität, was bedeutet dass dieser natürlich nur dann seinen Dienst aufnimmt wenn genügend CPU-Zeit zur Verfügung steht oder die Ressourcen sehr kritisch werden. Der GC speichert Informationen zu allen referenzlosen Objekten der 0´ten (nullten) Generation. Ohne ein explizites .Dispose() (und .SuppressFinalize...) am Objekt wird der GC dieses Object an den Finalizer übergeben. Dieser wird wiederum in einem nächsten Zyklus (also schon 2) die Finalize-Methode aufrufen. Wenn jetzt z.B. die CPU-Zeit wieder knapp werden sollte wird der GC seine Arbeit wieder einstellen und keine weiteren Generationen von Objekten mehr bearbeiten und sie werden im Speicher weiterleben. Im übrigen nutzen wir das "ALLE" jeden Tag in unserem Code! using (SqlCommand cmd = new SqlCommand(...)) { // Code... } Um einen "using"-Block nutzen zu können muss das dort instanzierte Objekt IDisposable implementieren! Bei der schließenden Klammer wird dann intern explizit die Methode ... .Dispose() aufgerufen. Man sollte das manuelle anstoßen des GC nur gezielt einsetzen, das ist korrekt. Wenn eine manuelle Optimierung der Speicherressourcen aber nötig ist kann man dies auch guten Gewissens tun. Kleiner Ausschnitt aus dem MSDN:
  11. .NETter

    Arbeitsspeicher Freigeben

    Naja gut eine einzelne Variable vom Typ int zu entsorgen finde ich etwas überzogen. Die fressen kaum Speicher. Wenn Du Deinen Klassen beibringen möchtest sich zerstören zu können (.Dispose()), kannst Du das Interface IDisposable nutzen. Die Methode des Interface implementieren und fertig. In etwa so: public class MyClass[COLOR="Red"] : IDisposable[/COLOR] { int alter; string name; [COLOR="red"] #region IDisposable Member public void Dispose() { this.Dispose(); } #endregion[/COLOR] }
  12. .NETter

    Arbeitsspeicher Freigeben

    Hallo, man sollte hier GC.Collect() nicht mit einem direkten Befehl an den GC verwechseln. Mit GC.Collect() kann man den GC ausschließlich darum "bitten" es zu tun. Ob er es tut liegt nicht in unserer Hand! Ausserdem sollte man am Objekt vor einem initialen Aufruf des GC ein .Dispose() am Objekt ausführen um das Objekt zu "zerstören" ein = null entfernt lediglich den Verweis auf das Objekt, welches aber erstmal im Speicher existent bleibt bis der GC entschieden hat ob es vernichtet wird. So sollte der GC das nicht mehr benötigte Objekt auch direkt aus dem Speicher entsorgen. Viele Grüße, Thomas
  13. Hallo, die Sortierung ist korrekt. Mal angenommen man hat vier Tabellen: Land, Stadt, Strasse, Hausnummer. (nur als Beispiel...) Erstellst Du einen Join wie Du ihn oben erstellt hast so erhältst Du erst alle Länder schön sortiert. Die Sortierung der ersten Spalte steht somit fest. Jetzt werden in der nächsten Spalte die Städte ausgegeben... (sortiert innerhalb des Landes!) Sollte hier ein Land vorkommen zu dem keine Städte eingetragen sind (also Stadt ist NULL) so wird dieses NULL natürlich neben dem Land auftauchen bei dem es NULL ist. So kann es auch in der Mitte oder unten stehen. So zieht sich das durch alle abgefragte Tabellen. Wenn Du dort NULL Werte drin hast wirst Du höchstens eine Sortierung in dieser Form erreichen. 1|0|0|0 1|1|0|0 1|1|1|0 1|1|1|1 1|0|0|0 1|1|1|1 usw. Somit ist dies kein Fehler sondern logisch völlig korrekt, weil Du ja nicht die NULL Werte (in z.B. eine andere Stadt) verschieben kannst, nur damit es besser aussieht. Viele Grüße, Thomas
  14. Vielleicht könnte es in etwas so aussehen Die Übertragungsnummer kann man zur Identifizierung des Laufs (Du bekommst ja alle 5 Minuten eine Tabelle) nutzen. Ich weiß nicht ob Du alle Quotentabellen eines Rennens für ein Pferd speichern willst oder immer nur die Letzte. So hast Du die Wahl alle zu speichern oder anhand der Übertragungsnummer "veraltete" Sätze gleich zu löschen und somit wieder Platz zu sparen.
  15. Das denke ich nicht. Denn hier steht weder etwas von einem Pferd (für jedes Pferd eine Tabelle) noch etwas von einem Rennen (für jedes Rennen und jedes Pferd eine Tabelle). Wo steht der Name (oder Numemr) des Pferdes oder des Rennens. Irgendwie muss ich diese Tabelle ja einem Pferd und einem Rennen zurodnen können.
  16. Hallo, wie sieht denn überhaupt die Struktur der gelieferten Daten aus? Ich kann mir den Aufbau der Daten aus dem Webservice noch nicht so ganz vorstellen. Für jedes Pferd eine Tabelle zu erstellen ist wie FinalFantasy schon gesagt hat natürlich völlig daneben. Daher müsste man eben wissen welche Daten ankommen und in welcher Struktur. Vielleicht mal einen Beispieldatensatz?
  17. Hi, Deine Sortierung läuft erstmal nach alphabetischer Reihenfolge unabhängig von der Länge des Strings. Diesen musst Du auch sortieren. Angenommen man sortiert erst nach der Länge und dann in alphabetischer Reihenfolge, dann erhältst Du den besagten Baum. Ungefähr so: SELECT table1.name1, table2.name2, table3.name3, table4.name4 FROM table1 LEFT OUTER JOIN table2 ON table1.name1 = table2.name2 LEFT OUTER JOIN table3 ON table2.name2 = table3.name3 LEFT OUTER JOIN table4 ON table3.name3 = table4.name4 ORDER BY LEN(table1.name1), table1.name1, LEN(table2.name2), table2.name2, LEN(table3.name3), table3.name3, LEN(table4.name4), table4.name4 das Ergebnis sähe etwas so aus: X XX XXX X XXX XXXX X XX Oder Du sortierst erst alles nach der Länge und dann alphabetisch: SELECT table1.name1, table2.name2, table3.name3, table4.name4 FROM table1 LEFT OUTER JOIN table2 ON table1.name1 = table2.name2 LEFT OUTER JOIN table3 ON table2.name2 = table3.name3 LEFT OUTER JOIN table4 ON table3.name3 = table4.name4 ORDER BY LEN(table1.name1), LEN(table2.name2), LEN(table3.name3), LEN(table4.name4), table1.name1, table2.name2, table3.name3, table4.name4 Dann würde das Ergebnis so aussehen: X XX XXX XXXX XXXXX Viele Grüße, Thomas
  18. Hallo, wie speicherst Du denn die Daten bisher? Welche Datenbank nutzt Du? Hast Du zu jedem Pferd eine eigene Tabelle? Wie werden diese befüllt und wie wieder ausgelesen? (SQL-Statements) (das mit den Pferden erinnert mich doch sehr stark an ein Praktikum in Essen ) Gruß, Thomas
  19. Hallo, da aller Anfang (besonders im Bereich ADO .Net) etwas schwer ist, hat es mir damals geholfen einfach Code zu sehen und diesen durchzuarbeiten. Den Tipp mit der Auslagerung in Klassen würde ich auf jeden Fall noch umsetzen, dass macht es Dir später wesentlich einfacher Deinen Code zu warten und auch nach 2 Jahren noch zu verstehen. Ich habe hier mal eine Konsolenanwendung die auf sehr einfache Weise die Accessdatei nach einem Benutzer mit korrektem Kennwort durchsucht. Achte auf die USING-Direktive im Kopf die bindet den Namensraum OleDB ein. Dazu solltest Du Dir unbedingt etwas Grundwissen aneignen, wie mein Vorgänger es auch schon gesagt hat. Hier der Code (Als Konsolenanwendung ): using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.OleDb; namespace ReadAccess { class Program { static void Main(string[] args) { Console.WriteLine(String.Format("Benutzer {0} Zugang gewähren: {1}", "Bill", GetAccessData("Bill", "Gates"))); Console.ReadKey(); } public static bool GetAccessData(string Benutzername, string Passwort) { Boolean zugriffErlauben = false; using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb")) { using (OleDbCommand command = new OleDbCommand("SELECT COUNT(*) FROM Benutzer WHERE benutzername=? AND passwort=?", con)) { command.Parameters.Add(new OleDbParameter("@p1", Benutzername)); command.Parameters.Add(new OleDbParameter("@p2", Passwort)); con.Open(); zugriffErlauben = Convert.ToInt32(command.ExecuteScalar()) > 0; con.Close(); } } return zugriffErlauben; } } } Viele Grüße Thomas
  20. Hallo, ersteinmal müsste ich wissen um welche Version des SQL Server es geht. Reporting Services gibt es seit dem SQL Server 2000 (dort zum Nachinstallieren) bis zum 2008´er. Hier mal eine Übersicht für die VS-Versionen und den dazu nutzbaren Reporting Services: SQL Server 2000 --> Visual Studio 2003 (.net) SQL Server 2005 --> Visual Studio 2005, Visual Studio 2008 SQL Server 2008 --> Visual Studio 2008 Um lediglich Reports in Visual Studio zu entwickeln reicht das in der SQL Server Installation enthaltene "Business Intelligence Development Studio" (BIDS) völlig aus. Dies kann bei einer Installation des Servers mit installiert werden. Ich glaube das kann man aber auch ohne den Server selbst installieren. Es ist ein Visual Studio, dass Dir nur den Projektbereich Business Intelligence bietet. Das heißt also BIDS ist ein Teil des SQL Servers und nicht zwingend eins des Visual Studio. Es integriert sich aber in ein bestehende Installation von VS. Meine Empfehlung... SQL Server Developer Edition (ca. 60€). Den kannst Du dann auf Deinem Arbeitsrechner installieren. Somit erhältst Du das BIDS und eine sehr gute Testumgebung! Die Developer Edition ist technisch der "große" SQL Server, also die Enterprise Edition. Und sie hat den Vorteil, dass man sie auf einem "nicht"-Serverbetriebssystem installieren kann. (Geht nicht bei Enterprise und Standard). Bei der Entwicklung bleibt es natürlich Dir überlassen welche Datenquellen Du für den Report nutzt, lokal (vielleicht für Tests) oder einen entfernten SQL Server (auf dem Du momentan entwickelst). Du kannst die Reports dann einfach vom Arbeitsrechner auf dem produktiven SQL Server bereitstellen. Das heißt, Du brauchst eigentlich garkein explizietes VS zu installieren. Visual Studio Express Edition hat standardmäßig keine Funktionalitäten wie BIDS. Hier kann man aber für die Express Editions des SQL Server ein Toolkit herunterladen welches dann den Zugriff auf die Reporting Services einer SQL Server Express Edition (with advanced Services) über eine BIDS-Version ermöglicht. Mit diesem kannst Du aber wiederum nicht auf "große" SQL Server zugreifen. Hoffe das hilft Dir etwas weiter! Viele Grüße, Thomas
  21. Hallo, schau Dir mal diesen Link an. SSRS and LDAP Vielleicht hilft Dir das weiter. Beim Auslesen des LDAP kann es unter Umständen zu starken Performanceproblemen kommen wenn man nicht wirklich nur das abfragt was man benötigt! Viele Grüße, Thomas
  22. Hallo, ja der Timer von Windows wird so nicht greifen. Ich habe hier mal etwas funktionsfähigen Code: public partial class WriteService : ServiceBase { System.Timers.Timer tim = new System.Timers.Timer(10000); public WriteService() { InitializeComponent(); } protected override void OnStart(string[] args) { tim.Enabled = true; tim.Elapsed += new System.Timers.ElapsedEventHandler(tim_Elapsed); using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true)) { sw.WriteLine("Service has started at " + DateTime.Now.ToLongTimeString()); sw.Close(); } } void tim_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true)) { sw.WriteLine("Service is running " + DateTime.Now.ToLongTimeString()); sw.Close(); } } protected override void OnStop() { using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true)) { sw.WriteLine("Service has stopped at " + DateTime.Now.ToLongTimeString()); sw.Close(); } } } Der Service schreibt in eine datei wenn er startet, beendet wird und zwischendurch (Timer) alle 10 Sekunden. Viele Grüße, Thomas
  23. Hallo, ich würde den Dienst ganz einfach debuggen... Da sich ein Dienst nicht mittels F5 starten lässt muss man die Dienstanwendung "Neu erstellen" und zwar im Debug-Modus (Release kopiert die .pdb-Datei nicht mit). Anschließend wird der Dienst installiert (Setup basteln oder installutil.exe nutzen) und gestartet. Wenn man das entsprechende Projekt nun im Studio noch geöffnet hat kann man sich hier an einen Prozess anhängen (Extras-->An Prozess anhängen). Hier muss dararauf geachtet werden dass alle Prozesse aller Benutzer angezeigt werden (Checkboxen im unteren Bereich der Prozessauflistung). Dann wird der entsprechende Dienst aus der Liste ausgewählt, noch ein klick auf "Anfügen" und fertig. Jetzt kann man im Quellcode wie gewohnt Haltepunkte an gewünschte Stellen setzen und der Prozess wird dort anhalten. Und man kann mit F10 Schritt für Schritt durch den Code wandern. So sollte man den Fehler recht schell finden können. Viele Grüße, Thomas
  24. Es wäre sehr nett wenn Du uns noch verraten würdest wie Deine Lösung aussieht...
  25. Hallo, ja auf dem entfernten Rechner (Client) musst Du eben eines der Clienttools installieren. Die Express Editions sind selbst für den Produktiveinsatz völlig kostenlos. Schau mal: SQL Server 2008 R2 Von daher hättest Du Dir das Geld für den 2000´er vielleicht sogar ganz sparen können Du kannst natürlich mit allem Möglichen auf den SQL Server zugreifen und nicht nur mit den Clienttools. Excel und Word können Dir auch Daten auslesen. Oder Du benutzt Access und verbindest Dich mit dem SQL Server. Gruß, Thomas

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...