Hallo,
auch wenn das Thema älter ist - dass das Transaktionlog voll läuft liegt dann vermutlich am fehlenden Transaktionlog-Backup.
Schau dir mal diesen Artikel an, wenn es für dich noch relevant ist: https://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/back-up-a-transaction-log-sql-server?view=sql-server-ver16
Hi,
schau dir deinen Code nochmal genau an und dann versuche zu verstehen, was Abt meint.
Du vermischt hier Äpfel mit Birnen und das ist bekanntlich nicht gut.
P.S.: PeriodicTimer sind aus meiner Sicht Goldwert wenn sie korrekt genutzt werden.
Hi,
ich bin persönlich kein Freund davon soviel Daten auf einmal zu laden. Gleiches hat Abt ja auch schon geäußert.
Warum holst du dir nicht n-Datensätze (meinetwegen 100) und baust ein paginiertes DataGrid (10 Seiten á 10 Datensätze z.b.) und lädst dann den Rest nach Bedarf nach?
Das spart Ressourcen. Schau doch einfach mal, wie viele Datensätze auf deinem Bildschirm sichtbar sind, und richte es erstmal darauf aus.
Was der SQL Server kann muss noch lange keine UI Anwendung können 😃.
Schau dir mal das Property / RenderFragment Header an - das sollte lt. API hilfreich sein:
Allows adding a custom header beyond that specified in the Column component. Add HeaderCell components to add a custom header.
Ist die Beschreibung von der offiziellen Seite.
Hi,
ich würde dir empfehlen das Grid zu nutzen anstatt der Table.
Das Grid hat deutlich mehr Möglichkeiten Out-of-the-Box. Wenn du bei der Table sowas brauchst, musst du es selbst programmieren. Ansonsten schau bei der Verwendung vom Grid hier:
https://stackoverflow.com/questions/75937752/mudblazor-muddatagrid-cell-click-event
Schau dir mal https://github.com/avmaisak/Gcode an.
Die Beschreibung ist zwar auf Russisch aber sagt übersetzt (Deepl) folgendes aus:
G-Code ist eine gängige Bezeichnung für eine Programmiersprache für numerisch gesteuerte Geräte (NC).
Die letzte Überarbeitung wurde im Februar 1980 als Norm RS274D genehmigt.
Das ISO-Komitee genehmigte den G-Code als ISO 6983-1:2009, das staatliche Komitee für Normen der UdSSR als GOST 20999-83.
In der sowjetischen Fachliteratur wird der G-Code als ISO 7-Bit-Code (ISO 7-bit) bezeichnet.
Der G-Code wurde auf 8-Spur-Lochstreifen im ISO-7-Bit-Code kodiert (zur Darstellung von CNC-Informationen in Form von Maschinencode wie bei den Codes AEG und PC8C), die achte Spur wurde für die Paritätskontrolle verwendet.
Übersetzt mit DeepL.com (kostenlose Version)
Der Timeout kommt definitiv nicht vom Client - das ist vom "Host" abhängig. Abt hat an der Stelle vollkommen recht - da gibt´s gerne einen Timeout nach 40 - 45 Sekunden.
Ein ähnliches Thema gab´s vor ~2 Jahren bei Stackoverflow (ist zwar Python aber das Problem ist das Gleiche): python - Arduino stops working after 40 sec of serial communication with the computer - Stack Overflow
Hi,
ins Blaue geschossen: hast du schon StateHasChanged() aufgerufen?
Hi,
was genau wollt ihr denn Analysieren? Eine Query über Linked Server wäre denkbar.
"Sowas" wird auch gerne für Abfragen über unterschiedliche DB-Anbieter genutzt.
ABER: Das ist teils nicht wirklich zügig.
Musste dahingehend selbst mal eine Oracle DB mit ner MS SQL DB verheiraten - fragt bitte und besser nicht warum...
War lahm, erfüllte letztendlich aber seinen Zweck.
Erstelle 2 UserControls, siehe auch: https://www.c-sharpcorner.com/UploadFile/7d3362/user-control-in-C-Sharp/, dann verpasse denen ein entsprechendes Label, Background, What-ever um den entsprechenden State darzustellen.
Erzeuge in deiner Hauptform (vermutlich Form1 oder, falls Namentlich angepasst, eben dieser).
Dann schreibst du deinen Code, und je nach ConnectionState, zeigst du dann das entsprechende UserControl an.
P.S.: Bitte formatiere deinen Code mit dem Code-Tag - sonst wird es schwierig das zu lesen.
Ist in der Config irgendwo ein Typo?
Setz den SQL Server nochmal frisch auf - kost ja nix beim SQL Express 😃.
Geh Schritt für Schritt alles durch.
<Offtopic>
Und kleiner Tip am Rande: Nach der Installation vom SQL Server bekommst du einen kleinen schmalen Hinweis auf ein Config-File. Sichere dir die Dinger weg. Dann kannst du die SQL Installation über diese Config Files laufen lassen. - >das mal as OT
</Offtopic>
Abt hat vollkommen recht mit dem was er schreibt (wie so oft).
Die Frage die sich mir stellt:
Ist der SQL Server auf dem gleichen System installiert wo die App zum "rumklickern" hin soll?
Wenn nein, dann schau mal ob die Firewallregeln am Zielsystem stimmen (1433 TCP, 1434 UDP) und ob Pakete gedropped werden (=> Logeinstellungen in der Windows-Firewall für das jeweilige Profil).
Schau ebenfalls mal nach, ob in den SQL-Protokoll Einstellungen (services.msc...) TCP/IP / Named-Pipes aktiv ist. Ich habe in den letzten Jahren vermehrt feststellen müssen, dass die Kommunikation daran scheitert.
Hallo Abt,
hallo TH69,
danke für die Info 🙂.
Ich werde das Projekt nochmal neu anfangen - war Gott sei Dank noch nicht so weit.
Werde mir dabei eure Links und Ratschläge zu Herzen nehmen.
PS: Die Entitäten-Klassen sollten besser in der Einzahl benannt sein, also User, MatchCode, Document.
Danke dir TH69 - werde ich noch korrigieren. Die Links lese ich mir gerade durch.
Wichtigster Punk bei EF Core: Mische keine Annotations mit der Fluent API.
Das ist fürchterlich für die Übersicht. Recommendation ist: Fluent API.
Habe die Annotations raus genommen und "versuche" das nun über die Flusend API zu realisieren.
Das Konstrukt sieht nach einem bösen Workaround aus, wo Du aus einer Entiätsinstanz auf eine globale Klasse zugreifen willst.
return App.ModelContext.FileTypes.Where(x => x.ID == DocumentType).FirstOrDefault().FileType;
Copy
Warum ist das da drin? Eine Entität sollte eine "dumme" Datenklasse sein und nichts ausführen.
Habe ich rausgenommen - war auch nicht in Verwendung und sollte "nur" zum testen dienen.
Ich habe die IDs innerhalb der Entitäten nun vorläufig umbenannt - ich möchte das aber auch noch nach TH69's Vorschlag in den Singular ändern.
Würde aber vorher gerne das Problem verstehen und lösen damit ich damit nicht am laufenden Band auf die Nase falle.
In wie weit meinst du Verletzung der Keys? Könntest du mir da einen kleinen Tipp geben?
Verwendetes Datenbanksystem: MSSQL Developer Edition
Hallo zusammen,
ich habe seit ein paar Tagen ein Problem wo ich trotz Recherche nicht weiterkomme.
Ich habe ein EF Modell und die entsprechenden Klassen auf Basis einer SQL-Datenbank aufgebaut.
Wenn ich nun einen neuen Datensatz hinzufügen möchte erhalte ich folgenden Fehler:
Fehlermeldung:
System.InvalidOperationException: "The value of 'Documents.ID' is unknown when attempting to save changes. This is because the property is also part of a foreign key for which the principal entity in the relationship is not known."
Ich kann nicht wirklich ausmachen welche Tabelle das Problem verursacht - vermute aber die Tabelle Matchcodes.....
Die Klassen zu den beiden Entitäten "Matchcodes" und "Documents" sehen wie folgt aus:
Matchcodes
public class Matchcodes
{
[Key]
public int ID { get; set; }
public string Matchcode { get; set; }
public int DocumentsID { get; set; }
public virtual Documents Documents { get; set; }
}
Documents
public class Documents
{
private ILazyLoader LazyLoader { get; set; }
public Documents()
{
_matchcodes = new HashSet<Matchcodes>();
_documentNotices = new HashSet<DocumentNotices>();
}
private Documents(ILazyLoader lazyloader)
{
LazyLoader = lazyloader;
}
[Key]
public int ID { get; set; }
public string DocumentName { get; set; }
public int DocumentType { get; set; }
public decimal DocumentSize { get; set; }
public byte[] DocumentBinary { get; set; }
public string DocumentPath { get; set; }
public string DocumentOrigin { get; set; }
public int FolderID { get; set; }
public int Revision { get; set; }
public DateTimeOffset? CreationDate { get; set; }
public DateTime? DocumentDate { get; set; }
public int OriginalDocument { get; set; }
public bool ForAll { get; set; }
public int UserID { get; set; }
[NotMapped]
public bool Concat { get; set; }
[NotMapped]
public bool DoOCR { get; set; }
public FileTypes FileType { get; set; }
public DocumentsFullText DocumentsFullText { get; set; }
private ICollection<Matchcodes> _matchcodes;
public ICollection<Matchcodes> Matchcodes
{
get => LazyLoader.Load(this, ref _matchcodes);
set => _matchcodes = value;
}
private ICollection<DocumentNotices> _documentNotices;
public ICollection<DocumentNotices> DocumentNotices
{
get => LazyLoader.Load(this, ref _documentNotices);
set => _documentNotices = value;
}
[NotMapped]
public string FileTypeAsString
{
get
{
return App.ModelContext.FileTypes.Where(x => x.ID == DocumentType).FirstOrDefault().FileType;
}
}
}
Im Kontext selbst habe ich via Fluent API folgendes gesetzt:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Users>()
.HasOne(u => u.ProgramUsage)
.WithOne()
.HasForeignKey<Users>(x => x.ID);
modelBuilder.Entity<Documents>()
.HasOne(d => d.FileType)
.WithOne()
.HasForeignKey<Documents>(x => x.ID);
modelBuilder.Entity<Documents>()
.HasMany<Matchcodes>(x => x.Matchcodes)
.WithOne()
.HasForeignKey(x=>x.ID);
modelBuilder.Entity<Documents>()
.HasOne(d => d.DocumentsFullText)
.WithOne()
.HasForeignKey<Documents>(x => x.ID);
}
}
Ich habe schon ein paar Änderungen im Kontext durchgeführt und ein paar Dokus dazu gelesen aber ich vermute mal, dass ich irgendetwas grandios Missverstanden habe.
Habt ihr einen Denkanstoß?
Gruß,
D.
P.S.:
Falls Abt das lesen sollte - DateTime? sollte nicht verwendet werden - ist mir dank dir bekannt und wird auch noch geändert - aber zunächst möchte ich das andere Problem lösen 🙂
Hi renzH,
was sagt denn sfd.Filter wenn du einen entsprechenden Breakpoint setzt?
Entschuldige Abt, werde ich machen.
Danke gfoidl und th,
ich habe mich da echt beknackt ausgedrückt.
Gehen wir mal davon aus, es sind Metadaten vorhanden:
Name Datum Pfad Revision
Dok1 04.05.21 C:\temp... 1
Dok1 05.05.21 C:\temp... 2
Dok1 05.05.21 C:\documents... 1
Dok2 29.04.21 C:\... 1
Dok3 01.05.21 C:\documents... 1
Dok4 07.05.21 C:\documents... 1
usw.
Nun möchte ich für Dok1 in C:\temp alle Revisionen aufgelistet bekommen; nicht jedoch aber für Dok1 (was ein vollkommen
anderes Dokument - auch unabhängig der Revisionsnummer - sein kann.) aus c:\documents.
Ich habe es jetzt vorläufig so gelöst, dass ich eine weitere Spalte habe die mir bei einer weiteren Revision
die ID des Ursprungsdokumentes enthält.
Anschließend kann ich mit einem Union arbeiten. Das funktioniert erstmal.
Ist aber gewiss nicht der Weisheit letzter Schluss.
Gruß,
D.
Hallo,
Ich würde den Rat von Abt beherzigen - bau jetzt den Code im richtigen Pattern - sonst haste nachher ggf. das Problem, dass du in "alte" und somit ggf. falsche Muster zurückfällst.
Hast du denn mal Breakpoints gesetzt und geprüft ob listFach.SelectedValue != null && listJahrgang.SelectedValue != null wirklich true ist?
Eine Bedingung muss ja False sein, oder vorher eine Exception passieren, dass du dort nicht reinspringst.
Gruß,
D.
Verwendetes Datenbanksystem: MSSQL
Hallo zusammen,
entweder es liegt am Wetter oder ich stehe, was wahrscheinlicher ist, komplett auf dem Schlauch.
Ich habe eine Tabelle die Dokumente mit Revisionsnummern enthält.
Jetzt möchte ich mir aus meiner Anwendung die Einträge abrufen.
Problem besteht darin, dass ich derzeit keinen Anhalts- / Ansatzpunkt habe wie ich die Query aufbauen soll.
SELECT ??? FROM TABLENAME WHERE Name = @p1
Das Abrufen der Einträge, sofern nur ein Eintrag vorhanden ist, ist das ok, aber wenn mehr als eine Revision
vorhanden ist, hakt es halt.
Eine Hilfstabelle wäre noch denkbar, das wollte ich aber nach Möglichkeit vermeiden.
Habt ihr einen kleinen Denkanstoß?
Muss / soll auch keine Query geliefert werden - einfach nur ein Denkstoß.
Danke schonmal 🙂
Hallo,
bei der Verwendung von SELECT LAST_INSERT_ID() bekomme ich bei MariaDB nur einen Fehler.
Würde aber den Wert im Zweifel Zwischenspeichern und dann entsprechend nutzen.
Was würde denn gegen die Verwendung des EF sprechen? Da ist das PK-Handling imho einfacher....
Hallo,
ich denke, dass beste wäre das Binding für das entsprechende Element aufzuheben.
Schau mal hier: how to invisible a row of Datagridview ?
Hi,
ich würde jetzt aus dem Bauch heraus sagen, dass das mit InteractionTriggers funktionieren könnte.
Dabei kannst du auf die Events reagieren ohne im CodeBehind etwas machen zu müssen.
Folgender Namespace wäre entsprechend zu setzen:
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
Und wie man sehen kann: Ich bewegte mich bisher auch auf der völlig falschen Spur - danke Abt für den Hinweis.
Danke für die Korrektur @Abt - ich ging bisher davon aus, dass ein 3-Wege-Handshake ein Teil der Sicherheit ausmacht und somit zur Sicherheit beiträgt.....
Aus dem RFC 793 Seite 30 / 31
The three-way handshake
reduces the possibility of false connections. It is the implementation of a trade-off between memory and messages to provide information for this checking.....
Hallo,
entweder ich habe es übersehen / überlesen / die Brille nicht geputzt oder die Linse nicht drin aber:
Gibt es keine Möglichkeit mehr den Themenheader zu editieren?
Ich meine das nach der Umstellung mach gelesen zu haben aber irgendwie finde ich da nichts mehr zu 😦.
Sorry Abt falls ich da was wiederhole.
Grootjes,
D.
@teebeast: Braucht es ja gar nicht, wenn man auf die RelativeSource einen Zugriff hat. Dann passt das - siehe meinen Beitrag etwas weiter oben 🙂,
Aber deinen Beitrag habe ich mir gerne für die Verständnis mitgenommen - das könnte einiges vereinfachen; werde das mal testen. 🙂.
Hallo Loofsy,
das TCP Protokoll hat im Securitybereich einen 3-Wege-Handshake
Besser wäre es der Expertise von Abt und gfoidl zu folgen. Du bewegst dich damit in Layer 4 sprich dem Transportlayer - da würde ich tunlichst die Finger von lassen
wenn ich nicht weiß was ich da mache. Und da du offensichtlich, wie vermutlich viele von uns, einer davon bist - tu dir das nicht an.
Nutze wie gfoidl oder Abt das vorgeschlagen haben einen Vermittler.
gfoidl bekräftige ich in der Aussage - wenn jemand dazu drängt ein Handshake selbst zu entwickeln, dann ist er entweder in den Layern unterwegs und kennt sich damit aus
oder er hat schlicht keine Ahnung.
Wenn möglich - bau auf der Gegenseite einen Service auf (Kestrel oder ähnlich) auf auf der handelt das dann...
Da du aber über die Details nicht schreiben kannst / darfst, musst du letztendlich argumentieren 🙂.
Grootjes,
D.
Hallo zusammen,
ich habe es hinbekommen. So schwer war's nicht:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource AncestorType=Page, Mode=FindAncestor}, Path=DataContext.Buchungen.OpenSingleBookingInfo }" CommandParameter="{Binding ElementName=dgSearch, Path=SelectedItem}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Ich habe auch schon folgendes versucht:
<i:InvokeCommandAction Command="{Binding Mode=TwoWay, Path=Bookings, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type vm:Money}}}" CommandParameter="{Binding ElementName=dgOverview, Path=SelectedItem.ID}"/>
Sprich das zugreifende Model geändert.....hat aber nichts gebracht 😦.
Groetjes,
d.
Hallöchen,
was hast du denn genau vor? Willst du ein Event beim Erzeugen von einer Aufgabe im Outlook abfangen?
Ich glaube nicht, dass das möglich ist. Du müsstest ja dann ein entsprechendes Event abonnieren.
Bin mir nicht sicher, ob die Outlook API / das Interop so eine Funktion bereitstellt.....
Groetjes,
d.
Hallo zusammen,
ich habe ein DataGrid das an ein ViewModel bzw. an ein Property eines ViewModels gebunden ist:
<DataGrid IsReadOnly="True" AutoGenerateColumns="False" Background="#2D2D30" x:Name="dgSearch" ItemsSource="{Binding BookingsModel.Bookings, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
Innerhalb des Grids gibt's eine Spalte mit einem Button um Details in einem eigenen Window darzustellen.
<DataGridTemplateColumn Header="Show Informations">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Style="{StaticResource Flat}" Command="{Binding Path=OpenSingleBookingInfo, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type vm:MoneyModel}}}" CommandParameter="{Binding ElementName=dgOverview, Path=SelectedItem.ID}">
<Image Source="\images\Ok-icon.png" Width="16" Height="16"/>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
Das Command kann aber nicht ausgeführt werden und ich weiß nicht warum.
Ich habe innerhalb des MoneyModels ein Property auf das BookingsModel - das funktioniert in der Regel auch wirklich gut - aber jetzt auf dieser Ebene wird es schwierig. Und ich möchte den Umweg über ein CodeBehind in der Page bzw. in der Form unbedingt vermeiden. Vielleicht ist meine Denkweise auch die Falsche.....
Hat jemand einen Denkanstoß?
Groetjes,
d.