Laden...
Avatar #avatar-3521.gif
pollito myCSharp.de - Member
Dipl.-Ing. Ingenieurinformatik 78647 Trossingen Dabei seit 26.02.2010 314 Beiträge

Forenbeiträge von pollito Ingesamt 314 Beiträge

22.12.2015 - 10:44 Uhr
char[] val = "Test".ToCharArray();  
ds.Tables[db_DBKOMMPROTOKOLL].Rows[0][f_ANLAGEN] = val;  

Vielen Dank! Das tue ich auch, indem ich z. B. den Wert, der gespeichert werden muss, explizit mit der Methode String.ToCharArray() konvertiere (siehe "dt.Rows[0][f_ANLAGEN] = ...;"):

		public void dtsWrite(int em_count)
		{
			try
			{
				using (SQLBaseDataAdapter da = new SQLBaseDataAdapter($"select {f_ID}, {f_LFDNR}, {f_STATUS}, {f_ANLAGEN} from {db_DBKOMMPROTOKOLL} where ID = {CommID} and LFDNR = 1", con))
				{
					da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

					using (DataSet ds = new DataSet())
					{
						if (da.Fill(ds, db_DBKOMMPROTOKOLL) != 1)
						{
							throw new Exception($"Ersten Datensatz mit Kommunikations-ID = {CommID} nicht gefunden.");
						}

						DataTable dt = ds.Tables[db_DBKOMMPROTOKOLL];

						dt.Rows[0][f_STATUS] = dts[f_STATUS].Value;
						dt.Rows[0][f_ANLAGEN] = (em.emailpar[par.cmdEmail_attachment].Replace(Constants.StringSeparator, ";")).ToCharArray();

						using (DataSet ds1 = ds.GetChanges())
						{
							if (ds1 != null)
							{
								SQLBaseCommandBuilder cb = new SQLBaseCommandBuilder(da);

								con.Open();
								da.Update(ds1, db_DBKOMMPROTOKOLL);
								con.Close();
							}
						}
					}
				}
			}
			catch
			{
				throw;
			}
			finally
			{
				con?.Close();
			}
		}

Die Zuweisung wird ohne Probleme durchgeführt und danach steht erwartungsgemäß der geänderte Wert als char[] in diesem Feld. Wenn ich die Zuweisung testhalber nicht mache, steht der durch Fill() eingelesene char[]-Wert in diesem Feld. Will heißen, das Feld speichert richtig und die Fill-Methode füllt ebenfalls richtig. Will man jedoch speichern, dann tritt der Fehler in beiden Fällen auf.

Lasse ich in der SELECT-Anweisung "{f_ANLAGEN}" weg (also kein char[]-Feld mehr), so arbeitet die Update-Methode korrekt.

Langsan befürchte ich, dass Gupta hier ein Problem hat. Allerdings ist das Fragen in den Gupta- bzw. SQLBase-Gruppen nahezu zwecklos: Zunächst handelt es sich um paranoische, geschlossene Gruppen, so dass nur wenige Einsicht in diese haben und zusätzlich ist sehr wenig los und dementsprechend fallen die Antworten aus – meine letzten zwei Fragen wurden kaum gelesen und ich bekam auch nach Tagen keine Antwort.

Ich weiß, dass kann ich möglicherweise durch parametrisierte Befehle (sofern Gupta keinen Fehler hat) lösen. Beim Update ginge es auch, wenngleich viele Werte zu aktualisieren sind. Beim Insert sind es bereits 28 Felder, so dass hier ziemlich viel Arbeit m. E. um sonst zu bewältigen ist. Mit dem DataSet bzw, DataTable wäre das in der Tat eleganter (Performance spielt bei dieser Anwendung keine Rolle).

Nochmals vielen Dank!

22.12.2015 - 09:41 Uhr

Danke, das wäre der nächste Versuch, wenn das nicht geht. Das beantwortet jedoch nicht wirklich meine Frage, sondern zeigt mir nur einen Ausweg auf. Ich würde dennoch gerne wissen, warum das Schreiben eines gerade eingelesenen Datensatzes fehlschlägt, obwohl man kein "String-Gefricke" betrieben hat, sobald ein char[] beteiligt ist – das trägt nämlich zum Verständnis bei.

Ich selbst programmiere seit vielen Jahren Datenbankanwendungen unter dem Team Developer von Gupta, der keine Probleme mit "Long Varchar" hat. Nun muss ich mich in die Thematik ADO.NET einarbeiten und hier möchte ich schon wissen, warum ein Weg nicht geht – in diesem Fall warum ein DataSet bzw. DataTable mit char[] dieses Verhalten zeigt.

Bis auf den Datentyp (byte[] anstelle von char[] – Blob anstelle von Clob) beschreibt Microsoft u. a. hier, wie man das mit einem DataSet bzw. DataTable machen kann:

https://support.microsoft.com/en-us/kb/309158

D. h. prinzipiell geht das, nur in meinem Fall nicht – ich würde gerne wissen, warum es bei mir nicht funktioniert, unabhängig davon, welche Methode ich schließlich für den Datenbankzugriff verwende.

Nochmals vielen Dank!

22.12.2015 - 00:23 Uhr

Verwendetes Datenbanksystem: Gupta SQLBase 11.7

Ich möchte mit ADO.NET einige Werte einer SQL-Datenbank aktualisieren, was auch problemlos geht, solange die Datenbankspalte kein Char-Array ist.

Ich verwende die Datenbank SQLBase 11.7 der Firma Gupta. Diese definiert für ihren Datentyp „Long Varchar“ (dient der Speicherung fast beliebig langer Zeichenarrays) die .NET-Entsprechung „Char[]“.

Bereits der erste Test mit einer Datenbankspalte dieses Typs schlägt fehl. Ich versuche, einen gerade eben eingelesenen Datensatz ohne Änderung der „Long Varchar“-Spalte zu aktualisieren – dazu ändere ich lediglich einen Feldwert der Spalte STATUS (Variable "f_STATUS"), deren Datentyp schlicht String ist.

public void dtsWrite_Test1()
{
	try
	{
		using (SQLBaseDataAdapter da = new SQLBaseDataAdapter($"select {f_ID}, {f_LFDNR}, {f_STATUS}, {f_ANLAGEN} from {db_DBKOMMPROTOKOLL} where ID = {CommID} and LFDNR = 1", con))
		{
			da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

			using (DataSet ds = new DataSet())
			{
				con.Open();
				da.Fill(ds, db_DBKOMMPROTOKOLL);
				con.Close();

				ds.Tables[db_DBKOMMPROTOKOLL].Rows[0][f_STATUS] = "Änderung";

				using (DataSet ds1 = ds.GetChanges())
				{
					if (ds1 != null)
					{
						SQLBaseCommandBuilder cb = new SQLBaseCommandBuilder(da);

						con.Open();
						da.Update(ds1, db_DBKOMMPROTOKOLL);
						con.Close();
					}
				}
			}
		}
	}
	catch
	{
		throw;
	}
	finally
	{
		con?.Close();
	}
}


Die Variable "f_ANLAGEN" enthält den Namen der "Long Varchar"-Spalte "ANLAGEN". Diese wird im SELCT-Befehl des Datenadapters verwendet und somit beim Aufruf der Fill-Methode mit eingelesen. Nun ändere ich den eingelesenen Datensatz (ist nur einer), indem ich den Wert der Spalte "STATUS" (String) überschreibe. Weiter unten rufe ich die Update-Methode auf, die folgende Ausnahme wirft:

Fehlermeldung:
System.InvalidCastException
"Das Objekt des Typs "System.Char[]" kann nicht in Typ "System.String" umgewandelt werden."

Lasse ich im SELECT-Befehl die Spalte "ANLAGEN" weg, funktioniert die Update-Methode richtig. Also es hängt definitiv mit der "Long Varchar"-Spalte zusammen.

Versuche ich der "Long Varchar"-Spalte testhalber einen String zuzuweisen, schlägt das natürlich fehl:

ds.Tables[db_DBKOMMPROTOKOLL].Rows[0][f_ANLAGEN] = "Test";

Die Ausnahme lautet:

Fehlermeldung:
System.Data
Der Typ des Wertes stimmt nicht mit dem Spaltentyp überein. <Test> konnte nicht in der ANLAGEN-Spalte gespeichert werden. Erwarteter Typ: Char[].

Letzteres war auch zu erwarten...

Jetzt bin ich ratlos.

Was muss ich machen, um Char-Arrays mit ADO.NET speichern zu können?

Schönen Dank!

11.12.2015 - 20:33 Uhr

Danke!

Die Beschreibung von SQLBase an dieser Stelle ist sehr dürftig. Es wird auf .NET verwiesen, denn schließlich muss der Provider alle Klassen und Methoden implementieren und diese sind eben in der .NET-Doku beschrieben.

Ich werde gezwungenermaßen auf "HasRows" verzichten.

Schönes Wochenende und nochmals vielen Dank!

11.12.2015 - 19:40 Uhr

Ob es ganz korrekt ist? Die "Grundlagen" erklärt u. a. Microsoft selbst:

Abrufen von Daten mit einem DataReader

Darin empfiehlt Microsoft, vor dem "Read" "HasRows" abzufragen – ich mache nichts anderes, als solche Grundlagen aus der Doku auszulesen 😕

Zur using-Anweisung: Es handelt sich hier um Testcode.

Danke, aber deine Aussage widerspricht der Doku von Microsoft.

11.12.2015 - 18:48 Uhr

Verwendetes Datenbanksystem: <SQLBase 11.7 von Gupta>

Hallo!

Im unterstehenden Code liefert "reader.HasRows" immer "false" zurück, obwohl die Tabelle nicht leer ist.

Lese ich aber einmal mit "reader.Read()" vor "reader.HasRows", so liefert "reader.HasRows" den Wert "true" zurück.

Langsam glaube ich, dass der Datenbankhersteller Gupta bei der Implementierung von "HasRows" einen Fehler gemacht hat. Mir wäre es aber lieber, dass ich einen Fehler mache und jemand von euch mich darauf aufmerksam macht 😉

Kennt jemand dieses Verhalten?


// dbcs: Verbindungsstring
bool test(string dbcs)
{
	RetVal = true;
	
	SQLBaseConnection dbcon = new SQLBaseConnection(dbcs);

	dbcon.Open();

	using (SQLBaseCommand cmd = new SQLBaseCommand("select * from DBKOMMPROTOKOLL", dbcon))
	{
		SQLBaseDataReader reader = cmd.ExecuteReader();

		//reader.Read();			// Einmal lesen und HasRows liefert "true" zurück.

		if (!reader.HasRows)		// Liefert immer "false" zurück!
		{
			RetVal = false;
		}
		else
		{
			// Verarbeitung
		}
	}
	dbcon.Close();
	return RetVal;
}

Herzlichen Dank!

13.10.2015 - 14:45 Uhr

Danke für dienen Beitrag. Uns geht es ein kleines bisschen mehr als nur um Versionsverwaltung. Wenn ich das richtig verstanden habe, können die hier aufgeführten Systeme auch unterschiedliche Entwicklungszweige parallel verwalten. Das hätten wir auch gerne.

Die Dokumentation der einzelnen Stände inkl. Suche/Eingrenzung danach wäre auch ein nettes Feature.

Ich weiß auch nicht, ob und wenn, was wir zukünftig noch alles brauchen werden. Momentan kommen wir noch zurecht, aber das ist nicht befriedigend. Es ist alles von Hand zu Fuß... Wenn man einen Stand erreicht hat, wird dieser gezipt und konserviert. Ein Readme.txt beschreibt grob den Stand. Ansonsten arbeiten wir mit SyncToy, um Entwicklungsstände zu verteilen. Müssen wir einen früheren Stand rekonstruieren, geht die Sucherei sofort los. Dann parallel zum aktuellen Stand aktivieren, um daran arbeiten zu können. Es geht, aber es ist fehleranfällig und zum Teil zeitintensiv.

Ich denke aber, dass jeder Entwickler mit denselben Problemen zu kämpfen hat und das von mir Beschriebene für die Experten ein alter Hut ist.

12.10.2015 - 17:52 Uhr

Da wir absolute Neulinge in der Materie Versionsverwaltung sind, müssen wir versuchen, eine erste grobe Vorentscheidung aufgrund der Erfahrungsberichte anderer User zu treffen.

Hier sieht es so aus, als ob die meisten mit GIT zurecht kommen. Gibt es Mitglieder, die etwas über TFS berichten können?

Auf jeden Fall herzlichen Dank für eure zahlreiche Tipps!

12.10.2015 - 00:31 Uhr

Es kommt nicht vor, dass wir offline arbeiten. Wir haben immer eine Online-Verbindung und somit eine Verbindung zu einem Server im Internet oder über VPN (OpenVPN) zu einem Firmenserver.

11.10.2015 - 18:24 Uhr

Bin sicher nicht böse. Man kann heute ziemlich alles nachlesen und trotzdem braucht man etwas Orientierungshilfe.

Wie ich gerade sehe, ist auch die Version "Visual Studio Team Foundation Server Express 2015" auch bis 5 Anwender kostenlos.

11.10.2015 - 18:02 Uhr

Danke!

Ich möchte selbstverständlich so wenige Einstiegshürden wie nur möglich haben. Da wir nur zwei sind, wäre die Online-Version eine Überlegung Wert. Sollten wir eines Tages mehr als 5 Entwickler sein, dann dürfte das System auch Geld kosten.

Da wir absolute Neulinge sind, möchte ich mich nicht zusätzlich mit kryptischen Kommandos auf Zeilenebene herumschlagen.

Was ist der Unterschied zwischen "Visual Studio Team Foundation Server Express 2015" (im MSDN enthalten) und der Online-Version?

Nochmals herzlichen Dank!

11.10.2015 - 17:05 Uhr

Hallo!

Ich programmiere seit vielen Jahren, ohne mich jemals um eine Versionsverwaltung gekümmert zu haben. Allerdings haben sich in letzter Zeit einige Vorfälle ergeben, die mich sehr viel Zeit gekostet haben, bis ich gewisse alte Stände rekonstruieren konnte.

Darüber hinaus entwickle ich mittlerweile nicht mehr alleine, sondern mit einem Partner, der 80 km von mir sein Büro hat.

Diese zwei Punkte haben mich in Sachen Versionsverwaltung zum Nachdenken angeregt. Ich habe mich im Internet umgeschaut und habe sehr viel Infos über z. B. Team Foundation Server und GIT gefunden. Allerdings finde ich nicht den richtigen Draht zu diesen Systemen, so dass ich mich entschlossen habe, euch um Hilfe zu bitten.

Jeder von uns beiden verfügt über ein Microsoft-Action-Pack-Abonnement, bei dem ein MSDN-Abo enthalten ist. Darin enthalten ist u. a. Visual Studio Professional 2015, Visual Studio Team Foundation Server Express 2015, Visual Studio Team Foundation Server Extensions for Project Server 2015 usw. Auf der anderen Seite wird oft GIT empfohlen.

Wir programmieren einerseits unter Visual Studio und anderseits setzen wir eine völlig andere Entwicklungsumgebung ein: Gupta Team Developer

Wir suchen nicht die ultimative Versionsverwaltung, sondern ein System, dass uns hilft, schnell alte Entwicklungsstände wiederherzustellen, jeden Entwicklungsstand sauber zu dokumentieren und das gleichzeitige Arbeiten am selben Projekt in der Mini-Gruppe.

Welche wäre für uns die richtige Versionsverwaltung? Was würdet ihr für unsere Mini-Entwicklergruppe empfehlen, am besten ohne finanzielle Zusatzkosten?

Da wir in Sachen Versionsverwaltung absolute Neulinge sind, fällt es uns nicht leicht, auf Anhieb die Beschreibungen und Gegenüberstellungen der unterschiedlichen Systeme zu verstehen. Gibt es im Netz oder auch als Buch brauchbare Abhandlungen für "absolute beginners" über dieses Thema?

Für jede Hilfe bin ich euch im Voraus dankbar!

30.07.2015 - 12:28 Uhr

Nur aus Faulheit, denn das braucht man nur in den seltensten Fällen. Aber du hast recht – ich schaue, ob ich das zeitlich hinbekomme (das nächste Projekt treppelt schon!).

30.07.2015 - 11:59 Uhr

Es ist OK. Ich habe mich wahrscheinlich auch nicht richtig ausgedrückt.

Die Anwendung holt in periodischen Abständen aus verschiedenen E-Shops (OXID und Magento) neu angekommene Bestellungen, bereitet diese für das Ziel-ERP-System vor und wenn erfolgreich, setzt den Status der Bestellung auf "in Bearbeitung". Das alles läuft ohne jegliche sichtbare Ausgabe im Hintergrund ab.

Nur zu Testzwecken kann man der Anwendung ein Fenster entlocken, die ein RTF-Feld für eine zusätzliche Debug-Ausgabe enthält. Da jedoch die Datenabfrage einfach in einer Schleife im selben Thread läuft, wird während der Abfrage die GUI blockiert und man sieht erst dann die gesamte Ausgabe, wenn die Schleife beendet wird.

Mit dem zusätzlichen Code wird das RTF-Element nach jeder Ausgabe aktualisiert und man muss nicht bis zum Ende warten, um das Ergebnis zu sehen. Also ein rein kosmetisches Problem und nur dann notwendig, wenn man Tests macht – nichts für den Kunden.

Darüber hinaus reden wir hier von Zeiten in Sekundenbereich. Speziell die SOAP-Schnittstelle von Magento ist relativ langsam und braucht 1 bis 2 Sekunden je Bestellung. Bei 30 Bestellungen müsste man demnach 1 Minute auf das Ergebnis warten. Es ist einfach nur beruhigend, wenn man in der Zeit sieht, dass es sich etwas bewegt. Um mehr geht es auch nicht.

Bei OXID ist es anders: Da greife ich direkt über SSL auf die Datenbank zu, was auch über das Internet rasant schnell ist. Die gleichen 30 Bestellungen sind in gefühlt einer Sekunde angekommen – Welten liegen dazwischen und da bräuchte ich die Anzeige-Mimik sicher nicht.

Trotzdem Danke für die Links und die Gedankenanstöße – ich werde mir das auf jeden Fall genauestens anschauen.

29.07.2015 - 20:15 Uhr

Danke, aber mein Humbug funktioniert.

28.07.2015 - 20:08 Uhr

Hallo nochmals!

Bin ich selbst drauf gekommen.

Falls jemand die Lösung bräuchte, habe ich das so gemacht:


private void rtbWriteLine(RichTextBox rtb, string Text)
{
	rtb.AppendText(Text);
	rtb.AppendText(Environment.NewLine);
	rtb.ScrollToEnd();

	// RichTextBox aktualisieren.
	Action DummyDelegate = () => { };
	rtb.Dispatcher.Invoke(DispatcherPriority.Render, DummyDelegate);
}

Grüße

28.07.2015 - 19:39 Uhr

Hallo!

Ich habe eine Richtextbox in einer WPF-Anwendung. Innerhalb einer Schleife werden Daten aus einer Datenbank ermittelt und in die Richtextbox ausgegeben. Es funktioniert auch, allerdings während des Befüllens findet keine Aktualisierung der Anzeige statt und so sieht man erst am Ende (nach der Schleife) das Ergebnis.

Wie kann ich dafür sorgen, dass jedes Mal, wenn in der Schleife etwas an die Richtextbox angehängt wird, deren Inhalt angezeigt wird?

Im voraus schönen Dank!

temuco

04.07.2015 - 09:43 Uhr

Vielen Dank! Da hast du mir schwere Kost für diesen heißen Tag zum Fressen vorgeworfen 😉 Werde ich mir aber gegen Abend antun, wenn es nicht mehr so heiß ist. Auch bei Magento werde ich versuchen, diesbezüglich mich schlau zu machen.

Nochmals Danke!

03.07.2015 - 19:47 Uhr

Ich lese in den vielen Beschreibungen und Anleitungen immer wieder, dass die Daten selbst verschlüsselt werden. D. h. dass auch eine Übertragung über das unsichere http noch sicher sein soll. Allerdings werde ich zugegebenermaßen daraus nicht wirklich schlau, da ich es bisher nicht verstanden habe, wie das zu erfolgen hat, denn diese Beschreibungen behandeln das Thema nur oberflächlich.

Kümmert sich SOAP selbst (was ich nicht glaube) um die Verschlüsselung der zu transportierenden Daten oder die Anwendung (hier Magento)? Und wie funktioniert das?

Klar kann und werde ich in der produktiven Umgebung über https gehen. Es ist aber für mich nicht zufriedenstellend, etwas zu nutzen, ohne alle Zusammenhänge wirklich zu kennen.

Ich erinnere: In Magento muss ein spezieller Anwender (API-User) mit erweiterten Rechten angelegt werden. Dieser Anwender stellt dann die Verbindung über SOAP her, indem er sich mit seinem Namen und "API-Key" (Passwort) anmeldet. Die Anmeldung liefert einen Token zurück, der fortan für die weiteren API-Aufrufe zu verwenden ist.

Nirgends in der Beschreibung von Magento fand ich einen Hinweis auf die Nutzung von https, sondern alle Beispiele gehen von http aus. Das alles verwirrt mich und daher entschloss ich mich, diesen Thread hier zu starten, in der Hoffnung, dass auch andere vor diesem Problem standen und mich darüber aufklären könnten.

Danke und Grüße

03.07.2015 - 19:05 Uhr

Ich habe beides erfolgreich getestet. Allerdings liegt mir zurzeit nur ein selbstsigniertes SSL-Zertifikat für die Testumgebung vor, was mir noch Probleme bereitet.

Klar ist die SSL-Verschlüsselung eine Lösung, jedoch nur solange der Datentransport direkt zwischen Client und Server stattfindet. In der produktiven Umgebung werde ich in diesem Fall sehr wahrscheinlich über https gehen.

Allerdings würde es mich sehr interessieren, wie die Sicherheit auf Datenebene garantiert wird, falls man nur http verwenden würde. Hier finde ich, wie bereits erwähnt, nichts abschließendes.

03.07.2015 - 16:39 Uhr

Hallo!

Ich bekam den Auftrag, über SOAP Daten eines Magento-Shops zu ermitteln. Da ich jedoch bisher nie mit dieser Thematik (weder Magento, noch SOAP) zu tun hatte, musste ich zunächst auf Info-Suche gehen.

Wie ich das in C# abwickeln kann, ist mir mehr oder minder klar. Wo ich aber noch Verständnisschwierigkeiten habe, ist mit dem Thema Sicherheit.

In Magento muss ich zunächst eine Rolle anlegen, die "API Full Access" hat. Damit bekommen Anwender, denen diese Rolle zugewiesen wurde, Zugriff auf alle Ressourcen.

Nachdem ich die Rolle erstellt habe, erzeuge einen Benutzer, dem ich diese Rolle zuweise. Ich nenne ihn "API-Benutzer". Von ihm merke ich mir seinen Benutzernamen und Passwort (in Magento-Jargon "API-Key").

Der Client (also meine C#-Anwendung) logt sich mit dem Benutzernamen und API-Key – ich bekomme eine sog. "Session-Id" zurück, die ich fortan beim Aufrufen weiterer API-Methoden verwenden muss.

Nun meine Fragen:

  • Ist das ein gängiges SOAP-Verfahren und wie sicher ist das? *Wenn es so ist, werden die Daten zwischen Server und Client verschlüsselt übertragen?
  • Wer kümmert sich um eine mögliche Verschlüsselung? SOAP selbst oder die Serveranwendung (hier Magento)?

Ich habe viel gesucht, aber keine abschließende Antwort gefunden. Die einen sagen, das SOAP in diesem Fall die Daten verschlüsselt überträgt, während andere SSL empfehlen. Letzteres funktioniert aber nur bis zu einem gewissen Punkt (z. B. Proxy).

Das alle verwirrt mich, da ich zwar viel über die Programmierung fand, wenig jedoch über die Sicherheitsaspekt und insbesondere in Verbindung mit Magento.

Ich hoffe seh, nicht ganz off-topic geraten zu sein und würde mich sehr auf eure Einschätzung freuen.

08.06.2015 - 09:36 Uhr

Danke, aber die Preise sind für mich prohibitiv. Dann muss ich mit den Audits leben und diese selbst auswerten, auch wenn das mir nicht wirklich schmeckt.

Grüße und eine erfolgreiche Arbeitswoche!

05.06.2015 - 15:48 Uhr

Ja, das ist in der Tat eine Möglichkeit, allerdings ist das etwas unhandlich und vor allem erzeugt das Unmengen an Einträgen im Anwendungsprotokoll. Ich hatte gehofft, es gäbe eine einfachere Möglichkeit, die ich programmgesteuert nutzen kann und nur das protokolliert, was ich will.

Vielen Dank!

05.06.2015 - 14:47 Uhr

Hallo,

ich sollte Dateizugriffe beliebiger Dateien protokollieren. Das gelingt mir zum größten Teil mit folgender Klasse:

FileSystemWatcher

Allerdings überwacht diese Klasse nur Benachrichtigungen über Änderungen im Dateisystem – nur Lesezugriffe bekomme ich nicht mit und hier liegt mein Problem:

Wie können auch reine Lesezugriffe auf eine Datei protokolliert werden?

Im Voraus herzlichen Dank!

14.05.2015 - 17:27 Uhr

Vollkommen falsch! Es handelt sich in der Tat um eine C/S-Anwendung, sie ist aber 25 Jahre alt, also nicht 4-6... Sie soll in den nächsten Jahren schrittweise auf .Net überführt werden. Wir können nicht alles über den Haufen werfen und den Kunden sagen, dass die nächsten Updates erst mit der Fertigstellung des neuen Systems in fünf Jahren kommen. Es ist nie alles so einfach, wie man es sich manchmal vorstellt.

Darüber hinaus schrieb ich in meinem vorigen Beitrag, dass neben dem Datenbankserver ein Server mit der Geschäftslogik implementiert wird. Die Clients greifen darüber auf die Datenbank zu – nicht direkt. Direkt, das schrieb ich bereits auch, wird lediglich auf eine Datenbank einer Anwendung eines Drittheratellers zugegriffen. Dafür haben wir bereits eine funktionierende CA-Infrastruktur und der externe Zugriff ist nur und ausschließlich über SSL möglich. Der Datenbankserver lässt von außerhalb keine unverschlüsselten Verbindungen zu. Zudem findet der Anmeldevorgang zusätzlich mithilfe kryptografischer Verfahren innerhalb des SSL-Streams statt. Wenn das unsicher ist, dann fresse ich ein Pferd!

Wir können und werden nicht alles über den Haufen werfen, sondern einen gesunden Mittelweg gehen, der uns einen möglichst sanften übergang ermöglicht. Die Ausgangsfrage bezog sich aber auf die Präsentationsschicht und ich sehe hier WPF vorne, insbesondere nachdem ich vom MS ein Statement vom November letzten Jahres las, in dem die Zukunft von WPF bekräftigt wird. Und sollte man irgendwann doch auf HTML5/Javascript & Co. umsteigen müssen, so muss man die Werkzeuge, aber nicht die Denke ändern – das wäre mit Windows Forms definitiv nicht so.

14.05.2015 - 11:30 Uhr

Danke! Unter diesem Aspekt fällt m. E. WF weg. WPF scheint dagegen viel geeigneter zu sein. Angedacht sind mindestens drei Schichten: Datenbank, Server mit Businesslogik und Client. Dabei laufen Überlegungen, den Client eventuell zweischichtig zu realisieren, um die Präsentationsschicht weiter zu abstrahieren.

Nicht immer infach, wenn man seit 25 Jahren hauptsächlich mit was ganz anderem entwickelt hat.

Schönen Feiertag und danke für den Link!

13.05.2015 - 22:55 Uhr

Was Azure ist, wurde uns in den letzten Monaten richtig bewusst. Ich selbst sehe für die Zukunft keine klare Abgrenzung mehr zwischen lokalen und Web-Anwendungen mehr.

Wir werden zunächst mit der Portierung bzw. Neuentwicklung einer Client-Server-Anwendung starten, die es bereits seit vielen Jahren gibt. Ein Großteil der Geschäftslogik sollte serverseitig abgewickelt werden – so zumindest der Wunsch, was bei der alten Anwendung nicht der Fall ist.

Clientseitig bleiben wir auf der Windowsseite, wobei wir natürlich alle Geräteklassen unterstützen wollen (Windows-PCs, Windows-Tabletts, und Windows-Phones). Zukünftig teilweise auch iOS und Android.

Die ersten Teilprojekte, die auch getrennt von der Hauptanwendung ausgeführt werden können, werden Datenbankanwendungen sein, die lokal auf PCs ausgeführt werden. Zumindest eine der Datenbanken wird nur und ausschließlich über das Internet direkt angesprochen werden. Die Grundlagen dazu sind schon vorhanden (CA-Infrastruktur, SSL-Verschlüsselung usw.), so dass wir mit den Anwendungen starten können. Diese verwenden eine existierende Datenbank mit, die von einer Web-Anwendung zur Verfügung gestellt und benutzt wird.

Mit dieser Ausschweifung möchte ich nur sagen, dass eine klare Trennung nicht möglich ist. Zum jetzigen Stand und für die nächsten 2 bis 3 Jahre wird es sich primär um Windows-Anwendungen handeln.

Nun dafür kommen in erster Linie entweder Windows-Forms oder WPF in Frage. Allerdings werde ich den Eindruck nicht los, dass Microsoft einen Ass aus dem Ärmel zaubert und die eierlegende Wollmichsau rausbringt. Aber da bräuchte man wahrscheinlich die Kristallkugel.

Zum jetzigen Stand tendiere ich zu WPF.

Nochmals Danke!

13.05.2015 - 21:59 Uhr

Danke für die schnelle Antwort!

Ich war vor einigen Wochen auf einer Veranstaltung von Microsoft in Stuttgart (VIPP), bei der in erster Linie um Entwicklung für unterschiedliche Produkte auf der Azure-Plattform ging. Dabei wurde ich sehr hellhörig, als des öfteren über neue Wege auf der Basis von Technologien wie Java, HTML5 usw. für die Entwicklung neuer Applikationen gesprochen wurde. Danach gefragt sagten die Vortragenden, dass Microsoft mittlerweile vollkommen offen für Standards sei und sich dagegen nicht sperren will. Wichtig für Microsoft sein in erster Linie die Cloud und darin selbstverständlich die atemberaubend immer größer und mächtiger werdende Azure-Platform. Daher will man auch bei der Entwicklung in erster Linie Standards unterstützen.

So eine Aussage fällt gerade in der Zeit, in der wir uns neu erfinden... und führt schließlich zu Unsicherheiten und Fragen wie in meinem Einganngspost.

Nochmals vielen Dank!

13.05.2015 - 21:33 Uhr

Hallo!

Nun ist es bei uns endgültig die Entscheidung gefallen, zukünftige Entwicklungen (Datenbankapplikationen auf SQL-Basis) hauptsächlich in C# zu machen. Dabei möchten wir auf Technologien setzen, die möglichst ein lange Zukunft haben, wohl wissend, dass keiner eine Kristallkugel hat.

Wir möchten für die Oberflächenentwicklung unserer Datenbankapplikationen selbstverständlich Technologien verwenden, die einerseits die Arbeit mit Daten erleichtern und anderseits auch schön und modern aussehen. Daher dachten wir primär an WPF.

Nun lese ich aber widersprüchliche Berichte über die Zukunft von WPF – einerseits soll diese Technologie aufs Abstellgleis geschoben und durch Standards wie z. B. Javascript/HTML5 usw. ersetzt werden und anderseits soll ihr die Zukunft in der .Net-Welt ganz gehören.

Ich suche seit Tagen immer wieder nach Informationen im Internet, allerdings finde ich nicht wirklich klare Aussagen. Daher habe ich mich entschlossen, hier die Experten zu konsultieren, in der Hoffnung, ihr habt einen viel besseren Einblick, wie es mit WPF zukünftig aussieht und welche Technologien Microsoft für die Zukunft plant.

Sollte das Thema bereits woanders behandelt worden sein, so habe ich es mit der Suchfunktion leider nicht gefunden.

Im Voraus herzlichen Dank!

09.04.2015 - 11:29 Uhr

Herzlichen Dank für die schnelle Antwort. D. h. für mich, ich muss mit der aktuellen Version 6 beginnen und später wie jeder andere auf die Version 7 umsteigen. Es bleibt nur zu hoffen, dass der Umstieg nicht zu kompliziert wird. Aber da hilft das Forum sicher weiter.

Nochmals vielen Dank1

pollito

09.04.2015 - 09:49 Uhr

verwendetes Datenbanksystem: SQL-Server, SQL-Base (Gupta), MySQL

Hallo,

ich stehe vor dem Problem, mich in das Entity-Framework einarbeiten zu müssen. Bisher hatte ich keinerlei Berührungen damit, so dass ich ziemlich von Null aus starten muss. Datenbankanwendungen hatte ich bisher mit SAL (SQL-Windows von Gupta) geschrieben.

Nun sehe ich, das das Framework bei der Version 6 angelangt ist. Eine neue Version 7 ist bereits angekündigt und soll vieles anders als die Version 6 machen. Die Version 6 soll aber eine Weile weiterentwickelt werden.

Ich würde als Neuling gerne mit der neuen Version beginnen, finde aber nirgends einen Erscheinungstermin für die Version 7. Das ist aber nicht unwichtig, denn ich sollte bereits in den nächsten Wochen ein neues Projekt beginnen, welches das Entity-Framework sehr gut gebrauchen könnte.

Weiß jemand genaueres darüber?

Wenn ich mit der Version 6 beginnen müsste, worauf sollte ich achten, um das Projekt später auf die Version 7 möglichst schmerzlos zu überführen?

Für jede Hilfe im Voraus vielen Dank.

pollito

03.05.2014 - 21:25 Uhr

Ja, es ist richtig. Sich nicht so arg am Sprachgebrauch aufhalten. Es ist mir geholfen und ich kann jetzt weiter machen.

Danke und einen schönen Sonntag!

René

03.05.2014 - 21:09 Uhr

Unwahrscheinlich. Liegt aber auch daran, dass Du den Code einfach nicht verstehst.

Wenn jeder gleich alles verstehen könnte und würde, gäbe es die Notwendigkeit von Foren nicht – das so nebenbei. Allerdings kann es auch anders liegen, wie du weiter unten aufführst.

Wahrscheinlich ist aber Dein VS-Debugger so eingestellt, dass er jede eigene Exception anzeigt.
Starte das Ding ohne Debugger und die Anwendung wird nicht abstürzen.

Ja, es liegt am Debugger und ich bin nicht einmal im Traum davon ausgegangen, dass er mir die Probleme bereitet. Alle bisher erstellten Beispiele funktionieren außerhalb des Debuggers richtig – also doch verstanden, aber durch den Debugger in die Irre geleitet.

Im Übrigen, auch dein Beispiel schmiert im Debugger ab:

Siehe Dateianhang.

Jetzt bin ich beruhigt.

Ich danke dir für den Hinweis!

René

03.05.2014 - 19:12 Uhr

Danke, aber stupide ist das Unterfangen nicht.

Warte unmittelbar vor "tokenSource2.Cancel();" eine einzige Sekunde mit "Thread.Sleep(1000);" – ansonsten keine weiteren Änderungen. Das Programm schmiert ab.

Dann ist die Frage berechtigt, was das Beispiel soll, wenn die kurz davor gestartete Task "task" nie ausgeführt wird, weil sofort beendet.

Da liegt mein Verständnisproblem.

03.05.2014 - 18:33 Uhr

Hallo,

ich mache gerade meine ersten Schritte auf dem Gebiet TPL und arbeite mich durch die Beispiele durch, um ein Gefühl dafür zu bekommen. Diese ändere ich geringfügig ab, um weitere Erfahrungen zu sammeln.

Auf der Grundlage eines Microsoft-Beispieles (Aufgabenparallelität (Task Parallel Library): Aufgabenabbruch) versuche ich unten stehenden Code zum Laufen zu motivieren. Er macht auch alles, was ich will, fliegt jedoch gehörig auf die Schnauze beim Aufruf von

ct.ThrowIfCancellationRequested();

Folgende Ausnahme wird ausgelöst:

Fehlermeldung:
System.OperationCanceledException wurde nicht von Benutzercode behandelt.
HResult=-2146233029
Message=Der Vorgang wurde abgebrochen.
Source=mscorlib
StackTrace:
bei System.Threading.CancellationToken.ThrowOperationCanceledException()
bei System.Threading.CancellationToken.ThrowIfCancellationRequested()
bei Program.<>c__DisplayClass1.<Main>b__0() in c:\Daten\Visual Studio 2013\Projects\Tests\Threads02\Threads02\Program.cs:Zeile 29.
bei System.Threading.Tasks.Task.InnerInvoke()
bei System.Threading.Tasks.Task.Execute()
InnerException:

"OperationCanceledException" wird aber im Hauptprogramm abgefangen und auch angefahren. D. h. "token2Source.Cancel()" bzw. "task.Wait(ct)" wirft bereits die Ausnahme, was ich an der Konsoleausgabe bzw. beim Debuggen sehr.

Wofür brauche ich dann "ct.ThrowIfCancellationRequested()", wenn diese Methode die Ausnahme anscheinend nicht an das Hauptprogramm durchreicht? Ich kann diese Ausnahme zwar im zweiten Thread abfangen, aber was soll mir das bringen?

Gehe ich dagegen mit return raus, sieht alles gut aus. Ist das aber? Wird der zweite Thread suber beendet?

Wie ihr seht, drehe ich mich mit diesem Beispiel im Kreis. Könnte mir jemand die Zusammenhänge etwas besser erklären?

using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    static void Main()
    {

        var tokenSource2 = new CancellationTokenSource();
        CancellationToken ct = tokenSource2.Token;

        var task = Task.Factory.StartNew(() =>
        {
            while (true)
            {
				Console.WriteLine("Task");
				
				Thread.Sleep(1000);
				
				// Poll on this property if you have to do
                // other cleanup before throwing.
                if (ct.IsCancellationRequested)
                {
					Console.WriteLine("Task: Abbruch! Warte noch einige Sekunden...");
					Thread.Sleep(2000);
					Console.WriteLine("Task: Und Tschüss!!!!");

					// Clean up here, then...
                    ct.ThrowIfCancellationRequested();
                }
            }
        }, tokenSource2.Token); // Pass same token to StartNew.

		for (int i = 0; i < 5; ++i)
		{
			Console.WriteLine("Hauptprogramm");
			Thread.Sleep(500);
		}

		tokenSource2.Cancel();

        // Just continue on this thread, or Wait/WaitAll with try-catch:
        try
        {
			Console.WriteLine("Hauptprogramm: Warte");
			task.Wait(ct);
			Console.WriteLine("Hauptprogramm: nach Warten");
		}
		catch (OperationCanceledException e)
		{
			Console.WriteLine("In catch 1: " + e.Message);
		}
		catch (AggregateException e)
        {
            foreach (var v in e.InnerExceptions)
                Console.WriteLine(e.Message + " " + v.Message);
        }
		catch
		{
			;
		}

        Console.ReadKey();
    }
}

Herzlichen Dank!

22.04.2014 - 10:26 Uhr

Danke! Das kenne ich. Hatte auch gehabt. Diesmal aber blieb der Fehler solange bestehen, bis ich die beschriebenen Aktionen durchgeführt habe. Ich möchte erst gar nicht daran denken, wie viel Zeit ich damit zerstört habe.

Nochmals vielen Dank!

18.04.2014 - 22:05 Uhr

Durch die Untersuchungen, wo Adobe in der neuen Version XI welche Werte in der Registry speichert, löste sich das Problem quasi von alleine! – Ich bin mir relativ sicher, dass der Reader zumindest einmal etwas aus dem Konfigurationsmenü heraus speichern musste, was wahrscheinlich die Heilung brachte.

In der Kategorie „Internet“ habe ich die drei gesetzten Haken zunächst weggemacht, dann gespeichert, anschließend wieder entfernt und erneut gespeichert. Ich sah auch in der Registry, wie er für jeden Haken einen Eintrag machte und diese wieder entfernte, als ich sie wieder setzte. Wahrscheinlich hat er in anderen Zweigen auch was geschrieben oder gelöscht, was zur Heilung beitrug. Seitdem funktioniert es.

Leider bin ich nicht auf die Idee gekommen, die Registry-Zweige zu speichern, um sie danach mit den geänderten zu vergleichen. Somit habe ich mir die Möglichkeit genommen, den oder die verursachenden Einträge zu ermitteln.

Nichtsdestotrotz bin ich glücklich, dass es jetzt funktioniert.

Einen schönen Dank und frohe Ostern!

17.04.2014 - 22:59 Uhr

Diesen Fehler bekomme ich jetzt:

Fehlermeldung:
Beim Aufruf einer COM-Komponente wurde ein HRESULT E_FAIL-Fehler zurückgegeben

Ich weiß nicht mehr, seit wann ich ihn bekomme. Der von mir eingangs beschriebene Fehler taucht nicht mehr auf. Nur dieser hier.

Ich habe gestern einfach zu lange gemacht und zu viel herum experimentiert. Hätte nicht machen dürfen.

Nun wird die Komponente gefunden, aber sie kann nicht verwendet werden. Auf dem PC von meinem Kollegen (gleiche Hardware, gleiche Software) arbeitet die Komponente jedoch einwandfrei.

Keine Ahnung, wo ansetzen. Bin auf eure Hilfe angewiesen.

Hier die gesamte Fehlermeldung:

Fehlermeldung:
Message:
Beim Aufruf einer COM-Komponente wurde ein HRESULT E_FAIL-Fehler zurückgegeben.

Source:
System.Windows.Forms

InnerException:

TargetSite:
System.Object CoCreateInstance(System.Guid ByRef, System.Object, Int32, System.Guid ByRef)

HelpLink:

StackTrace:
bei System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
bei System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
bei System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
bei System.Windows.Forms.AxHost.CreateInstance()
bei System.Windows.Forms.AxHost.GetOcxCreate()
bei System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
bei System.Windows.Forms.AxHost.CreateHandle()
bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
bei System.Windows.Forms.Control.CreateControl()
bei System.Windows.Forms.Control.ControlCollection.Add(Control value)
bei System.Windows.Forms.Form.ControlCollection.Add(Control value)
bei System.Windows.Forms.Control.set_ParentInternal(Control value)
bei System.Windows.Forms.Control.set_Parent(Control value)
bei ise.frmPDFViewer.frmPDFViewer_Shown(Object sender, EventArgs e) in c:\Daten\Visual Studio 2013\Projects\ISEprint\ISEprint\frmPDFViewer.cs:Zeile 486.

17.04.2014 - 18:52 Uhr

Schönen Dank!

Ich habe den Reader repariert und auch deinstalliert und wieder installiert – leider alles ohne Erfolg.

Ich habe einem Kollegen gebeten, das Projekt bei sich zu testen. Der Kollege hat denselben Rechner als ich (Notebook Lenovo E540). Das Betriebssystem ist ebenfalls dasselbe, so wie auch Visual Studio und sonstige Software wie z. B. der Reader. Das Projekt samt Einstellungen hat er von mir bekommen. Und bei ihm läuft es!

Ich stehe komplett auf dem Schlauch und weiß nicht wirklich weiter.

Woran könnte das Problem liegen? Hat irgendjemand eine Idee oder kennt zumindest das Problem?

Nochmals vielen Dank!

17.04.2014 - 01:10 Uhr

Ich weiß es, das Thema ist alt. Dennoch habe ich eine Frage dazu: Bisher verwendete ich Visual Studio 2010 und alles lief OK – egal ob das Zielsystem 32 oder 64 Bit war. Gleiches während der Entwicklung (bisher Windows 7 32 und 64 Bit). Eingestellte Plattform ist x86

Nun habe ich Visual Studio 2013 auf einem PC mit Windows 8.1 Prof 64 Bit und das Beispiel läuft nicht mehr. Nach der Anweisung

_adobeReader.Show();

kehrt die Anwendung zum Main() zurück unnd zeigt folgende Fehlermeldung an:

Fehlermeldung:
System.Runtime.InteropServices.COMException wurde nicht behandelt.
Message=Klasse nicht registriert (Ausnahme von HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Source=System.Windows.Forms
ErrorCode=-2147221164
StackTrace:
bei System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
bei System.Windows.Forms.AxHost.CreateWithoutLicense(Guid clsid)
bei System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
bei System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
bei System.Windows.Forms.AxHost.CreateInstance()
bei System.Windows.Forms.AxHost.GetOcxCreate()
bei System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
bei System.Windows.Forms.AxHost.CreateHandle()
bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
bei System.Windows.Forms.Control.CreateControl()
bei System.Windows.Forms.Control.WmShowWindow(Message& m)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
InnerException:

Klasse nicht registriert? Ich kann mich nicht erinnern, früher irgendwas registriert zu haben. Woran kann der Fehler liegen?

17.03.2013 - 15:58 Uhr

Hallo!

Ich erhalte im lokalen Netz einen Rechnernamen in der Form \computername. Daraus sollte ich den voll qualifizierten Namen in der Domäne ermitteln, um aus \computername \computername\domain.tld zu machen.

Es kann aber auch passieren, dass ich den voll qualifizierten Namen bekomme – das muss ich erkennen und in diesem Fall nichts machen.

Wie mache ich das am sinnvollsten?

Schönen Dank im Voraus und herzliche Grüße!

10.03.2013 - 22:56 Uhr

Vielen Dank! Wir haben zunächst eine Lösung gefunden, die ein wenig Programmierung und einer Kurzbeschreibung bedarft:
*Programmierung: Bis Windows 7 / Server 2008 benutzen wir die Kurzform für die Domänenangabe wie z. B. \SERVER_Freigabe_. Ab Windows 8 / Server 2012 verwenden wir die volle Domänenangabe in Kleinbuchstaben (!!!) wie beispielsweise \server.domain.tld_Freigabe_. Schließlich wird mit Hilfe der Druckerfreigabe der echte Druckernamen (Fullname) ermittelt und dieser benutzt (aus \..._Freigabe_ wird \..._Fullname_ *Beschreibung: Ab Windows 8 / Server 2012 müssen Netzwerkdrucker an den Arbeitsstationen mit dem Assistenten eingebunden werden. Bis Window 7 / Server 2008 ist das nicht notwendig.

Damit funktioniert der Druck mit Adobe Reader auch bei eingeschaltetem geschützten Modus.

Ansonsten sind wir fündig geworden und haben ein Programm gefunden, welches den Ausdruck von PDF-Dateien programmgesteuert erlaubt und das für lau und mit sogar Source-Code.

Nochmals vielen Dank!

08.03.2013 - 18:32 Uhr

Hallo!

Ich habe eine Anwendung entwickelt, die für den Druck von PDF-Dateien den Adobe-Reader nutzt. Eine relativ einfache Geschichte, indem der Reader mit den entsprechenden Parametern aufgerufen wird. Ein Aufruf sieht z. B. so aus:

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /h /n /s /o /t "C:\!\Test.PDF" "OKI MC562(PCL)"

"OKI MC562(PCL)" ist dabei ein lokal installierter Drucker.

Nun soll das Programm in ein ERP-System integriert werden. Das ERP-System verwaltet die zu verwendenden Drucker in einer Datenbank, wobei diese in aller Regel Netzwerkdrucker sind.

Für eine Abteilung werden dieselben Netzwerkdrucker verwendet, die nicht unbedingt lokal eingebunden werden müssen. Das ist auch nicht gewollt, da deren Namen je nach Betriebssystem (XP, Vista, 7, 8) sich unterscheiden können. Daher wird der Freigabename verwendet, was vollkommen ausreichend ist.

Beispiel:

\server.domain.local\Brother-Fach1
oder
\server\Brother-Fach1

Nun stelle ich fest, dass an einigen Arbeitsplätzen der sogenannte "geschützte Modus" des Adobe-Reader aktiviert ist und dieser verursacht erhebliche Probleme. Ich rufe ihn z. B. mit einem Netzwerkdrucker auf

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /h /n /s /o /t "C:\!\Test.PDF" "\\server\Brother-Fach1"

und es geschieht folgendes: Der Druckauftrag erscheint kurz in der Druckerwarteschlange und dann verschwindet er, ohne etwas gedruckt zu haben. Bis zum Aufruf des Adobe-Reader funktioniert auch alles OK – mein Programm erkennt die Netzwerkfreigabe als gültigen Drucker ohne Murren. Es druckt auch, solange der geschützte Modus nicht aktiviert ist.

Ich habe weiter geforscht und folgendes festgestellt:

Windows 7
Ersetze ich den Freigabename des Druckers durch seinen echten Namen auf dem Server, funktioniert der Druck auch mit dem geschützten Modus. In diesem Fall sieht dann der Aufruf so aus:

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /h /n /s /o /t "C:!\Test.PDF" **"\:::

Windows 8
Läuft das Programm aber unter Windows 8 mit aktiviertem geschützten Modus, gibt es wieder ein kurzes Aufflackern in der Druckerwarteschlange und er Auftrag verschwindet ungedruckt im Datennirwana. Hier muss ich die Domäne voll qualifiziert angeben, damit es funktioniert.

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /h /n /s /o /t "C:!\Test.PDF" **"\:::

Also ich kann im geschützten Modus den Freigabenamen nicht verwenden, sondern den echten Druckernamen. Darüber hinaus muss ich je nach Betriebssystem unterscheiden, ob ich die Netzwerkdomäne mit angeben muss.

Ich erhalte vom ERP-System lediglich den Server- und den Druckerfreigabenamen – vielleicht auch die Netzwerkdomäne. Allerdings muss ich daraus den echten Windows-Druckernamen und je nach Betriebssystem ermitteln, ob ich auch die Netzwerkdomäne verwenden muss.

Und jetzt endlich meine Fragen:

Gibt es standardisierte Klassen/Methoden, die mir das ermöglichen, ohne selbst eine Betriebssystemunterscheidung vornehmen zu müssen?

Gibt es vielleicht andere Lösungen?

Im Vorau besten Dank!

pollito

28.06.2012 - 09:44 Uhr

Vielen Dank. Dann müssen die 2003-Nutzer eben updaten.

Jetzt muss ich eine gute Beschreibung (möglichst in deutsch) finden. Deinen Link habe ich schon, es wäre aber toll, wenn ich weitere Quellen hätte.

Nun muss ich parallel die Voraussetzungen schaffen: Virtuelle Maschine mit 2008 + Exchange 2010, denn ich selbst habe ich noch einen Windows Server 2003 mit Exchange 2003 (schäm...).

Nochmals herzlichen Dank und wer noch weitere Quellenangabe zum Thema hat, einfach her damit.

Grüße

pollito

28.06.2012 - 08:08 Uhr

Vielen Dank. Das Bisschen, was ich bisher bisher darüber gelesen habe, sieht sehr gut aus. Wenn ich das richtig verstanden habe, ist dieses API erst für Exchange 2010 komplett implementiert. Nicht schlimm, obwohl ich noch Systeme mit Exchange 203 habe – diese müssen auf 2010 gebracht werden, oder gibt es hierfür irgendwelche Tricks, die mir den Zugriff über EWS gestatten könnten?

Nochmals schönen Dank!

27.06.2012 - 15:44 Uhr

Hallo!

Ich habe die Aufgabe, E-Mails über einen – falls vorhanden – Exchange 2010 zu versenden und diese in einem Exchange-Postfach anhand von der Absenderadresse abzulegen.

Ein Versand über SMTP ist zunächst kein Problem, aber wie bekomme ich dann die E-Mail in ein Exchange-Postfach gespeichert?

Über Outlook kann ich das Profil des angemeldeten Benutzers verwenden und ich denke – nicht getestet –, dass die versendeten E-Mails in seinem Postfach gespeichert werden. Dafür brauche ich aber Outlook und habe das Problem, dass ich irgendwie zwischen den unterschiedlichen Versionen (2003, 2007, 2010) unterscheiden muss.

Direkt über MAPI, weiß ich nicht. Hat das überhaupt noch Zukunft?

Hier brauche ich etwas Hintergrundinfos bzw. Denkanstöße, wie man an Besten das Problem angeht. Wenn ich dann weiß, welchen Weg ich gehen muss, werde ich euch mit konkreteren Fragen ärgern 😃

Im Voraus schönen Dank!

18.05.2012 - 11:00 Uhr

Zunächst herzlichen Dank! Ich habe gestern den Vatertag genutzt, einen Einstieg zu finden. Schließlich musste ich mich aber mit Nebenkriegsschauplätzen beschäftigen, so dass ich nur am Rande mich dem ReportViewer widmen konnte.

Meine Probleme begannen damit, dass ich eine SQL-Datenbank auf einem Windows Server 2003 habe, für die es clientseitig nur 32-Bit Treiber gibt. Da die Anwendung aber auch auf einem W7-64 laufen sollte, hatte ich zunächst keinen Zugriff auf die Datenbank. Mit vielen Tricks konnte ich irgendwann den ODBC-Treiber zur Mitarbeit überreden. Erst danach konnte ich einen ersten kleinen Bericht erstellen.

Hier haben mir deine Links weitergeholfen. Dafür nochmals Danke! Allerdings erklärt Microsoft eher Vorgehensweisen – zwar sehr gut, aber man muss schon zunächst wissen, was man machen will. Schon hier hapert es bei mir, so dass ich mir höchstwahrscheinlich ein Buch zulegen werde, das sich mit Datenbankprogrammierung unter C# bzw. .NET befasst, um die Lernphase etwas zu beschleunigen.

Jetzt gehe ich auf Suche und hoffe, das richtige Buch zu finden.

Grüße

17.05.2012 - 11:25 Uhr

Danke! Klar kenne ich die Seiten, aber ich hatte gehofft, ich finde ein gutes Buch, das ich bequem auf dem Sofa lesen kann 😃

Ich springe dann ins kalte Wasser und versuche es "von Hand zu Fuß".

Schönen Tag!

15.05.2012 - 23:22 Uhr

Dann ist er das Tool der Wahl, wenn du mit "gibt es auch als ASP.NET Komponente" denselben Reporter meinst.

Schönen Dank!

René