Hallo T-Virus,
danke für deine Antwort.
Du hast ja recht das das ganz von der Situation ankommt. Generell wäre die 2. Lösung denk ich von der DB-Performance her besser als die Erste..
Indexe gibt es generell auf alle Primary-Keys, sonst nicht. Dennoch wird auch mit like gesucht (ist indirekt konfigurierbar), sowie extra gejoint usw. zudem sind die DB Tabellen in der Regel viel größer. Die erste Variante bläst die Kommandos ziemlich stark auf und es wird doch unübersichtlicher.
Die Zweite die Models.. wäre aber denk ich wesentlich überscihtlicher, auch wenn es nicht schön ist.
Oder wäre diese Lösung besser:
SELECT a.Id, a.Nr, a.Field1, a.Field2,
b.IdEdit IS NOT NULL AS HasEditLine,
b.IdEdit, b.NrEdit, b.Field1Edit, b.Field2Edit, b.Field3Edit -- Wenn in Table2 die Namen mit dem Suffix Edit ergänzt werden
FROM Table1 AS a
LEFT JOIN Table2Edit AS b
ON a.Id=b.IdEdit
Im Code müsste das Model erweitert werden, sodass alle Daten vorhanden sein können.
In dem Fall müsste man im Code entsprechend darauf reagieren.
Sollte von der Performance her wesentlich besser werden oder?
Auch wenn ich das jetzt nicht unbedingt schön finde...
Verwendetes Datenbanksystem: Microsoft SQL Server 2017
Die Lösung die Benötigt wird, ist folgende:
Table1
- Fields: Id (Key), Nr (Key), Field1, Field2
Table2
- Fields: Id (Key), Nr (Key), Field1, Field2, Field3
Daten1
0, 10, Text1, Text2
1, 11, Text1, Text2
2, 12, Text1, Text2
Daten2
1, 11, Text1 edit, Text2 edit, Text3
Es müssen immer die Daten aus beiden Tabellen selektiert werden. Es sollen mit Priorität, wenn mit denselben Schlüssel in Daten2 ein Satz vorkommt, auch dieser verwendet und der aus Daten1 ignoriert werden.
Also das Ergebnis sollte dann so aussehen:
0, 10, Text1, Text2, ''
1, 11, Text1 edit, Text2 edit, Text3
2, 12, Text1, Text2, ''
Meine derzeitige Selektion sieht so aus:
SELECT m.Id, m.Nr, m.Field1, m.Field2, m.Field3
(
SELECT a.Id, a.Nr, a.Field1, a.Field2, CAST('' AS NVARCHAR(256)) as Field3
FROM Table1 a
LEFT JOIN Table2 b
ON a.Id=b.Id
WHERE b.Id IS NULL
UNION ALL
SELECT Id, Nr, Field1, Field2, Field3
FROM Table2
) m
Table2 ist eine Tabelle, in der nur Datensätze vorhanden sind, die gerade bearbeitet werden. Daher man diese Änderungen zurücksetzen kann, ist diese Vorgehensweise notwendig. (vielleicht gibt es von der grundsätzlichen Idee her eine bessere Lösung?)
Table1 sollte vom aktuellen Stand nicht geändert werden, da es sonst zu breaking changes kommt, die eine menge Anpassungen rund um den Server fordern würde.
Mit diesen süßen kleinen Beispiel sieht es nicht so arg aus, bei größeren Tabellen wird es dann schon sehr unübersichtlich.
Zudem können noch weitere WHERE bzw. JOIN Klauseln hinzukommen, die das UNION nochmals filtern werden. (Auch TOP, ORDER BY, OFFSET...) Innerhalb des UNION sollte sich nichts mehr ändern.
Meine eigentliche Frage ist die, ob die Art der Selektion auf diese Weise annehmbar ist oder es eine bessere Lösung gibt?
SG Thomas
Wow, ihr seid echt super! Besten Dank!
Habe es mit 5 versch. Varianten versucht, der Knopf ist mir jedoch nicht aufgegangen...
Einen self-join habe ich dabei gar nicht bedacht... 🙂
Vielen herzlichen Dank!
Schöne Grüße, Thomas
Verwendetes Datenbanksystem: Microsoft SQL Server 2017
Habe eine (zumindest für mich) Kopfnuss zu lösen. Zuerst dachte ich mir das es nicht so schwer sein kann. Nun bin ich am Ende.
Folgendes Beispiel:
Table
- Fields: Id (Key), Nr (Key), Field1, Field2, IsSet (Key->bit)
Daten
0, 0, Text1, Text2, 0
0, 1, Text1, Text2, 0
0, 1, Text1, Text2, 1
Es sollen immer die Sätze selektiert werden, die am letzten Feld den höheren Wert besitzen, in dem Fall 1 bzw. 0.
Der Satz mit 0 ist immer vorhanden, der Satz mit 1 ist optional, muss aber im Ergebnis bevorzugt werden. Wenn er existiert, selektiere ihm, wenn nicht, dann den mit 0.
(Der Typ bit könnte in dem Fall auch ungünstig sein...)
Der 2te Schlüssel Nr wird dabei nicht berücksichtigt. Eventuell ist es so gar nicht möglich.
Das Ergebnis sollte am Ende so aussehen:
0, 0, Text1, Text2, 0
0, 1, Text1, Text2, 1
Das kann doch nicht so schwer sein oder doch?
(Hab mir mit dem Titel schwer getan, hoffe das passt so)
SG Thomas
Hallo Abt,
danke für die Infos.
Ja ich habe das genauso verstanden wie du sagst. Und genau das habe ich durch mehrere Male versucht ihm das beizubringen.
Diese Sache mit dem Submit habe ich nicht ganz durchschaut, bisher gab/gibt es keinen "submit" in der Lösung in dem Bereich (<form/>), nur versch. Buttons/Inputs, reicht das auch schon ohne explizitem "submit"?
Denn es funktioniert bisher bei Firefox und Chrome ohne dem, ohne Probleme bei einfachen Text input-Feldern. (Andere Browser weiß ich nicht)
Aber wie gesagt, ich habe testweise auch so ein "submit" Button hinzugefügt..
Hast du selbst damit Erfahrung bei <textarea>?
Komme erst wieder dazu mir das anzuschauen, könnte etwas dauern..
Vielen Dank mal fürs Erste!
SG Thomas
Hallo zusammen und alles Gute im neuen Jahr!
Ich habe hier ein Problem, wie die Überschrift schon beschreibt, benötige ich die Funktion in einem <textarea>, nämlich das Attribut autocomplete.
(zumindest für Chrome und Firefox, aktuelle Versionen)
Laut der Doku im Firefox, sollte es funktionieren. Es sind alle Vorgaben gegeben:
Note: In order to provide autocompletion, user-agents might require <input>/<select>/<textarea> elements to:
Have a name and/or id attribute
Be descendants of a <form> element
The form to have a submit button
https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
Das was im Grunde nicht vorkommt ist ein "submit"-Button, den ich aber testweise mal so hinzugefügt habe.
Der erste Versuch war mit autocomplete="on" der zweite Versuch mit autocomplete="given-name", beides leider erfolglos.
Chrome hab ich mir noch gar nicht angesehen. Hatte schon mal wer dieses Problem?
Sollte ich auf einen Holzweg sein, bitte um Info 😉
Schöne Grüße,
Thomas
Ein Tutorial in Schriftform wäre natürlich auch gut. Aber halt praktisch veranlagt, wo man ein Projekt beginnt und am Ende ein Ergebnis hat. Das Visuelle ist für mich was ganz ganz wichtiges. Wo man sieht wie die Zusammenhänge sind, wie die Rädchen ineinander greifen und wo man das nicht anhand der Theorie erklärt bekommt, womöglich noch mit haufenweise Fachbegriffe. Ich glaube das sind die Worte die es richtig beschreiben. Ich brauche den praktischen Bezug.
Hey, ich verstehe dich in gewisser Weise, da ich auch mal an der Stelle war.
Der Unterschied: Ich wußte von Anfang an, dass eine gute Mischung von Theorie und Praxis für mich die beste Wahl ist. Mir hat dabei auch das Buch "C# von Kopf bis Fuß" _Unterstützung _geleistet. (Ist leider schon älter aber für die Basis ausreichend)
Von einer Gehirntransplation würde ich eher absehen 😉 deshalb muss man es selbst ins Hirn bekommen.
Die Frage wäre eher, ob ich mir eingestehen müsste, dass ich einfach nicht dafür gemacht bin und in dieser Sache einfach zu dumm bin.
Äehm, ich kann dir sagen, nein. Zu dumm sicher nicht. Entweder ist man für sowas oder nicht. Wenn das Interesse so groß ist, dass man es einfach nicht lassen kann, ist es schon mal ein guter antreiber. Ich glaube einfach, dass du zu ungeduldig bist.
Natürlich will ich nicht ohne Doku auskommen. Ich muss die Doku, bzw. was da steht aber erstmal verstehen bevor ich damit arbeiten kann.
Der Knoten im Kopf muss sich lösen, dann der große: AHA - Effekt
Den hatte ich in einem Buch (C++), da ging es über die verknüpfe Liste, die heutige "LinkedList". Die mußte man darin selbst erstellen. Im Urlaub in der Sonne habe ich mir dieses Kapitel so lange in meinem Hirn einbalsamiert, bis ich es kapiert habe und sich einige Gehirnknoten gelöst haben. 😁
Vielleicht ist aber auch ein Punkt erreicht, wo es grob gesagt mit "Nachmachen" und "Auswendig lernen" nicht mehr getan ist.
Auswendig lernen hatte ich eigentlich fast nie müssen. Lesen und verstehen, was man liest gemischt mit Interesse, ist es auch schon im Hirn...
Nachmachen ist nur ein kleiner Aspekt. Verstehen **was **man nachmacht dagegen schon mehr.
Ich kann mir vorstellen, dass es für euch, die ihr es verstanden habt nur schwer vorstellbar ist, wie man das nicht verstehen kann. Ist doch alles logisch.
Naja, das mal so vorweg nehmen würde ich nicht, du kennst ja keinen 😉
Über die 20 Jahre wo ich mich hobbymäßig (mal intensiver und mal gar nicht) mit dem Thema Scripting und Programmierung schon befasse
Ich kenne das, zwar nicht soo lange aber es waren sicher ~8 Jahre. Bringt halt nicht viel, wenn man ständig irgenwie dainwackelt und man öfters mal besoffen die Zeit vergisst, so wie es bei mir war 😄, und andere Dinge wichtiger waren, so auch die Arbeit die man gerade hat.
--> Mehr Zeit intensiver nützen, ohne längere Pausen, sonst ist es wie schon gesagt, ein dahinwackeln ohne Sinn und Ziel, das motiviert einen auch gar nicht.
Mehrere kleine Projekte fertigschreiben und sich darüber freuen bring wesentlich mehr 😉
Zudem erspart man sich auch die Hälfte der dahingewackelten Zeit...
Ich denke er meint, wenn die Funktion parallel öfters aufgerufen wird, dass es da zu Problemen kommen kann und nicht die Logik in der Methode ansich.
Hallo zusammen, danke mal für Eure Antworten.
Ein wenig zum Hintergrund:
Es ist eine Änderung im alten Source, der basiert auf dem Framework 4.6.2 und das ändert sich auch nicht mehr.
Die Methode die aufgerufen wird ist noch eine WCF Methode, da habe ich keinen Einfluß drauf.
Die 'null' Parameter sind optionale, um das Dokument in einer bestimmten Version zu holen oder so ähnliches, also nichts tragisches.
Es gibt in der WCF Schnittstelle nur diese eine Methode, um eine Datei mit Annotationen zu erhalten. Das ist auch der Grund der Änderung/Erweiterung.
Den Service den ich verwende ist schon ein fertiger Proxy für die WCF Anbindung. Ebenfalls keinen Einfluß drauf.
Der Rückgabewert ist ein Stream, also die abstrakte Basisklasse. Weiß aber das von der WCF Schnittstelle ein Filestream übergeben wird.
Die Dateien um die es hier geht sind in der Regel nicht größer als 2MB, wollte mich damit aber nicht zufrieden geben.
Sah in die Doku und war verwirrt 😉
Aber ich denke ich habe schon verstanden und lag auch bei meiner Verwirrung da wohl nicht ganz falsch.
Die bessere Lösung ist sicher paketchenweise zu lesen und gleich auf die Platte zu schreiben, eben auch wegen dem RAM.
Obwohl es immer nur 1 Datei ist, ist es vom Logischen her einfach besser umgesetzt.
Die Lösung gibt es schon, hole eine Datei und schicke sie mit anderen Parametern zu einem anderen Verarbeitungssystem.
Der Unterschied um das es hier jetzt geht, es sollen die Annotationen mit exportiert werden als fixer Bestandteil des Dokuments.
Die andere vorhandene Methode hat es etwas einfacher, die bekommt gleich ein byte Array und keinen Stream.
Hallo liebe Community,
ich stecke momentan in einer Glaubenskrise bzw. hab ich derzeit einen Knoten im Gehirn...
Eine ganz einfache Sache, einen Stream in ein byte-Array stecken.
Weiß nicht wieso mir das bis jetzt nie gestört hat, hier ein Beispiel:
using (Stream stream = this._FileService.GetFileConverted(this.ConnectionId, documentId, versionId, null, null, null, targetFormat, addAnnotations, addOverlay, contentType))
{
byte[] bytes = new byte[stream.Length];
int numBytesToRead = (int)stream.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
int n = stream.Read(bytes, numBytesRead, numBytesToRead);
if (n == 0) break;
numBytesRead += n;
numBytesToRead -= n;
}
return bytes;
}
stream.Length ist ja vom Typ long.
Die restlichen Variablen und gefordeten Parameter in int.
Mir ist klar, dass _stream.Length _die gesamte Länge des Streams ist und die Angaben bei _numBytesToRead _und _numBytesRead _nur der Offset und die Buffergröße.
Habe das Beispiel von Microsoft:
FileStream.Read Method (System.IO)
Mich stört, dass zunächst _numBytesToRead _das stream.Length reingeboxt bekommt, also unter Umständen gekürzt wird.
Im _while _wird der gelesene Buffer _n _von dem _numBytesToRead _aber abgezogen.
Das kann sich ja irgendwie nicht ausgehen oder?
Wenn ich Dich richtig verstehe, dann testest Du hier aber weit mehr als eine Unit.
Das geht ja eher in Richtung Integrationstest, den man ohnehin anders aufbaut.
Hm, ist es wirklich so, dass ich mir nur Arbeit ersparen wollte?
Klar kann ich den memory (Unit-Test) Provider soweit ausbauen, damit er mir aus den übergebenen Informationen der BL aus den XML-Mockdaten korrekt selektieren kann...
In dieser BL sind Kundenspezifische BL-Plugins möglich, diese werden aber dann in den jeweiligen Plugin-Tests abgehandelt.
Ansonsten gibt es soweit keine "Fremdeinwirkungen".
Bei einer eigenen DAL, sollte es je nach implementierung auch einfach möglich sein, die erstellten SQL auf irgendeine Memory DB oder sogar xml oder JSON Dokumeten umzuleiten
Ja, die Mock-Daten liegen in XML vor, nur werden immer explizit immer dieselben Daten geliefert, was ja wohl in gewissen Tests sinnvoll ist.
Das Problem ist, dass die BL die Selektionen (um es einfach zu nennen) manipulieren kann und danach die Anfrage über den DAL macht.
So haben wir hier teils dynamische Kommandos, die ich gerne wie in echt, geliefert bekommen möchte, ohne fixe Datenrückgaben für jeden einzelnen Fall erstellen zu müssen.
Hoffe das es jetzt verständlicher ist?
Da ist wohl die Überschrift etwas irritierend, obwohl es mehr oder weniger dann doch wieder da hinkommt.
Der Eingangspost weicht stattdessen hier schon stärker ab.
Wenn ich dich richtig verstehe, willst du deine Tabelle für Unit Tests als In Memory Tabelle anlegen lassen?
Halte ich nicht für zielführend, da du dann die eigentlichen DB Operationen auf Dateisystem Ebene ausschließt.
Damit deckst du einen anderen Use Case ab als im produktiv System.
Zum einen verständlich, soll ich das so verstehen, dass sogar für solche Tests auf eine eigene Unit-Test DB zugegriffen wird?
Wäre für mich natürlich eine große Erleichterung... Bisher gibt es sowas nicht bei uns, da wie so oft, vieles nicht mehr dem heutigen Standard entspricht... (aber darauf hingearbeitet wird, leider ist der Technologierfortschritt meist schneller 😄 )
Derzeit noch ADO.NET, sollte sich aber bald ändern.
Der DAL ist eine Eigenproduktion, auch da habe ich schon Ansätze versucht dieses zu ändern...
verwendetes Datenbanksystem: SQL
Hallo zusammen,
ich hätte nach längeren wieder mal eine Frage wenn es um Unit-Tests geht.
Was ist wohl die effektivste Möglichkeit, eine (welche) memory-Datenbank (Tabellen) zu erstellen, in der man mit DB-Kommandos wie in echt selektieren kann?
Wobei ich die memory-Datenbank als Mock-Quelle verwenden möchte, die Daten ansich sind nicht das Problem.
Bin sicher das es da schon ganz bestimmte Lösungswege gibt, nur tappe ich momentan im Dunkeln...
Bitte um Info, vielen Dank im Voraus,
Thomas
Kannst du den Code in den dafür vorgesehenen Code-Tags packen und nicht als PDF Anhang, danke.
Dein Naming im Code ist zumindest für mich etwas unübersichtlich, dadurch tu ich mir schwer.
Aber hierzu:
ebe ich jetzt 601 ein zeigt er mir im Label nicht 1202 an sondern 601
sieht es mir stark danach aus, daß er irgendwo durch eine IF
Bedingung fällt und gar nicht berechnet wird.
Noch dazu:
Überladungen verwendet man auch oft um die Abwärtskompatibilität aufrecht zu erhalten, bei Erweiterungen oder dergleichen.
Das was @Bhaal sagt ist auch wichtig, ich denke ++noch ++dazu zu sagen:
Wenn du versuchst überladene Methoden zu ändern, indem sie stattdessen optionale Parameter aktzeptieren (oder umgekehrt) ist es eine Änderung der Methodenstruktur, mit dem fremde Assemblies, wenn sie nicht neu erstellt werden, nicht umgehen können, da sie die Methode auf einmal nicht mehr finden.
_MethodNotFoundException _heißt glaub ich das Zauberwort...
Da muß man aufpassen.
Für mich wäre das Thema auch interessant.
Das Beispiel ist schon sehr alt, gibt es da nix aktuelleres dazu? Ich persönlich konnte auf die Schnelle nix finden...
Soweit ich es aus seinem Beitrag rauslesen kann möchte er wissen, wie man die Tracks abspielen kann...
Wenn schon eigener Code vorhanden, wäre es toll etwas herzuzeigen aber ich denke es wurde 1:1 von Beispiel abkopiert? 😁
SG
Ja, aber trotzdem sehe ich nicht ein, daß ich es nicht selbst regeln kann, wann die Tabs ansich geladen werden --> unnötige RAM Verschwendung
Nicht falsch verstehen, mit gefällt die Edge sehr gut, hab eine Zeit lang damit gearbeitet, nur über 1,5GB Verbrauch ist mir eindeutig zu viel. (Klar, ist immer die Frage was in den Tabs offen bleibt und ja, man könnte mit Lesezeichen arbeiten, nur ist es nicht meine Arbeitsweise)
Ich finde , daß der Edge wirklich sehr fix und problemlos läuft.
Mit dem Nachteil den ich bis vor ein paar Monaten noch hatte (kenn den aktuellen Status nicht), daß er ein richtiger Speicherfresser ist, da er anscheinend aus performance-Gründen verzögert alle Tabs nacheinander ladet, egal ob sie benötigt werden oder nicht.
Anders als z.Bsp. beim Firefox. Eine Einstellung dazu hatte ich im Edge nicht gefunden.
Dort werden Einträge abgestellt wann z.B. ein Vorgang komplett verpackt wurde. Sobald dieser Eintrag in der Datenbank erscheint, muss Sekunden später ein Lieferschein gedruckt werden. Es kann mehrere Einträge die Minute geben.
Ist nicht schon der Ansatz verkehrt?
Wieso werden die Lieferscheine nicht schon vom vorherigen System erstellt bzw. gibt es da keine Schnittstelle dazu, zu dem System?
Nein habe ich nicht, sind alle durchgehend entweder Any CPU oder x64.
Ha aber bei der WPF Anwendung ist im Build Reiter ein Häkchen unter Plattformziel mit 32 Bit bevorzugen!
Nachdem ich es entfernte, funktionierte es klaglos....
Habe nie wirklich darauf geachtet, war bisher auch nicht notwendig, tja, wieder was dazugelernt...
Danke für die Hilfe und auch danke Abt für deinen Hinweis mit den veralteten SqlClient!
[Edit1]Nein Abt, sowas mache ich nicht. Da hätte es sicher schon viel früher Probleme gegeben, wie es sich herausstellte war es der übergangs-WPF-Client.[/Edit1]
SG Thomas
Hallo,
danke für die Antworten.
Die Anwendung wird unter x86 ausgeführt.
.NET Framework 4.5.1, dachte mir schon das ich dies hinzuschreiben hätte sollen... da habt ihr nun schon geantwortet 😉
verwendetes Datenbanksystem: SQL Server 2014 (Express)
Hallo zusammen,
bin gestern auf ein Problem gestoßen, wie ich es bisher nie hatte.
Es geht hier um einen Übergangskonfigurator, der sich mehr oder weniger direkt mit dem SQL Server verbindet.
Wenn meine Anwendung unter Any CPU erstellt wird und man versucht dann eine Verbindung zum SQL-Server herzustellen, kommt folgende Fehlermeldung:> Fehlermeldung:
System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - The remote computer refused the network connection.) ---> System.ComponentModel.Win32Exception (0x80004005): The remote computer refused the network connection
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1 retry)
at System.Data.SqlClient.SqlConnection.Open()
...
..
.
ClientConnectionId:00000000-0000-0000-0000-000000000000
Error Number:1225,State:0,Class:20
Sobald ich die Anwendung auf x64 erstelle, gibt es keine Probleme.
Das Betriebssystem ist ein 64Bit System.
Hatte dieses bis jetzt noch nicht und wollte fragen, ob mir wer einen Hinweis dazu geben kann?
Vielen Dank im Voraus,
Thomas
Hallo,
also ich verstehe deine Motivation, sieh zu, daß du sie am leben hältst, denn du wirst sie brauchen wenn du von Grund auf alles lernen möchtest.
Ich verstehe auch, daß du aus einem bestehenden Sourcecode lernen möchtest um sich viele Dinge abzuschauen.
Nur wirst du niemals einen Sourcecode finden, den du zu 100% adaptieren und erweitern kannst. Zudem besteht immer die Gefahr, daß das was du bekommst, veraltet, nicht mehr aktuell oder einfach nicht (mehr) sicher ist.
Es gibt in dem Bezug keinen einfachen Weg außer mit meist englicher Hilfe sich die Grundkenntnisse anzueignen.
Außer du findest einen privaten Lehrer mit entsprechender Erfahrung, nur brauchst dann wahrscheinlich so viel Geld, daß du gleich ein fertiges Produkt kaufen kannst.
Also in der Doku steht es anders: https://docs.microsoft.com/de-de/dotnet/api/system.windows.frameworkelement.loaded?view=netframework-4.8
Tritt auf, wenn das Element ausgerichtet und gerendert sowie zur Interaktion vorbereitet wurde.
Könnte mich auch täuschen, da ich nie so ein Problem hatte (soweit ich mich erinnern kann 😉 )
Schlimmsten Falls gäbe es noch das SizeChanged inwieweit man dieses Event handelt sodass nur der letzte Aufruf verwendet wird danach das EVent De-Registriert wird, weiß ich jetzt nicht.
Zudem könnte man es selbst testen, mittels Breakpoints, welches Event zuletzt aufgerufen wird.
Wenn es doch das Loaded
Event ist, dann dürfte das Problem woanders liegen.
Wieso nicht, die 2te Antwort würde hinkommen, nur daß du halt MinWidth
und MaxWidth
mit der aktuellen Breite setzt und ResizeMode
entsprechend änderst im Loaded
.
Natürlich könnte man das auch MVVM fähig machen...aber die Grundidee sollte so funktionieren...
Hallo, kann es sein das die Platte voll läuft? Ganz eine einfache Frage 😉
An welcher Stelle genau in dem Code oben tritt der Fehler auf?
Die Anzahl der Spiele wird durch eine For-Schleife gezählt, deren Wert je nach Anzahl der Spiele und Spieler variiert.
.
.
.
Gibt es irgendeine Möglichkeit die Schleife zu pausieren, abgesehen von ShowDialog, solange das Spielwindow offen ist?
Ich verstehe nicht ganz den 1sten Satz. Die Anzahl der Spiele wird durch eine For-Schleife gezählt, also stimmt es wie ich es mir vorstelle, es gibt eine bestimmte Anzahl an Spiel-runden, ein so ein gesamtes Spiel wird in innerhalb einer Schleife abgebildet?
Ist das so richtig?
Oder auch dieses offene kostenlose Online-Buch für jeden als grundlegenden Einstieg: Openbook Rheinwerk-Verlag
Ist zudem hier auf der Webseite zur linken Seite im Hauptmenü zu finden, sowie noch weitere Einstiegshilfen.
Um es noch spezifischer zu beantworten, wäre etwas Code nicht schlecht, um sich generell ein Bild machen zu können.
Vielleicht fehlt ihm ja nur ein kleiner Stupser zu dem großen Ahaaaa 😉
Wozu brauchst du dann eine Breitensuche?
Meine Idee wäre, das Spielfeld in einen (unsichtbaren) Raster darzustellen, jede Figur bewegt sich pixel für pixel in den nächsten Raster...
In dem Fall (aber auch sonst) kann dir die Breite egal sein, da du so oder so eine fixe Spielfeldgröße benötigst, somit hast du schon mal das Maß und nach dem kann man alles andere richten...
Alles so rein aus dem Kopf heraus 😉
Ich z.Bsp. arbeite demnächst am Load-Balancing, da sind Daten im RAM nur sehr begrenzt zu empfehlen, sonst würde das ganze System nicht richtig funktionieren ohne das die Server voneinander wissen müssen und das sollte es natürlich nicht sein.
Hallo,
meinst du insert
oder update
?
Bei insert kannst du keine Suchkonditionen mit where
angeben... da du hier eine ganze Zeile neu einfügst...
Dieser Link hier https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358 ist die 64Bit Version, zeigt er mir an wenn ich draufklicke.
Brauchst ja aber die 32er oder täusch ich mich, vielleicht hast du das übersehen?
Hatte auch schon damit gearbeitet, dieses 32 64 bin ich auch drübergestolpert...
SG
Wow, besten Dank für die Bettlektüre in hoher Qualität! 😁
.) Ich lasse mir alle AD-Gruppen für einen Ordner auslesen und lese dann aus diesen AD-Gruppen wiederum alle User aus.
.) Die Benutzer werden in einer DataTable gespeichert und dann im Programm an ein DataGrid weitergegeben.
Hallo,
wie schon von den Vorrednern gepredigt, sollte man hier eher Klassen-Objekte erstellen, die so einen gewünschten Datensatz wie du ihm haben willst, aufgebaut ist.
Und anstatt jetzt den 2ten Punkt dazu zu verwenden, die Daten in eine DataTable zu schreiben, befüllst du einfach jeden Benutzer in ein so eine Klasse und hast als Ergebnis eine Liste mit Benutzern die jeweils in Klassen sitzen 😁
Unter Umständen kannst du schon beim Befüllen der Klassen mit einer eindeutigen Id in jedem Schleifendurchlauf nach einer vorhandenen Klasse mit derselben Id in der Liste suchen. Wenn gefunden ergänzt du einfach die Daten, ansonsten erstellst einfach wieder eine neue Klasse.
Somit bekömmst du dann schon die fertig anwendbare Klassenliste aller Benutzer.
Diese Liste kann man dann genauso an das DataGrid oder andere Controls binden...
Grüße
Ich möchte mich dem auch gleich anschließen und sagen, daß ich unter Anderem auch in diesem Forum meine etwas steilere Lernkurve zu verdanken habe!
Sei es jetzt wenn ich selbst Fragen stellte oder nur stiller Beobachter war 😉 und ja @Abt, du hast wieder mal recht, sich selbst zu helfen ist oft gar nicht so einfach...
schanke Tön! 😁
Mein erster Gedanke war...
Ist auch eine Variante, wenn auch durch die Schreibweise etwas schwer zu durchschauen.
In meinem Fall bietet es sich an, auch andere Operatoren zu verwenden außer ==
und &&
.
Die erste Lösung von @Papst finde ich auch sehr gut, allerdings könnte dieses nicht konfiguriert werden.
Ist halt immer die Frage wie weit man gehen will.
SG
Hallo,
also mein Beispiel war ja nur ein Anhaltspunkt. Könnte man noch um einiges Erweitern, genauso wie das automatische Befüllen solcher Informationen, allerdings muß man sich halt für eine Vorgehensweise entscheiden.
Hier mal das vorherige Beispiel mit den index-Werten mit der einfließenden Idee von @Th69:
internal class Combo
{
public Combo()
{
this.Id = -1;
this.Z1 = -1;
this.Z2 = -1;
this.SubCombo = null;
}
public int Id {get;set;}
public int Z1 {get;set;}
public int Z2 {get;set;}
public Combo SubCombo {get;set;}
public bool Init(int id, List<int> indexes)
{
if(indexes == null) return false;
if(indexes.Count == 0) return false;
// Prüft ob die Anzahl immer eine Gerade ist:
if(indexes.Count % 2 == 1) return false;
Id = id;
// EDIT1: new List<int>(…)
// Sonst wird die Liste die von außen kommt verändert (Einträge entfernt), wäre in dem Fall eigentlich nicht richtig
OnInit(new List<int>(indexes));
return true;
}
private void OnInit(List<int> indexes)
{
Z1 = indexes[0];
indexes.Remove(0);
Z2 = indexes[0];
indexes.Remove(0);
if(indexes.Count == 0) return;
SubCombo = new Combo();
SubCombo.OnInit(indexes);
}
public bool IsMatch(params int[] data)
{
if(data == null) return false;
if(Z1 < 0 || Z1 > data.Lenght - 1 || Z2 < 0 || Z2 > data.Lenght - 1) return false;
if(data[Z1] != data[Z2]) return false;
if(SubCombo == null) return true;
return SubCombo.IsMatch(data);
}
}
// In der Anwendung:
int[] ZDATA = new int[13];
ZData[0] = 10;
ZData[1] = 11;
ZData[2] = 10;
ZData[3] = 12;
//usw.....
List<Combo> combos = new List<Combo>();
List<List<int>> simpleRawTemplates = new List<List<int>>();
// K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
simpleRawTemplates.Add(new List<int>(new int[]{0, 1, 0, 2}));
for(int id = 0; id < indexes.Count; id++)
{
Combo c = new Combo();
c.Init(id, indexes[id]);
combos.Add(c);
}
int treffer = -1;
foreach(Combo c in Combos)
{
if(c.IsMatch(ZData))
{
treffer = c.Id;
}
}
Nur nützt das alles nix wenn man es nicht versteht was da passiert. Beim Debuggen kann man jedoch alles nachvollziehen und dabei leichter dazu lernen. Ist auch eher eine Ausnahme das ich soviel vorarbeite 😉
Wichtig dabei ist, dass es in beide Richtungen und mit mehreren Feldern funktionieren muss. D.h. wenn in ListB der Name fehlt, soll dieser aus ListA genommen werden. Dabei darf der Datensatz nur einmal im Ergebnis auftauchen.
Irgendwie widerspricht sich das. Du willst beide Listen mit den Daten der anderen ergänzen, am Ende sollen aber Einträge nicht doppelt vorkommen.
Jetzt stellen sich folgende Fragen:
Grüße
K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]"; K[2] = "Z1[0] == Z1[4] && Z1[0] == Z1[6]"; K[3] = "Z1[0] == Z1[7] && Z1[0] == Z1[8]"; ..... K[50] = "Z1[0] == Z1[7] && Z1[0] == Z1[10] && Z1[0] == Z1[11] && Z1[0] == Z1[12]"; usw....
ich sehe hier nur && Verknüpfungen, ist es so das nur diese vorkommen oder sollten auch bald andere Operatoren hinzugefügt werden?
Wenn es nur so einfache Operatoren wie && und == verwendet werden, könnte man solche string's in eine Klasse transferieren die wiederum eine Instanz von sich selbst besitzt.
Mit einer Methode kann dann der Vergleich ausgeführt werden. Diese Methode müßte dann rekursiv die eigenen Instanzen durchlaufen und am Ende das Ergebnis zurückliefern.
Somit hättest du eine typisierte 1 zu *n Beziehung und müßtest in der äußersten Schicht nur die eine Methode aufrufen, je Kombo.
Ein kurzes aus dem Kopf geschriebens Beispiel:
internal class Combo
{
public Combo()
{
this.Id = -1;
this.Z1 = -1;
this.Z2 = -1;
this.SubCombo = null;
}
public int Id {get;set;}
// Z1 & Z2 dienen nun nicht als Wertehalter sondern als Indexzugriffe (Index eines Arrays)
public int Z1 {get;set;}
public int Z2 {get;set;}
public Combo SubCombo {get;set;}
public bool IsMatch()
{
if(Z1 != Z2) return false;
if(SubCombo == null) return true;
return SubCombo.IsMatch();
}
}
// In der Anwendung:
Z1[0] = 10;
Z1[1] = 11;
Z1[2] = 10;
Z1[3] = 12;
//usw.....
List<Combo> combos = new List<Combo>();
// K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
combos.add(new Combo()
{
Id = 1, // K[1]
Z1 = Z1[0],
Z2 = Z1[1],
Combo = new Combo()
{
// Id ist ab hier nicht mehr notwendig, nur in der äußersten Schicht
Z1 = Z1[0],
Z2 = Z1[2]
}
});
int treffer = -1;
foreach(Combo c in Combos)
{
if(c.IsMatch())
{
treffer = c.Id;
}
}
Kann natürlich noch aufgehübscht werden... 😉
[Edit1]
Hier noch eine angepasste Variante, die wohl eher zum Ziel passt:
internal class Combo
{
public Combo()
{
this.Id = -1;
this.Z1 = -1;
this.Z2 = -1;
this.SubCombo = null;
}
public int Id {get;set;}
public int Z1 {get;set;}
public int Z2 {get;set;}
public Combo SubCombo {get;set;}
public bool IsMatch(params int[] data)
{
if(data == null) return false;
if(Z1 < 0 || Z1 > data.Lenght - 1 || Z2 < 0 || Z2 > data.Lenght - 1) return false;
if(data[Z1] != data[Z2]) return false;
if(SubCombo == null) return true;
return SubCombo.IsMatch(data);
}
}
// In der Anwendung:
int[] ZDATA = new int[13];
ZData[0] = 10;
ZData[1] = 11;
ZData[2] = 10;
ZData[3] = 12;
//usw.....
List<Combo> combos = new List<Combo>();
// Die Änderung sieht vor, daß hier nur noch die Komo-Vorlage mit Indexwerte definiert wird (solang es immer dieselben Array-Gößen sind bzw. genau darauf geachtet wird, das alles zusammenpasst...)
// K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
combos.add(new Combo()
{
Id = 1, // K[1]
Z1 = 0,
Z2 = 1,
Combo = new Combo()
{
// Id ist ab hier nicht mehr notwendig, nur in der äußersten Schicht
Z1 = 0,
Z2 = 2
}
});
int treffer = -1;
foreach(Combo c in Combos)
{
if(c.IsMatch(ZData))
{
treffer = c.Id;
}
}
[/Edit1]
public override bool Equals(object obj) { ClinicStaffModel csm = obj as ClinicStaffModel; return csm != null ? csm.Id == this.Id : false; }
Etwas aufhübschen 😉
Was ist denn allgemein das Problem mit einem SelectionChanged Event?
Wenn du seinen Link folgst zum vorletzten Beitrag dann siehst du was er meint, Stichwort 'SelectedItem' 😉
Du mußt in diesem DataTemplate nicht unbedingt ein ListBoxItem verwenden, kannst fast alles da rein schreiben, ich würde es mal mit Label oder TextBlock testen.
Grüße
bist Du ganz sicher, dass das SelectedItem, dass Du initial setzen willst, die selbe Instanz ist, die auch in der ItemsSource der ComboBox steckt?
natürlich im Zusammenhang mit
Wenn Du die korrekten Typen wie ObservableCollection verwendest, spielt die Ladezeit prinzipiell keine Rolle.
Es wird aktualisiert, sobald die Items in der Collection sind (bezogen auf die Binding Direction).
zudem auch gut zu wissen wie
… wo / wann und wie du dein "Item" im Code setzt. Ich vermute das es damit zusammen hängt.
um es mal zusammenzufassen. 😉
public List<ClinicStaffModel> ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource { get { return _ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource; } set { _ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource = value; Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffItemsSource)); Raise(nameof(ComboBoxMaterialPreparationProtocolsClinicStaffSelectedItem)); } }
Liegt es vielleicht daran, daß du als ItemsSource z.Bsp. keine 'ObservableCollection
' anstatt 'List
' verwendest?
Er verweist auf einen vorhandenen Einstieg Forumsintern, welcher Zeitintensiv von Freiwilligen erstellt worden ist, um genau Anfänger diese Hilfe zu bieten, ohne alles doppelt und 4869fach neu runterleiern zu müssen.
Ich nehme deine persönliche Meinung zur Kenntnis, dennoch sollte man mal darüber nachdenken.
Hallo,
zuerst die Frage, ist es nun WPF oder WinForms? Deine Verlinkung war WinForms gemeint.
Danach, was soll überhaupt gemacht werden?
Ein Fenster ohne Standard-Windows Rahmen, welches man auch noch eine Transparenz verpassen kann?
Ist deine eigentliche Frage, wie man so ein Fenster überhaupt verschieben kann?
Wenn dem so ist, dann gibt es schon eine fertige Funktion unter WPF: DragMove
Ansonsten bitte ein bisschen Code damit man sich ein Bild machen kann...
SG Thomas