Laden...

Forenbeiträge von RED-BARON Ingesamt 74 Beiträge

30.03.2020 - 12:36 Uhr

Versuch mal das SDK an einen Ort zu verschieben, in dem der Pfad keine Leerzeichen mehr enthält.
Musst natürlich dann die Pfade in VS und/oder der Umgebungsvariablen anpassen.

Könnte was dran sein.
Android-Studio installiert den SDK in
C:\Users{username}\AppData\Local\Android\Sdk

Die AVD's liegen dann in
C:\Users{username}.android\avd

Scheint ein häufiges Problem zu sein
https://stackoverflow.com/questions/39645178/panic-broken-avd-system-path-check-your-android-sdk-root-value

30.03.2020 - 12:07 Uhr

Öfters wird empfohlen Dienste nicht direkt erreichbar zu machen.

Wäre eine WebAPI hier nicht auch angebracht ?

Der kann die lokale Prüfsumme übergeben werden und der Vergleich
findet auf dem Server statt.

30.03.2020 - 11:16 Uhr

hey Benutzer007,

möglicherweise findest Du hier einen Ansatz der Dir auch für weitere Problemstellungen eine Lösung bietet.

https://prismlibrary.com/docs/wpf/legacy/Navigation.html

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/17-BasicRegionNavigation

01.05.2019 - 20:18 Uhr

kleines Missgeschick, wollte eigentlich die Zeitung lesen und die lese ich immer von hinten nach vorn. 😉

01.05.2019 - 19:38 Uhr

in den Beiträgen kam öfter vor, das MySQL-Protokoll ist auch von der GPLv2 betroffen.

Dem ist nicht so ! Die Dokumentation in der auch das Client/Server Protokoll
beschrieben und erklärt wird ist nicht unter GPL !

https://dev.mysql.com/doc/internals/en/preface.html
This documentation is NOT distributed under a GPL license

Deswegen sind auch Libs wie diese möglich:
https://github.com/mysql-net/MySqlConnector

19.01.2019 - 20:40 Uhr

android tethering over usb

tethering in den Netzwerkeinstellungen aktivieren
Ethernet over usb in den Entwicklereinstellungen setzen (Debugoptionen)

Gerät verbinden über USB. (WLAN und Mobiles Netzwerk ausschalten am Gerät)

Dein Rechner sollte jetzt ein neues Netzwerk melden.
commandline: ipconfig => IPv4 ablesen. Sollte Dir auffallen eine noch nie vorher gesehene Adresse zu entdecken. (neues öffentliches Netzwerk)

Ports/Anwendung in FW hinterlegen (eingehend)

Diese Adresse im Browser auf Deinem Gerät eingeben.

=> funktionierte bei mir wunderbar.

02.10.2018 - 20:40 Uhr

brauchst kein Link, kauf Dir nen Fahrschein => Bücherei

06.06.2018 - 16:50 Uhr

da bin ich wieder, test.exe auf Produktionsrechner zeigt - kompletten - Stacktrace.

Wenn da System.Linq im Stacktrace vorkommt (was es tun wird), liegt der Fehler
trotzdem in der Expression

richtig. so isses ja auch ( gewollt gewesen ).

Warum die test.exe den kompletten erwarteten Stacktrace ausgibt - mit Enumerable.MoveNext ... aber die Anwendung.exe nicht - hm gute Frage.

Evtl. bei an die 4000LOC ... kommt vll. mal was durcheinander^^ und tatsächlich ist der Fehler in ganz anderer Zeile.

Es gibt kein vernünftigen Grund, warum System.Linq Symbole nur in einer kleinen
test.exe aufgelöst werden können sollen und in einer 10 MB.exe nicht.

Antwort Eingangsfrage: Nein. 😃

Zurück auf Start.

06.06.2018 - 13:52 Uhr

Vllt solltest Du auch keine Klassen bauen die über 3000 LOC haben...

nicht mein Code - Kollege hat den Fehler Anfang Februar als gefixt dokumentiert und gestern erst wieder - die einzige Änderung an der Datei war, dass mein Kommentar an der Zeile entfernt wurde !

Hi RED-BARON,

der Fehler tritt an dieser Stelle auf:

p.Nr == row.Nr  

Mit deiner Änderung verhinderst du nur, daß die Exception ausgelöst wird.

Ausgeführt wird der Code aber erst beim Durchlaufen der foreach-Schleife. Da ist der StackTrace auch sehr eindeutig. Deine eigentliche Frage kann ich daher nicht nachvollziehen.

Mit der Änderung wollte ich erzwingen und nichts verhindern - ich vermute an der Stelle knallt es - einzig der Stacktrace fehlt mir um es "sehen" zu können.

Pille hat freilich Recht:
(p => p == null); hat nichts mit dem realen Fall zu tun. Im Test wollte ich sehen was passiert wenn:

foreach (var item in results)
{
      results = null;
}

Habe mehrere testfälle erstellt. Und jetzt eine Konsolenanwendung die ich mal versuche am Produktionsrechner auszuführen und bei der "row" null ist. Wenn da System.Linq im Stacktrace vorkommt ... liegt der Fehler womöglich doch wo ganz anders.

Danke an alle die mitgehirnt haben 😃

@Geaz : 100% ( meine aktuelle Annahme ! ) .... der Beweis fehlt mir nur noch 😃 - da bin ich aber dran

06.06.2018 - 12:03 Uhr

Danke ich nehme keine Pillen 😃

das würde einschließen, dass die PDB nicht zum EXE passt - das läßt sich leicht
provozieren und mit Glück erhalte ich einen Stacktrace ohne Angabe von Zeilen oder komplett Schrott.

Das Problem ist mir wohl bekannt und würde es zunächst einmal ausschließen.
Im Beitrag habe ich die Stacktraces etwas vereinfacht um für fremde Augen es lesbarer zu machen. Im realen Fall vergleiche ich schon die passenden Quellcodestände zur ausgelieferten Exe.

und auch da komme ich eben auf die Zeile

foreach (var item in x)

unmittelbar nach

var x = X.Where(p => p.Nr == row.Nr);

Im Normalfall sollte "row" nicht null sein - dieser Fall lässt sich aber häßlich reproduzieren - deswegen setze ich es im Code gleich selbst auf null !
Ergebnis: es knallt nicht in

var x = X.Where(p => p.Nr == row.Nr);

sondern wie im Fehler auch hier

foreach (var item in x)

Mir ist das auch logisch. Das was ich probiere und die Folge davon.

Aber was Du schreibst ist nicht ganz von der hand zu weisen, denn es gibt sehr wohl auch von anderen Produktionssystemen Fehlermeldungen die den Stacktrace bis System.Linq ausweisen - allerdings auch mal mit und mal ohne Zeilenangaben.

Fehlermeldung:
Ausnahme: System.ArgumentNullException: Value cannot be null.
Parameter name: source
at System.Linq.Enumerable.Select[TSource,TResult](IEnumerable1 source, Func2 selector)
at System.Linq.Enumerable.Min[TSource,TResult](IEnumerable1 source, Func2 selector)

06.06.2018 - 10:57 Uhr

Hallo,

2 Fehlermeldungen und meine Frage vorweg:
Ist es möglich, dass der Stacktrace aus System.Linq auf einem Produktionssystem nicht ausgegeben wird. Wenn ja - unter welchen Bedingungen ist dies denkbar ?

Meldung Fremdsystem ( StackTrace unvollständig ??? )

Progr.: ExecuteModifyCommand
Context:
Ausnahme: System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei ProjektName.ViewModel.ExecutePasteCommand(Object arg) in C:\ProjektName\ViewModels\ViewModel.cs:Zeile 3030.
bei Cinch.SimpleCommand`2.Execute(T2 parameter)

Meldung Eigensystem

Progr.: <ExecuteModifyCommand>b__1be
Context:
Ausnahme: System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei ProjektName.ViewModel.<>c__DisplayClass1ce.<ExecuteModifyCommand>b__1be(ViewModel p) in D:\ProjektName\ViewModels\ViewModel.cs:Zeile 3029.
bei System.Linq.Enumerable.<>c__DisplayClass6_01.&lt;CombinePredicates&gt;b__0(TSource x) bei System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()
bei ProjektName.ViewModel.ExecuteModifyCommand(Object arg) in D:\ProjektName\ViewModels\ViewModel.cs:Zeile 3030.
bei Cinch.SimpleCommand`2.Execute(T2 parameter) in D:\ProjektName\CinchV2\Commands\SimpleCommand.cs:Zeile 61.

der dazugehörige Quellcode:


2029:	var x = X.Where(p => p.Nr == row.Nr);
3030:	foreach (var item in x)  // NULL-Ref-Exception 
3031	{ ... }

**
Ich habe einiges ausprobiert und konnte eine NullReferenceException nur dadurch erzwingen, dass "row" zu null gesetzt wird. Was im Programmablauf
durchaus eine realistische Annahme ist - jedoch nicht berücksichtigt wurde !**

Im Quellcode von .NET habe ich nachgesehen
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs


public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
            if (source == null) throw Error.ArgumentNull("source");
            if (predicate == null) throw Error.ArgumentNull("predicate");
            if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate);
            if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate);
            if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate);
            return new WhereEnumerableIterator<TSource>(source, predicate);
        }

Es wird effektiv immer ein Objekt zurückgegeben, was nicht null sein kann.

Weiter habe ich mit Tests wie diesem versucht die Ausnahme zu erzwingen was nicht gelang. Was mich nicht verwundert, wenn innerhalb von foreach die Referenz auf die zu durchlaufende Enumeration gehalten wird.


        [TestMethod, ExpectedException(typeof(NullReferenceException))]
        public void EnumerableNullReferenceException()
        {
            var _List = new List<object>();
            _List.Add(null);
            _List.Add(null);

            var results = _List.Where(p => p == null);
            foreach (var item in results)
            {
                results = null;
            }
        }

Herzlichen Dank !!!
Ein einfaches "JA" auf meine Eingangs gestellte Frage - würde mir weiterhelfen.

04.01.2018 - 20:22 Uhr
  • Webspace kostenlos.org besorgen

  • Ftp-Client einloggen

  • dann bist Du sicher in der Root

  • deine app.apk dahin kopieren ( nix neuer Ordner, nix script, nix Datenbank )

  • Download-Adresse http://kostenlos.org/app.apk

  • Android: "HttpClient" googlen - findest schon^^

04.01.2018 - 14:38 Uhr

Hallo Abt,

ja richtig.

API 9 und größer
apkFile.setReadable(true, false); // minimum API-Level 9 !

API 8 und kleiner
Runtime.getRuntime().exec("chmod 777 " + apkFile.getPath());

Edit: achso g... ähm, ja - fast unverändert. Die letzte Änderung knapp 10 Jahren ...

04.01.2018 - 11:12 Uhr

ja genau.

also Ordner kannst Du einfach "update" definieren - dann ist das in der root deiner App.

"apkFile" für den Download also "update/app.apk" z.B.

Ich hab nochmal nachgesehen bei mir. Is bissel chaotisch - aber der Installer
muss natürlich die *.APK auch lesen können, was nur der Fall ist, wenn die
Rechte auf der Datei entsprechend gesetzt sind.

Verwende ich so unverändert seit Android 1.6 (API 4)


	public static void install(Context context, File apkFile) {
		if (apkFile.exists()) {
			int currentapiVersion = android.os.Build.VERSION.SDK_INT;
			if (currentapiVersion >= android.os.Build.VERSION_CODES.GINGERBREAD){				
				apkFile.setReadable(true, false); // minimum API-Level 9 !
			}else{
				try {
					Runtime.getRuntime().exec("chmod 777 " + apkFile.getPath());
				} catch (IOException e) {					
					e.printStackTrace();
				}
			}
			
			Intent intent = new Intent();
			intent.setAction(android.content.Intent.ACTION_VIEW);				
			//intent.setDataAndType(Uri.parse("file://" + apkFile.getPath()), "application/vnd.android.package-archive");
			intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");			
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(intent);
		}
	}

29.12.2017 - 00:58 Uhr

Thema müsste heißen:

Fitness App erstellen Pest oder Cholera ?

Du willst den gesamten Markt abdecken ? Warum dann iOS ...
und nicht zunächst die restlichen 80% mit Android ?

Dir glaubt eh keiner - dass Du 5 Jahre entwickelt hast nur weil deine
App 25 MB groß ist ...

Mach es nativ und wird glücklich - muss ja nicht gleich der NDK sein ... 👍

29.12.2017 - 00:35 Uhr

Hallo

doch geht ( bei mir seit fast 10 Jahren so ) - alle Android-Versionen

  • deine App verbindet sich mit deinem Server
  • fragt nach einer neuen Version
  • startet den Download
  • installiert die APK per Installer

in etwa so:
https://stackoverflow.com/questions/4967669/android-install-apk-programmatically

29.12.2017 - 00:04 Uhr

mit DataTable.Merge könnten zumindest die 3 Dateien zunächst
zusammengeführt werden.
https://msdn.microsoft.com/de-de/library/fk68ew7b(v=vs.110).aspx
Nur der PK muss über 7 Spalten definiert werden ...
Von der Ergebnistabelle aus auf die beiden anderen mit Select und PK ...
zugreifen, die Strings zusammensetzen - fertig.

Nur sollen doppelte Einträge nicht doppelt sein - sicherlich.

Evtl. kann helfen die Spalte: CompatibilityNotes umzubenennen ...
CompatibilityNotes1, CompatibilityNotes2, CompatibilityNotes3
und mit MissingSchemaAction bei Merge arbeiten

Oder Sqlite nutzen "group_concat"
https://stackoverflow.com/questions/18778844/group-concat-in-sqlite

Wenn Du Dataset.Merge() in Betracht ziehst - wirst wohl nicht an MS SQL 2016 gebunden sein 😃

26.11.2017 - 16:32 Uhr

Das Problem an dem ich nun hänge ist, dass wenn ich die DataRow per Code anpasse, sich zwar der Wert in selbiger an den der DB anpasst, der DataRowVersion.Original Wert allerdings immer noch der ursprünglich geladene ist, welcher dann zu der Fehlermeldung führt.

DataTable.Load mit PreserveChanges

https://msdn.microsoft.com/de-de/library/system.data.loadoption(v=vs.110).aspx

kann das Problem lösen. Der DataReader für die Load-Methode ist das
Ergebnis einer Abfrage die genau nur den Datensatz mit der gewünschten
ID holt. Das funktioniert aber alles nur dann so schön, wenn diese ID auch
als Primary-Key im DataTable definiert ist !

Im Ergebnis befinden sich danach die Werte aus Datenbank im DataRowVersion.Original-Wert.

Es gibt 3 Optionen
https://msdn.microsoft.com/de-de/library/system.data.conflictoption(v=vs.110).aspx

wobei CompareAllSearchableValues tatsächlich nur "SearchableValues" einbezieht und das
schließt alle Spalten die als "IsLong" markiert sind in den
Metadaten aus !

Das Problem lässt sich nur durch Verzicht auf DbCommandBuilder und DbAdapter vermeiden,
so dass dann auch "binary blob"- oder varchar-Spalten verglichen werden können.

Nur dann kann für jede Zeile ein individuelles Update erfolgen und ermöglicht
werden, dass 2 Arbeitsplätze den gleichen Datensatz aktualisieren können
wenn jeweils unterschiedliche Felder verändert wurden.

Jede andere Konfliktlösung muss entweder vom Anwender bestätigt oder
durch vorher festzulegende Regeln definiert werden.

06.11.2017 - 21:57 Uhr

ja, die Frickelei war der Initialfehler - danach hilft nur noch drop table 😃

05.11.2017 - 13:53 Uhr

natürlich kann DataProvider damit umgehen - aber nur weil Du
anders als Thron die Werte als C# DateTime-Typ angibst und der
Provider daraus einen für Sqlite validen Datetime-STRING baut und
in die Tabelle einträgt. Das was Du in der Demotabelle stehen hast
sieht nicht so aus: 09.07.2017 00:00:00 sondern so: 1900-01-01 02:01:01.

Thron hat aber in seiner Tabelle stehen:
09.07.2017 00:00:00 und 14.12.2017 00:00:00

und nicht wie von Abt missverständlich angenommen wurde, es würde sich dabei um die angezeigten UI-Werte handeln - bzw. es sind die UI-Werte welche
1:1 in die Tabelle geschrieben wurden.

Bei den Formaten die Thron in der Tabelle hat hustet der DataProvider,
spätestens wenn er mit 0000-01-01 00:00:00 konfrontiert wird, was ein
valider Sqlite-Datum-Zeit-Wert ist aber kein Wert der in den c# DateTime Typ passt.

Selbst wenn Du bei Erstellung auf die Angabe DateTime verzichtest oder austauschst
cmd.CommandText = "CREATE TABLE Test( [ID] INTEGER PRIMARY KEY AUTOINCREMENT, [Name] Text, [Date] DateTime)";

funktioniert der Aufruf von
var dt = reader.GetDateTime(2);
korrekt, da erst hier der gewünschte Zieltyp implizit angefordert wird.

sqlite3.cs

 
    internal override void [B]Bind_Text[/B](SQLiteStatement stmt, int index, string value)
    {
      byte[] b = ToUTF8(value);
      int n = UnsafeNativeMethods.[B]sqlite3_bind_text[/B](stmt._sqlite_stmt, index, b, b.Length - 1, (IntPtr)(-1));
      if (n > 0) throw new SQLiteException(n, SQLiteLastError());
    }

    internal override void [B]Bind_DateTime[/B](SQLiteStatement stmt, int index, DateTime dt)
    {
      byte[] b = ToUTF8(dt);
      int n = UnsafeNativeMethods.[B]sqlite3_bind_text[/B](stmt._sqlite_stmt, index, b, b.Length - 1, (IntPtr)(-1));
      if (n > 0) throw new SQLiteException(n, SQLiteLastError());
    }

    internal override DateTime GetDateTime(SQLiteStatement stmt, int index)
    {
#if !SQLITE_STANDARD
      int len;
      return ToDateTime(UnsafeNativeMethods.sqlite3_column_text_interop(stmt._sqlite_stmt, index, out len), len);
#else
      return ToDateTime(UnsafeNativeMethods.sqlite3_column_text(stmt._sqlite_stmt, index), -1);
#endif
    }

05.11.2017 - 11:39 Uhr

Für Sqilte gibt es nur ein halbes Duzend Datentypen und DATETIME gehört
definitiv nicht mit dazu. https://sqlite.org/datatype3.html

Wenn Du die Werte 09.07.2017 00:00:00 und 14.12.2017 00:00:00
im Datensatz stehen hast sind diese vom Typ: TEXT

Insbesondere dann, wenn die Tabelle mit Create Table Fahrzeuge JDT_StartDate DATETIME, .... erstellt wurde.
Alle Sqlite unbekannte Typen werden auf TEXT umgebogen.

Deswegen funktioniert die Abfrage nicht - auch nicht mit Parametern.

Was Du brauchst sind gültige TimeStrings https://sqlite.org/lang_datefunc.html
und diese TimeStrings kommen in Felder des Typ: TEXT

INSERT INTO Fahrzeuge (JDT_StartDate, JDT_EndDate, JDT) VALUES('2017-07-09 00:00:00', '2017-12-14 00:00:00', 'A-FD 2017')

SELECT * FROM Fahrzeuge WHERE JDT_StartDate < '2017-11-03 00:00:00' AND JDT_EndDate > '2017-11-03 00:00:00';

So funktioniert das ( ungeprüft ) und weiter wie in anderen Beiträgen hier im Forum zu lesen - Datum-Zeit-Angaben als UTC speichern und die Zeitzone dazu nicht vergessen.

Sqlite kann zwar die Zeitzone mit speichern - weil der Datum-Zeit-Wert eine TEXT ist 😃

2013-10-07 04:23:19.120-04:00

Andere Datenbansysteme können das aber genau wieder nicht weil die
spezielle Typen für Datum-Zeit-Werte haben. Aus gründen der Kompatibilität
also besser ein Zeitzonen-Spalte pro Datum-Zeit-Wert erstellen.

JavaScript-Programmierer würden sich an einer solchen gültigen Anweisung
zur Tabellen Erstellung nicht stören

CREATE TABLE tableName (f1 MEINEOMA ,f2 DEINOPA)

vola - funktioniert. In die OMA/OPA - Datenbank Typen passen auch Datum-Zeit-Werte oder Fließkommazahlen rein ... 😃

CREATE TABLE tableName (f1 DATETIME ,f2 FUCKSQLITE)

INSERT INTO tableName (f1, f2) VALUES('Lustig ist das Zigeunerleben...', 'Zeitangaben sind doof')

21.10.2017 - 20:48 Uhr

sorry hab es wohl falsch verstanden.

"Dabei wird jeder TcpCient in einen eigenen Thread ausgelagert und sendet (Stream.Write) in endlosschleife Daten an den jeweiligen Client."

"Ich hoffe ich habe das jetzt irgendwie richtig verstanden:

1.) Warten bis eine TCP-Verbindung aufgebaut wird
2.) Auslagern in einen Thread"

"

while(isRunning){
   try{
     TcpClient c = listener.AcceptTcpClient();
     threads.Add(new ServerThread(c));//ServerThread hält aktuell die Verbindung immer offen und wäre sende bereit...
    }
    catch(Exception ex){
         isRunning = false;

         //Besonderer Fehler wenn der Thread geschlossen wird...
         if(System.Runtime.InteropServices.Marshal.GetLastWin32Error() != 10004)
                 Console.WriteLine(ex);
     }
 } 

"

und so geht es durch den ganzen Thread.

Es sollte dennoch möglich sein ohne Blockierungen mehrere Verbindungen
in einem einzigen Thread verarbeiten zu können. Deswegen der Link zu
Asynchronous IO.

jetzt hab ich auch das Beispiel aus MSDN gefunden:
https://msdn.microsoft.com/de-de/library/fx6588te(v=vs.110).aspx

Die Asynchronous IO per Netzwerkkarte erfordert keinen Thread in der Anwendung auch das Betriebssystem muss keinen Thread zwangsläufig erstellen. Wie im oben verlinkten Video am Bsp. der Festplatte erläutert wird.

21.10.2017 - 20:10 Uhr

Für jede Verbindung ein neuer Thread ist nicht wirklich optimal

https://www.youtube.com/watch?v=U5bTvc4yv5U&t=5514s

Die Anzahl möglicher Threads pro Prozess ist begrenzt - und die Grenze liegt nicht bei 10.000

Die Anzahl erzeugter Threads werden besser überwacht und begrenzt.

Asynchronous Socket Programming in C#

Threading

Viel Spaß und Erfolg

28.06.2017 - 00:03 Uhr

ja, übersehen - unter dem IF() steht, dass kein Eintrag existiert und jetzt ein neuer angelegt werden soll. Deswegen funktioniert 1. Variante auch nicht.
2. Variante funktioniert und ja 3 Variante würde nie funktionieren. - deswegen sag ich auch besser nichts dazu - sonst wird's wieder falsch.

Ich hätte es realisiert mit
if(!liste.Any()) oder list.count()==0 - damit das ! nicht übersehen wird auch wenn es weniger performat sein mag
{
// es existiert kein Eintrag, jetzt neu anlegen ?
}

was das IsSelected überhaupt soll - ich weiß es nicht.
Wenn ein Eintrag in der Liste ist der selektiert ist .... kommt auch die
Frage ob jetzt ein neuer angelegt werden soll, weil keiner existiert.

Das Variante 2 funktioniert im Sinne des Programmes ist reiner Zufall
und kann über die Selektierung vom Nutzer selbst bestimmt werden ...

Aber auch wieder nicht - weil diese Prüfung beim Öffnen der Ansicht/Laden
kommt und da hat niemals nie jemand was selektiert ...

26.06.2017 - 22:32 Uhr

SQL-Befehl (String) aus Klasse und Attribute erstellen ist evtl. nur der erste Schritt. Im zweiten Schritt wird das bauen des Befehls mit der tatsächlichen
Struktur der Tabellen abgeglichen. So dass "alte" Clients mit neuer Datenstruktur genauso sinnvoll arbeiten können wie neue Clients mit alter Struktur.
Für unsere mobile App gilt genau diese Anforderung, da niemals es möglich sein kann, dass die zentrale Applikation und erst recht nicht die mobilen Geräte
gleichzeitig mit einem Update versorgt werden können.
Ich weiß nicht ob die aktuellen Frameworks oder Provider so etwas unterstützen. Zu Zeiten von Android 2.1 habe ich nichts passendes gefunden.

26.06.2017 - 21:11 Uhr

hallo, ich finde es nicht lustig - es ist zum Heulen ...

if ((list.Count(p=>p.IsSelected) -1) == 0 )

=> Liste leer.
??

!! => Fix: (eingecheckt, Wochen später ...)

if ((list.Count(p=>p.IsSelected) -1) < 0 )

=> Liste leer.

wenn ich jetzt sage, dass die "-1" überflüssig ist, befürchte ich bleibt

if ((list.Count(p=>p.IsSelected)) < 0 )

=> Liste leer.
??

stehen und der Fehler ist wieder drin ....... es sei denn, in der Liste ist
ein "Blind"-Objekt enthalten, was immer da drin ist. Leider weit und breit
kein Kommentar und der Rest vom Code sieht genauso aus ...

07.03.2017 - 22:28 Uhr

und es vollkommen ausgeschlossen, dass die Server bei denen es funktioniert
die Root-CA des Clientzertifikates nicht kennen ?

Mein Gedanke dazu, ein Server sendet auch nicht die CA des Serverzertifikates
beim SSLHandshake. Der Client ist im Besitz der vertrauenswürdigen CA und
validiert das Serverzertifikat. Die vertrauenswürdige CA kommt aber auf anderen Wegen
OS-Update, Browser-Update o.ä. auf den Client. Nicht beim
SSLHandshake. Das hatte ich heute erst in Bearbeitung - allerdings mit Java.

Und irgendwas ist seltsam bei den Mitschnitten - oder ?
Length: 2064 => Length: 1470 => Length: 1467
Length: 2968 => Length: 2964 => Length: 2961 => Length: 1464 + 1491
Wenn das zweite Beispiel vollständig ist, dann ist das erste unvollständig

1464 + 3 + 1491 + 3 = 2961 + 3 = 2964 + 3 = 2968 == vollständig ?
1467 + 3 = 1470 + 3 != 2064 == unvollständig ?

Wenn das Clientzertifikat unmittelbar von einer Root-CA signiert wurde
reicht es nur das Zertifikat allein zu senden. Ansonsten muss die komplette
Chain gesendet werden - ohne Root-CA. Es würde die komplette Verschlüsselung obsolete
machen, wenn gegen die gesendete Root-CA validiert werden würde.
Dann wäre JEDES Zertifikat valide und Man-in-Middle der Normalfall.

"Yes, the whole chain (except the root) should be sent. I'll test (first) and commit your fix. Thanks."

https://bugzilla.xamarin.com/show_bug.cgi?id=16974

14.11.2016 - 23:17 Uhr

glaub nicht, schau mal hier

http://stackoverflow.com/questions/16626161/a-good-solution-for-await-in-try-catch-finally


static async Task f()
{
    ExceptionDispatchInfo capturedException = null;
    try
    {
        await TaskThatFails();
    }
    catch (MyException ex)
    {
        capturedException = ExceptionDispatchInfo.Capture(ex);
    }

    if (capturedException != null)
    {
        await ExceptionHandler();

        capturedException.Throw();
    }
}

vor c#6 braucht man async/await wohl kaum verwenden

26.10.2016 - 13:59 Uhr

Hallo Experten,

das Ziel ist einer ListView das Verhalten beizubringen wie es von
z.B. Nothon-Commander her bekannt sein dürfte.

Das Problem ist, mit ENTER in ein Verzeichnis wechseln zu wollen und auch
wieder zurück. Beim Wechsel in ein Verzeichnis wird das Problem nicht so
ganz deutlich wie aus einem Verzeichnis heraus. Da im ersten Fall der
selektierte Eintrag die oberste Zeile ist mit ".."

Im anderen Fall kann ich auch das Ursprungsverzeichnis selektieren, es scheint
alles soweit perfekt zu funktionieren.

Das Problem, mit ENTER erhält die ListView den Focus und nicht das angesteuerte
Item. Resultat ist, dass zweimal mit der Pfeiltaste gedrückt werden muss
um die Selektion wirksam zu ändern.

Besonders auffällig beim Herauswechsel in das Übergeordnete Verzeichnis
springt die Selektion beim ersten "Pfeil" -Druck in den ersten ".." Eintrag
hoch.

Jetzt ist der Focus an der richtigen Stelle, das Verhalten ist so aber nicht
gewünscht.


 <ListView ... FocusVisualStyle="{x:Null}"> 
 <ListView.InputBindings> 
 <KeyBinding 
Command="{Binding LocalDirectory.ChangeDirectoryCmd}" Key="RETURN" 
CommandParameter="{Binding ElementName=LocalDirectory, Path=SelectedItem}"> 
 </KeyBinding> 
 </ListView.InputBindings> 
 .... 
 </ListView> 

Ohne [FocusVisualStyle="{x:Null}"] wird das Problem auch optisch sichtbar.
Es wird nach "ENTER"-Druck eine gestrichelte Linie dem ListView-Rahmen
hinzugefügt.

Das Verhalten sollte ohne Code-Behind realisierbar sein.
Ich stelle die Frage nun nach dem ich 2 Tage versucht habe das Problem zu lösen

23.10.2016 - 12:30 Uhr

"Zwei Threads greifen auf Methode zu - Wie verhindere ich das?"

Wenn die Frage so gestellt wird, hilft zunächst das sicher weiter:
http://www.albahari.com/threading/

Später kannst Du an Deinem Problem gezielter weiterarbeiten.

03.10.2016 - 09:27 Uhr

Hallo zusammen

wie gut / schlecht ist die Filterung von Daten (Baumstruktur) in einer selbst angelegten Struktur aus Klassen, mit selbst programmierten Filter im Vergleich zu einer Suche im Datatable mit dt.Select ?

Weise im DataTable dem PrimaryKey die PK-Spalte der Datentabelle zu und
es geht wirklich sehr schnell - auch mit größeren Datenmengen.

In einem Besipiel synchronisiere ich mit DataTable.Merge Tabellen und
habe selber gestaunt wie performant das ist bei 40-60k Records.

Das ein DataTable mehr Speicher benötigt als flache Objekte liegt daran,
dass es min. 2 Versionen an Datensätzen vorhält.

Damit ist es u.a. erst möglich konkurierendes Arbeiten auf einem Datensatz
konfliktfrei zu ermöglichen in der Form 1 Nutzer ändert den Namen ein
anderer die Telefonnummer - gleichzeitig.

Die Möglichkeit bietet EF auch, ist aber per Default deaktiviert und muss
wohl mittels Attributen erst aktiviert werden. Hab nur darüber gelesen.

12.09.2016 - 20:11 Uhr

Zumal mit Eigenschaften und Methoden für Interfaces das ganze
irgendwie absurd wird. Dann doch lieber gleich C++ und Mehrfach-
vererbung verwenden.

Sobald ein Interface eine Eigenschaft oder implementierte Methode
haben müsste - nennt sich das abstrakte Klasse und wird auch so
verwendet.

30.08.2016 - 11:13 Uhr

VS 2010.

Der Code befindet sich im Projekt an 2 verschiedenen Stellen.
Nur eine davon bringt den Fehler

Fehlermeldung:
"System.Collections.Generic.IEnumerable<System.Data.DataRow>" enthält keine Definition für "Count", und es konnte keine Erweiterungsmethode "Count" gefunden werden, die ein erstes Argument vom Typ "System.Collections.Generic.IEnumerable<System.Data.DataRow>" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)


IEnumerable<DataRow> primaryKeysRows = adapter.StmtExecuteQuery(SelectPrimaryKeysQuery);
var primaryKeysCount = primaryKeysRows.Count();

Als Fehler rot unterstrichen ist Count(); und es ist der einzige Fehler beim kompilieren. Es fehlt jedoch nicht nur Count(), primaryKeysRows ist in der zweiten Zeile einfach nur keine Enumeration mehr !

In der ersten Zeile zeigt der Tooltip keinen Typ an, StmtExecuteQuery gibt jedoch IEnumerable<RataRow> zurück.

Was zum Teufel soll das denn ?

Lösung:
using System.Linq;

k.A. warum das fehlte, manuell habe ich noch nie den Eintrag einfügen müssen 😕

13.08.2016 - 12:18 Uhr

das ist aber nicht verwandt mit
Prism patterns & practices Developer Center
oder ?

Die Quellcodes sind es jedenfalls nicht

04.08.2016 - 12:16 Uhr

"Occurs when the visual representation of an item is being added to the visual layout."

ItemAppearing

"This method is guaranteed to fire at some point before the element is on screen."

Die Dokumentation und deine Beobachtung sind demnach identisch.
Für Android wird wohl die ObservableCollection als simple Collection/Liste
verwendet. Es existiert kein Observer. Android-Listen (GUI) kennen nur
ein Event beim Sichtbarwerden. Dann wird das Layout (Listeneintrag) mit
Daten neu befüllt. Dafür gibt es auch ein "Layout-Holder-Pattern" damit
das XML nicht immer geparst werden muss. Solch ein Holder ist aber nicht
zwingend nötig - aber genau an dem Punkt greift Xamarin wohl das Event ab.

Deine Beobachtung ist vollkommen korrekt.

Für UWP (xaml/ObservableCollection) müsste der Punkt abgegriffen werden
wo ein Eintrag tatsächlich gezeichnet wird. Den gibt es evtl. nicht wirklich
also wird die ObservableCollection.Add-Methode abgegriffen.
Es müsste aber das "Scroll-Event" benutzt werden.

Die Doku lässt diesen Spielraum zu - leider. Du musst Dich drauf einstellen,
dass solche Unterschiede immer wieder auftauchen. iOS hast Du vermutlich
noch nicht geprüft.

Evtl. musst Du auch ItemVisibilityEventArgs einbeziehen, momentan wertest
Du das nicht aus. Wollte mal eben in die Doku sehen und bekomme eine 404
Seite ...

https://developer.xamarin.com/404?link=%2Fapi%2Ftype%2FSystem.EventHandler%3CXamarin.Forms.ItemVisibilityEventArgs%3E%2F

😕

Wirklich kompatibel könnte Xamarin das Verhalten wohl auch nur mit der
https://developer.android.com/topic/libraries/data-binding/index.html
gestalten. Ich weiss aber nicht ob diese Lib Verwendung findet. Xamarin
dürfte älter als die Lib sein. Meine Anmerkungen im ersten Absatz beziehen
sich auf das Nicht-Verwenden dieser Lib.

29.07.2016 - 22:10 Uhr

richtig. einfach nur richtig, MarsStein

andererseits würde der Typ 'string' absolut ausreichend sein.

Der Einsatz von double würde nur zu Einschränkungen führen die nicht
wirklich gewollt sein können 😃

Das Volumen kann mit double doch nur einen Wert enthalten.

Viel flexibler wäre eine Angabe wie "50 ccm" oder "80 cubic Inch":)

Ohne semantischem Typ kannst dann rechnen "1 halb aufgeblasener
Luftballon + 100g Butter = X Meter. Lösung X ist 2".

In dem eingangs erwähnten Beispiel kann so etwas natürlich garantiert
nicht vorkommen. Aber nach dem 3ten Refactoring hast Du so eine
Rechnung im Programm und weißt es noch nicht einmal !

Oder permanente Unsicherheit und 100fachen Aufwand beim Testen.
Dann doch lieber 3 semantische Typen.

@malignate ein Programm von 200 Zeilen muss nicht verbessert werden.
Dieser Aufwand allein ist unverhältnismäßig.

Aber wenn die 200 Zeilen wo anders verwendet werden sollen dann ist
der "Aufwand" Pflicht. Wobei 400 Zeilen niemals zusammenkommen
bei 3 Typen mit je zwei Eigenschaften ...

21.07.2016 - 16:24 Uhr

https://developer.android.com

android:padding="10dip"

Leichter geht's natürlich wenn Android Studio installiert ist in einem
kleinen Demo-Projekt, weil die Sachen die Du suchst dort beim Editieren
der Layouts und Styles vorgeschlagen/gelistet werden.

21.07.2016 - 13:17 Uhr

interessante Frage, ob es nur an der Bindung liegt ?

DefaultCollectionView nachverfolgt scheint intern einen eigenen Zugriff
auf die Collection zu realisieren bzw. eine eigene Liste vorzuhalten mit
Referenzen auf die Einträge der Orginal-Collection.

base.Add(new WeakRefKey(collection), cr); //cr == CollectionRecord

Somit sind/wären unabhängige Auswahlen möglich.

Im Gegensatz zu (new ListCollectionView), die eine IList bekommt
und nur [index] zur Verfügung steht für die Zugriffe. Hinter IList verbirgt sich
ein Object für alle mit new ListCollectionView erzeugten Ansichten und
das eine Object hat einen [index];

In anderen von bb1898 genannten Situationen kann es einfach nur sein, dass
unterschiedliche Object(Collections) erzeugt wurden und mit new ListCollectionView
gearbeitet wurde. Dann sind unterschiedliche Auswahlen
auf jeden Fall gleichzeitig möglich.

15.06.2016 - 17:19 Uhr

Abt, ich lese das mir durch, garantiert.
Bin nur schon wieder verwirrt, dachte DoEvents gibt's nur in dem Cinch-FW.
Offenbar handelt es sich dabei aber um eine Standard-Implementierung von
irgendwo her. grrr

LaTino, guter Hinweis, wenn "während der Focus hart auf das nächste Control gesetzt wurde" ich übersetzen darf, der Focus wird im Code gesetzt und nicht
vom Anwender. Kann ich mir gut vorstellen um PropertyChanged-Ereignisse
auf diese Weise zu erzwingen um einen Wert "garantiert" zu speichern sollte
der Anwender vergessen den Focus vom Control zu nehmen oder die GUI-View
zu schließen.

Leute danke, ich glaube Ihr habt mir geholfen - Hoffnung habe ich allerdings
nun definitiv keine mehr ... die nächsten Tage werden lang 😕

-RB

15.06.2016 - 16:21 Uhr

Danke für die Nachfrage. Es handelt sich um ein größeres Projekt an dem
ich GUI-technisch nicht mitgewirkt habe bis jetzt und kann daher keine
exakte Aussage dazu machen.

Das Projekt basiert auf dem Cinch-Framework:
https://cinch.codeplex.com/
und ich habe in der Zwischenzeit noch ein Hinweis gefunden !
In den letzten 4-5 Beitragen:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/b22c6df8-a3b9-45b0-a9fe-62d1f571b7f1/updating-a-parent-window-component-from-a-modal-child?forum=wpf

steht "DoEvents" - diese Methode ist mir über den Weg gelaufen in Cinch
und ich habe nachgesehen:


namespace Cinch
{
    /// <summary>
    /// This class provides static helper methods for 
    /// working with the Dispatcher in WPF
    /// The following MSDN page is quite useful :
    /// http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.pushframe.aspx
    /// </summary>
    public static class ApplicationHelper
    {
        #region DoEvents
        /// <summary>
        /// Forces the WPF message pump to process all enqueued messages
        /// that are above the input parameter DispatcherPriority.
        /// </summary>
        /// <param name="priority">The DispatcherPriority to use
        /// as the lowest level of messages to get processed</param>
        [SecurityPermissionAttribute(SecurityAction.Demand,
            Flags = SecurityPermissionFlag.UnmanagedCode)]
        public static void DoEvents(DispatcherPriority priority)
        {
            DispatcherFrame frame = new DispatcherFrame();
            DispatcherOperation dispatcherOperation = 
                Dispatcher.CurrentDispatcher.BeginInvoke(priority, 
                    new DispatcherOperationCallback(ExitFrameOperation), frame);
            
            Dispatcher.PushFrame(frame);

            if (dispatcherOperation.Status != DispatcherOperationStatus.Completed)
            {
                dispatcherOperation.Abort();
            }
        }


        /// <summary>
        /// Forces the WPF message pump to process all enqueued messages
        /// that are DispatcherPriority.Background or above
        /// </summary>
        [SecurityPermissionAttribute(SecurityAction.Demand,
            Flags = SecurityPermissionFlag.UnmanagedCode)]
        public static void DoEvents()
        {
            DoEvents(DispatcherPriority.Background);
        }


        /// <summary>
        /// Stops the dispatcher from continuing
        /// </summary>
        private static object ExitFrameOperation(object obj)
        {
            ((DispatcherFrame)obj).Continue = false;
            return null;
        }
        #endregion
    }
}

Im 3. Beitrag von unten schreibt er:

"This is the case, when you block your dispatcher with a PushFrame() or something similar."

Ich werde nun das Projekt einmal nach Verwendung von DoEvents durchsuchen. Allerdings würde ich gern diese Exception auch mal bei
mir stabil reproduzieren können. Wenn da einer ein mini-Projekt hätte
wäre super. Evtl. reicht aber auch nur ne Zeile ...

Danke

-RB

Edit: weiter.

Ein einzige Stelle wurde gefunden:

while (_BackgroundWorker__XYZ.IsBusy)
  ApplicationHelper.DoEvents();

Bitte keine Frage speziell dazu, aber irgendwann wird DoEvents sicher aufgerufen ... abhängig von der Hardware und Mondphase usw. ... 😕

Jetzt kapiere ich nur nicht wie das alles Zusammenhängt!
Hat WPF eine eigene Messagequeue ? Also eine richtig eigene unabhängig von
der "Win32"-Messagequeue ?

Und wozu könnte DoEvents sinnvoll eingesetzt werden ? Glaube kaum das
es dafür wirklich sinnvolle Anwendungen gibt - ausser Holzhammer.exe

-RB

15.06.2016 - 15:49 Uhr

Servus,

in der gesamten Projektmappe findet sich kein einziger Aufruf von Undo()
wie es in diesem Beitrag angegeben ist.
http://stackoverflow.com/questions/29518507/moving-focus-in-textchanged-results-in-cannot-undo-or-redo-while-undo-unit-is-o

Die Ausnahme tritt sporadisch auf. Für mich bislang nicht reproduzierbar.

Fehlermeldung:
Cannot Reopen undo util while another unit is already open

Der Stacktrace (komplett ca. 40 Zeilen!) schaut so aus:


MS.Internal.Documents.UndoManager.Reopen(IParentUndoUnit unit)
at System.Windows.Documents.TextEditorTyping.OpenTypingUndoUnit(TextEditor This)
at System.Windows.Documents.TextEditorTyping.DoTextInput(...)
at System.Windows.Documents.TextEditorTyping.TextInputItem.Do()
...
at System.Windows.Controls.Primitives.TextBoxBase.OnTextInput(TextCompositionEventArgs e)
at System.Windows.UIElement.OnTextInputThunk(Object Sender, TextCompositionEventArgs e)
...

Ohne auf eine Zeile im Quellcode zu verweisen.

Ist jemandem von Euch so etwas schon untergekommen und kann Hinweise
geben ? Z.B. ob eine solche Ausnahme auf eine grundsätzliche fehlerhafte/falsche Handhabung von Events bzgl. Texteingaben hinweist und
was dabei grundsätzlich falsch gemacht werden kann/Stolpersteine ...

Eine derartige Ausnahme gibt es hin und wieder auch für ComboxEdit und muss
daher ein grundsätzliches Problem im Quellcode( oder xaml) darstellen.

Auch wenn diese Ausnahmen nur selten gemeldet werden befürchte ich, dass
sie öfters auftreten.

-RB

25.03.2016 - 11:14 Uhr

keine Panik bzgl. Untergang 😃

Zur Sache, in dem Video wird's gezeigt - Software die in solchen
Docker Containern Anwendung findet muss nativ auf Linux lauffähig
sein. Dank Mono funktioniert das mit ASP.net auch gut.
SQL-Server, der nicht auf Mono zurückgreifen kann, muss demnach,
soll er in solchen Containern eingesetzt werden, entsprechend neu
kompiliert werden.

Evtl. haben weitere MS-Server-Dienste diesen Schritt noch vor sich !
Oder auch nicht !!!

Mono wird sterben ! Denn wenn MS Exchange Server in einem Docker
Container lauffähig sein wird, wird auch das .NET Framework in exakt
der selben Form wie jetzt unter Windows eingesetzt werden müssen.

Exchange says no to .NET Framework 4.6.1

Exchange depends on .NET Framework to a larger extent than many other Microsoft applications.
The required version remains .NET Framework 4.5.2 because that is the version that the Exchange
product group has validated across its complete code base and all supported versions.

Wenn selbst das neue hausinterne Framework (noch) keine Freigabe erhält
wird auch ein Thridparty-DotNetFramework-Clone diese nicht erhalten.
Mono wird zukünftig einfach nur überflüssig sein.

Da Microsoft aber auch noch etwas Geld verdienen muss, erwarte ich, dass
zwar deren Software grundsätzlich auf Linux-Basis lauffähig sein wird, jedoch
evtl. nur innerhalb eines Containers der zwangsweise einen MS-Server-Host
hat.

24.03.2016 - 20:26 Uhr

Vielleicht will Microsoft mit SQL-Server auch nur einen anderen
Weg als mit WindowsMobile/WindowsPhone gehen. Kooperation
statt Untergang.

Zumindest ist es denkbar, dass ein SQL-Server ( egal welcher )
in der X-ten Virtualisierung kaum noch zu irgendwas zu gebrauchen ist.

Docker und Microsoft Windows

Microsoft hat in den letzten Jahren erkannt, dass die Container-Technologie immer wichtiger wird.
Daher arbeiten die Entwickler bei Microsoft eng mit den Docker-Entwicklern zusammen. Bei der
Docker-Einbindung in Windows Server 2016 handelt es sich also nicht um eine parallel entwickelte
Technologie, sondern die Docker-Entwickler nutzen in Windows Server 2016 die gleiche Codebasis
wie in Linux und erhalten Zugriff auf den notwendigen Windows-Code.

25. September 2015 docker-und-windows-server-2016-das-muessen-profis-wissen

“We are delighted to be working with Microsoft as it brings SQL Server to Linux,” said Mark Shuttleworth, founder of Canonical.

http://www.canonical.com/Services
Services that make the most of Ubuntu
...
A selection of customers using our Services
... Windows Azure ...

Im Juli 2014 haben sich die Firmen Microsoft, Red Hat, IBM, Docker, Mesosphere, CoreOS und Saltstack dem Kubernetes-Projekt angeschlossen, das von Google initiiert wurde. Ziel der Kooperation ist es, mit Kubernetes Docker-Container auf sämtlichen privaten, öffentlichen und Hybrid-Cloud-Umgebungen bereitstellen zu können.[10] Seit Version 1.0 verfügt Docker über die beiden offiziellen von der IANA zugewiesenen Portnummern 2375 für HTTP- und 2376 für HTTPS-Kommunikation.[11]

Das Unternehmen hinter Docker hat im Januar 2014 von verschiedenen Geldgebern zusammen 15 Millionen US-Dollar an Investitionen erhalten.[12] Im April 2015 folgten Investitionen in Höhe von 95 Millionen US-Dollar.[13] Insgesamt belaufen sich die Investitionen in die ursprünglich unter dem Namen dotCloud gegründete Firma damit auf gut 120 Millionen US-Dollar.

Basta 2015

Docker für ASP.NET-Entwickler, bringt das was?

Ob das was bringt ? Kein IIS für ASP.net nötig, keine aufwändige Installation
und alles in unter 5 Sekunden gestartet 😃

So etwas wäre für SQL-Server doch auch toll !?

27.01.2016 - 19:03 Uhr

Zurücksetzen ist die schlechteste Idee, wie schon angemerkt wurde.

Alternative wäre auf den PK AI zu verzichten, wenn keine anderen
Tabellen davon abhängen und auf die interne ROWID zurückzugreifen.

select ROWID, Name, Alter from ...

update/delete ... where ROWID = ...

müssten dann die Abfrage lauten. Die ROWID ist zwar auch zunächst
fortlaufend, wird jedoch bei genügend vielen Löschungen irgendwann
erneut vergeben, was eine Weile dauert, der Wert ist 64bit signed.

31.10.2015 - 23:34 Uhr

so kannst Du die Header lesen
[
...

WebResponse yanit = istek.GetResponse();

...
]

== > https://msdn.microsoft.com/de-de/library/system.net.httpwebresponse_properties(v=vs.110).aspx

31.10.2015 - 18:35 Uhr

Ist beim Kunden ein Virenscanner aktiv der den Netzwerkverkehr überwacht ?

28.10.2015 - 17:40 Uhr

Hallo,

ich denke Du wirst nicht der einzige sein der lesend und gleichzeitig
schreibend auf eine Tabelle zugreift. Seltsam auch, es soll nur eine
Installation betreffen was das Problem anbelangt.

Es wurde keine Transaktion benutzt bzw. die Benutzung ist irrelevant.

Wenn tatsächlich keine Transaktion für die Updates benutzt wird, wieso
bleiben dann die Sperren bestehen. Einzelne Befehle werden doch atomar
ausgeführt, nach meinem Verständnis.

db.ExecuteSQL(sqlstr, par); schließt die Verbindung nach jedem Schreibvorgang wieder ?

Sie ändert den Isolation Level der aktiven Connection von ReadCommited auf ReadUncommitted, d.h. bei Sperren wird nicht gewartet.

Das ist naheliegend 😉 okay,

Wenn genau das hilft muss auf der Kundendatenbank ein isolierter Update-Befehl
eine Sperre erzeugen und diese muss bestehen bleiben.

Hast Du schon mal Probiert im Managment Studio eine Zeile der Tabelle zu aktualisieren und anschließend im selben Abfrage Fenster zu lesen ?

Vorher auch das IsolationsLevel so setzen wie Du es per Default von dem
in der App verwendeten Provider erwartest.

Das selbe auf einer Kundeninstallation ausführen wo bisher das Problem noch
nicht aufgetreten ist.

Nicht das es irgendwo eine Einstellung pro Datenbank gibt, die ein solches
Default - Isolation Level setzen läßt !