Ich habe ein Projekt, bei denen die Haupt-Forms (MDI-Clients) alle im Win7 Design dargestellt werden; alle anderen Masken aber im Win10 Design (auch die Messagebox) und das obwohl bei beiden Forms nichts an den Standardeinstellungen bezüglich FormBorderStyle geändert wurde
Ich bin dann wohl einer Fehlinfo seitens MS erlegen: -->Regasm.exe
Dort steht:
Zum Ausführen des Tools verwenden Sie die Developer-Eingabeaufforderung (oder die Visual Studio-Eingabeaufforderung in Windows 7). Weitere Informationen finden Sie unter Developer-Eingabeaufforderung für Visual Studio..
Ich habe nicht gesagt "ohne", die "normalen" Runtimes werden schon benötigt..
Zur Info: das ist nur eine Hilfs-dll, um eine E-Mail aus VFP heraus per Outlook zu versenden (leider gibt es diesbezüglich einen Bug in VFP --> der Absender kann nicht gewählt werden, u. genau diese Funktion brauche ich )
Das ich die regasm.exe einfach so kopieren kann, wusste ich nicht (werde ich umgehend ausprobieren) ...
und direkt hier erhalte ich die Fehlermeldung "OLE-Fehlercode 0x80040154" die Klasse ist nicht registriert ...
Wie gesagt, es muss etwas mit den Remotedesktop-Clients zu tun haben (damit kenne ich mich nicht so gut aus, u. ich glaube leider der Systembetreuer des Kunden auch nicht ...) - auf einer lokalen Maschine mit direktem Programmaufruf funktioniert alles genau so wie es soll !
ich habe ein C#-COM-Dll geschrieben (inkl. einer REG-Datei).
Auf einer lokalen Maschine funktioniert das ganze Wunderbar...
Bei einem Kunden, der nur mit Terminal-Clients arbeitet, wurde die DLL mit Hilfe der reg-Datei über eine Service-Rolle durch den zuständigen Systembetreuer eingespielt (ich kann die Einträge unter HKLM sehen...)
- trotzdem sagt unsere Software ständig "
Fehler
OLE-Fehler - die Klasse ist nicht registriert
"
Die einzelnen User sind keine Admin´s (aber auch das angebliche Setzen der Admin-Rechte eines Users brachte keine Veränderung).
Was muss auf einem Terminal-Client gemacht werden, bzw. wie muss der User Rechte-mäßig eingestellt werden, damit eine Registrierung/Zugriff erfolgreich ist ???
Es ist aber Tatsache, dass alte SQL Server Versionen wirklich nur Stored Procs und dessen Execution Plan cachen konnten.
Neue SQL Server Versionen können jede Art von Statement (adhoc / sproc) cachen und diese einfach parametrisieren.
Der Performance-Vorteil von Stored Procs gibt es so gar nicht mehr.
Nach diesem Artikel / Abt´s Beschreibung würde es ja wenig Sinn machen eine stored procedure zu verwenden, wenn SQL die vorherigen Scripts im Speicher behält ...
Nur muss man wahrscheinlich darauf achten, das man dann weiterhin mit dem Parameter ("artikel" in meinem Beispiel) arbeitet, damit SQL das Script als bereits vorhanden erkennt.
Danke allen für die Inputs, ich werde alles noch mal überdenken ...
Wenn Du wirklich das Übertragen von 17 Byte Deines Queries einsparen willst, dann nennt sich das Mikro-Optimierung.
Es geht mir nicht um 17 Byte ( wie kommst Du auf diese Zahl ?) sondern um die Zeit die der SQL-Server offensichtlich jedes mal braucht um das Script zu generieren ...
Zitat
Wenn das tatsächlich Dein einziges Bottleneck ist, die Übertragung eines Queries, dann Respekt.
Das ist mit Sicherheit nicht mein einziges Problem; ich habe gerade erst mit dem Projekt begonnen u. will halt von Anfang an versuchen so viel Zeit zu optimieren wie möglich.
Denn bis jetzt finde ich c# + MS SQL ist nicht schneller als VFP 8o - oder (was wohl wahrscheinlicher ist) ich habe noch nicht die richtigen Wege / Methoden gefunden ... X(
Aber mein eigentliches (vielleicht auch nur gedankliches) Problem löst das nicht.
Das mit dem Drei-Schichten-Modell ist einleuchtend u. auch mit Sicherheit in größeren Projekten und im Team sinnvoll.
Noch mal zum Verständnis:
Ich habe, sagen wir mal 200 Artikel, von denen ich nacheinander die aktuelle Menge und die aktuellen Kosten/ Gewinne ermitteln möchte ...
Nacheinander alleine schon deshalb, um dem Kunden in der Statusleiste anzuzeigen, bei welchen DS / Artikel das Programm gerade ist.
Wie gesagt, das Script ist mehr als 400 Zeilen groß und es ändert sich jedes mal nur die Artikel-Nr als Filter.
Meine Logik sagt mir, das es auch eine gewisse Zeit braucht, bis ich das Script per SqlCommand an die DB übergeben habe, der Interpreter den Code in eine temporäre Prozedur umgewandelt (so habe ich es verstanden ...) und ausgeführt hat.
Nun wollte ich mir die Zeit für das 200-malige übertragen des Codes und das ebenfalls 200-malige erstellen einer temporären Prozedur sparen - deshalb der Gedanke einer "stored procedure", bei der ich ja nur noch den Parameter artikel übergeben muß.
Alleine schon, wenn diese beiden Möglichkeiten im Management Studio ausprobiere merke ich einen Zeitunterschied.
Für einen einfachen "Select ..." würde ich niemals auf die Idee einer stored procedure kommen...
Mir ist natürlich klar, das auch diese stored procedure dann gepflegt werden muss - ich plante die entsprechenden stored procedures per drop beim beginn der Programmausführung zu löschen und dann einmalig neu zu schreiben - wobei mir jetzt beim schreiben dieser Zeilen klar wird, das auch das nicht sauber funktionieren kann in einer Multi-User-Umgebung --> bleibt dann doch bei einer temporären Prozedur
Ich erstelle das Script (mehrere Tabellen, die über union all verknüpft ausgelesen und das Ergebnis in eine temp-Table gespeichert und anschließend weiterverarbeitet wird) immer erst im Management Studio; danach kopiere ich es in meine c#-Anwendung (als sql-command...)
Zitat
Wie viele Tabellen hat ca. so eine DB?
über 70 (von denen aber für die Abfrage "nur" ca. 30 für die Abfragen gebraucht werden) ...
Zitat
Wie Abt schon gepredigt hatte wird dadurch die Wartbarkeit und Skalierung negativ beeinflusst. In dem Fall ist diese Art von Optimierung eher nicht zu empfehlen.
Wieso beeinflusse ich die Skalierbarkeit des SQL-Servers - dieses Script () muss so ausgeführt werden - und die Skalierbarkeit hat doch eher was mit der hardwareseitigen Optimierung zu tun, oder ?
Ich war halt nur der Meinung das ich mit Hilfe einer stored procedure Zeit sparen kann, da ich ja das Script nicht jedes mal wieder an den SQL-Server schicken muss ...
So ein Script kann schon mal fast 1 s dauern (wenn es extrem viele Buchungen für diesen Artikel gibt) - das ist bei einer einzelnen Abfrage noch kein Problem; nur wenn ich Statistiken erstellen soll ...
Konkret geht es z.B. um über 400 Zeilen Code mit deren Hilfe ich über (fast) alle Tabellen einer DB z.B. die aktuellen Bestände / Kosten eines Artikels ermittle ...
Als Ergebnis bekomme ich dann eine Tabelle / ein Ergebnis zurück.
Der Code ist dabei immer bis auf z.B. die Artikel-Nr identisch.
Ich habe bisher diese Zeilen in einem SQL-Command direkt gesendet (funktionierte einwandfrei ...) - nun wollte ich (um das ganze zu optimieren - Zeitersparnis ?) das in eine stored procedure packen - da wir mehrere Mandanten haben und ich die stored procedure nicht in jeden Mandanten eintragen will, kam ich halt auf den Gedanken diese stored procedures global zu speichern.
@Abt: ich dachte der Befehl QUOTENAME wäre extra dafür da, um das Injezieren zu verhindern ?
ich versuche gerade in die [master]-DB eine stored procedure zu schreiben, damit ich nicht in jeden Mandanten die stored procedure reinschreiben muß ...
Das funktioniert soweit auch ganz gut.
Nachdem die stored procedure erstellt wurde wird vom MS immer noch die ersten 7 Zeilen vorangestellt:
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_meineprozedur] Script Date: 24.10.2017 16:20:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[sp_meineprozedur] (@nr int)
as
begin
print (db_name())
select * from meinetabelle
end;
@FZelle:
Vorab: ich bin Autodidakt und kein Studierter (und komme noch aus der VB u. FoxPro-Ära wo ich nahezu 18 Jahre erfolgreich programmiert habe) ...
Nun bin ich seit 2 Jahren dabei, mich schrittweise in C# einzuarbeiten - obwohl ich VFP immer noch für das bessere DB-Programm halte (aber es wird nicht mehr weiterentwickelt und ist auch mit 64-Bit nicht kompatibel)
Warum soll ich nicht alles das, was ich immer wieder in allen Stammmasken brauche, in eine BasisForm packen ? Wenn ich die TabControls in ein UI-Control packe, habe ich ja nur die Hälfte in einer Klasse.
Ähnlich, wie "ErfinderDesRades" tue ich mich auch schwer darin, das Drei-Schichten-Modell als Allheilmittel anzusehen - ok, der Code ist zwar durch die optische Aufteilung schneller zu finden, aber ob das nun einfacher ist ...
Das mit "global" ist im Moment mein Ernst, bis ich was besseres gefunden habe: es beinhaltet alles Methoden die ich immer wieder brauche, aber nicht in allen Form´s u. Prg´s reinschreiben will - wenn dann nämlich eine Änderung/Anpassung kommt muss man das ja wieder an allen möglichen Stellen machen ...
Das das der gekapselten Objektprogrammierung widerspricht, ist mir klar ...
Wenn Du dafür einen besseren Vorschlag hast, ich bin ganz Ohr ...
Ich denke, ich habe verstanden was das ref-Schlüsselwort bedeutet - an der von Dir gezeigten Stelle ist es natürlich nicht zweckführend (obwohl es funktioniert) - es sind dort noch viele Optimierungen zu machen, das ist mir klar (vieles davon ist noch kopierter, abgewandelter Code) ...
Hat leider auch nicht geklappt; könnte aber auch daran liegen, das ich ja mein "anderes" Projekt gar nicht am "laufen" habe (wie Du in dem anderen Thread schreibst) ...
Ich will mit einem Rechtsklick auf ein UserControl, welches über den Expander.Content an einem StackPanel hängt, genau dieses nach einer Sicherheitsabfrage löschen (also den Expander mit dem enthaltenen UserControl)
Ich habe dann also im Rechtsklick des UserControls eine Prozedur in der MainForm aufgerufen; in dieser ermittle ich das entsprechende StackPanel.Child um es dann zu löschen ...
Ich muß das ganze dynamisch machen, da die einzelnen Elemente des StackPanel erst zur Laufzeit vorhanden sind und dauernd welche hinzu kommen können ...
Stell dir das Board eine Fluglotsen vor, in dem immer wieder neue Flugzeuge (Streifen) hinzukommen und die erledigten herausgenommen werden ...
Das betrifft auch komischerweise "nur" Objekte, die ich aus einer "normalen" Form auf eine Form mit einer vererbten Basisklasse kopiere; wenn ich aus einer anderen Form (oder auch der selben) mit Basisklasse kopiere, funktioniert es ...
es scheint daran zu liegen, das es das StackPanel nicht mag, wenn es aus sich heraus (also wenn es den Focus hat ...) ein Element löschen soll ...
Mach ich das über einen Button, dann funktioniert es wie gewollt
Mal schauen, wie ich das löse ...
Der geplante Ablauf:
Ich wähle ein UserControl, welches als Content am Expander hängt, per Rechtsklick aus, um diesen Expander samt UserControl dann zu löschen.
@123thomas:
Auch das hat leider nichts gebracht ...
@MrSparkle:
Wenn Du damit meinst, ich solle den »Form«.Designer öffnen u. mir daraus den Code kopieren - das ist ja noch umständlicher, zumal die entsprechenden Codeteile ja auch noch an diversen Stellen stehen ...