Laden...
Avatar #avatar-3402.jpg
7.e.Q myCSharp.de - Member
Student Mechatronik Scheeßel Dabei seit 06.10.2004 925 Beiträge
Benutzerbeschreibung

Forenbeiträge von 7.e.Q Ingesamt 925 Beiträge

06.06.2007 - 18:32 Uhr

Original von Noodles
Mit new Guid wird es nur eine empty Guid.

Guid g = Guid.NewGuid();  

Stimmt... Asche auf mein Haupt.

06.06.2007 - 18:31 Uhr

Nein, das ist ja das merkwürdige.... Die IstsLicTool.exe ist eine der deploy-Dateien aus den Application Unterordnern.

06.06.2007 - 15:40 Uhr

Das Problem hat sich aus uns unerfindlichen Gründen selbst erledigt...

06.06.2007 - 15:22 Uhr

Hi Leute,

ich hab 'n C# Projekt hier, wo ich 'n stark typisiertes DataSet reingebaut hab. Dieses Dataset bezieht sich auf 'ne Access DB. Wenn ich nun eine Tabelle der DB über den DB Explorer auf das Hauptform ziehe, legt der Designer ja automatisch alle notwendigen Objekte dafür an. Bloß an unterschiedlichen Stellen in der InitializeComponents() des Forms scheint er Mist zu machen:


            this.customerDBDataSet = new IstsLicTool.CustomerDBDataSet();
            this.tbl_AnwenderTableAdapter = new IstsLicTool.CustomerDBDataSetTableAdapters.tbl_AnwenderTableAdapter();
            this.tbl_FirmenTableAdapter = new IstsLicTool.CustomerDBDataSetTableAdapters.tbl_FirmenTableAdapter();

Da sich das Form ebenfalls im Namespace IstsLicTool befindet, genauso wie die Klasse CustomerDBDataSet, meint der Compiler, es mit einer Klasse CustomerDBDataSet aus dem Namespace IstsLicTool.IstsLicTool zutun zu haben, was natürlich Quatsch ist. Nehme ich den Namespace vor dem Konstruktoraufruf des CustomerDBDataSet weg, funktioniert's:


            this.customerDBDataSet = new CustomerDBDataSet();
            this.tbl_AnwenderTableAdapter = new CustomerDBDataSetTableAdapters.tbl_AnwenderTableAdapter();
            this.tbl_FirmenTableAdapter = new CustomerDBDataSetTableAdapters.tbl_FirmenTableAdapter();

Da meckert der Compiler nicht dran rum. Aber jedesmal, wenn ich im Form Designer was ändere, packt mir der Designer wieder den überflüssigen Namespace davor...

Warum? Ist das 'n Bug? Was muss ich tun, daß mir der Designer nicht nach jeder Änderung den Code verhaut?

Danke

Grüße,
Hendrik

06.06.2007 - 10:49 Uhr

Hi Leute,

wir haben hier gerade 'n Problem mit einem unserer Tools. Wir versuchen, es über ClickOnce zu veröffentlichen. Es ist vollständig signiert. Die Veröffentlichung klappt auch, nur beim Ausführen der setup.exe erhalten wir die im Anhang hinterlegte Fehlermeldung. Beim Klick auf "Details" erhalten wir folgenden Fehlertext:


INFO ZUR PLATTFORMVERSION
	Windows 			: 5.1.2600.131072 (Win32NT)
	Common Language Runtime 	: 2.0.50727.1318
	System.Deployment.dll 		: 2.0.50727.1318 (redbitsb1.050727-1300)
	mscorwks.dll 			: 2.0.50727.1318 (redbitsb1.050727-1300)
	dfdll.dll 			: 2.0.50727.1318 (redbitsb1.050727-1300)
	dfshim.dll 			: 2.0.50727.1318 (redbitsb1.050727-1300)

QUELLEN
	Bereitstellungs-URL			: file:///I:/Ists/bu/_pc/IstsLicTool/IstsLicTool.application
	Anwendungs-URL			: file:///I:/Ists/bu/_pc/IstsLicTool/IstsLicTool_1_1_0_6/IstsLicTool.exe.manifest

IDENTITÄTEN
	Bereitstellungsidentität		: IstsLicTool.application, Version=1.1.0.6, Culture=de-DE, PublicKeyToken=5734af5d94fa1f82, processorArchitecture=msil
	Anwendungsidentität		: IstsLicTool.exe, Version=1.1.0.6, Culture=de-DE, PublicKeyToken=5734af5d94fa1f82, processorArchitecture=msil, type=win32

ZUSAMMENFASSUNG FÜR ANWENDUNG
	* Reine Onlineanwendung.

FEHLERZUSAMMENFASSUNG
	Es folgt eine Zusammenfassung der Fehler. Details zu diesen Fehlern werden später im Protokoll aufgelistet.
	* Die Aktivierung von I:\Ists\bu\_pc\IstsLicTool\IstsLicTool.application führte zu einer Ausnahme. Folgende Fehlermeldungen wurden entdeckt:
		+ Die Datei 'IstsLicTool.exe' hat einen anderen berechneten Hash, als im Manifest angegeben ist.

FEHLERZUSAMMENFASSUNG FÜR DIE SPEICHERTRANSAKTION DER KOMPONENTE
	Es wurde kein Transaktionsfehler festgestellt.

WARNUNGEN
	Während dieses Vorgangs gab es keine Warnungen.

FORTSCHRITTSSTATUS DES VORGANGS
	* [06.06.2007 10:29:26] : Die Aktivierung von I:\Ists\bu\_pc\IstsLicTool\IstsLicTool.application wurde gestartet.
	* [06.06.2007 10:29:27] : Das Verarbeiten des Bereitstellungsmanifestes wurde erfolgreich abgeschlossen.
	* [06.06.2007 10:29:27] : Die Installation der Anwendung wurde gestartet.
	* [06.06.2007 10:29:27] : Das Verarbeiten des Anwendungsmanifestes wurde erfolgreich abgeschlossen.
	* [06.06.2007 10:29:28] : Die Anforderung der Vertrauensstellung und die Ermittlung der Plattform sind abgeschlossen.

FEHLERDETAILS
	Folgende Fehler wurden bei diesem Vorgang entdeckt.
	* [06.06.2007 10:29:28] System.Deployment.Application.InvalidDeploymentException (HashValidation)
		- Die Datei 'IstsLicTool.exe' hat einen anderen berechneten Hash, als im Manifest angegeben ist.
		- Quelle: System.Deployment
		- Stapelüberwachung:
			bei System.Deployment.Application.ComponentVerifier.VerifyFileHash(String filePath, Hash hash)
			bei System.Deployment.Application.ComponentVerifier.VerifyFileHash(String filePath, HashCollection hashCollection)
			bei System.Deployment.Application.ComponentVerifier.FileComponent.Verify()
			bei System.Deployment.Application.ComponentVerifier.VerifyComponents()
			bei System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options)
			bei System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp)
			bei System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
			bei System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut)
			bei System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

DETAILS ZUR SPEICHERTRANSAKTION DER KOMPONENTE
	Es sind keine Transaktionsinformationen verfügbar.


Das Problem ist, wir haben die Applikation zuerst mit einer anderen Signatur veröffentlicht. Aber der Kollege, dem die Signatur der Erstveröffentlichung gehörte, ist nicht mehr Mitglied unseres Teams. Die Signatur existiert also nicht mehr... Geht das überhaupt? Zwischenzeitlich die Signatur wechseln?

Kann da irgendjemand was zu sagen?

Mächtig Danke!!!

Grüße,
Hendrik

06.06.2007 - 09:18 Uhr

Genau, als Stichwort nennen wir da die Inter-Process-Communication - IPC.

06.06.2007 - 09:16 Uhr

Indem du der Player Klasse einen Member vom Typ Guid verpasst.


public class Player
{

  private Guid m_Guid;
  public Player()
  {
    m_Guid = new Guid();
  }
}

Damit hat jeder Player eine weltweit einmalige ID (datum heißt es ja GUID, global unique identifier... oder so ähnlich).

04.06.2007 - 09:04 Uhr

Mal wieder was neues in diesem Projekt?

01.06.2007 - 12:30 Uhr

Ein in ADO.NET entwickelter Provider lässt sich nicht nach COM exportieren, weil die Basisklassen und die verwendeten Typen nicht "COM-patibel" sind.

Und ein COM+ Wrapper kommt nicht in Frage, weil wir eine standardisierte Schnittstelle exportieren müssen. Es muss also zu irgendeinem der prä-.NET DB Standards kompatibel sein. ODBC, OLE DB, ADO (ohne .NET)... damit es in entsprechenden Clients verwendet werden kann.

01.06.2007 - 12:06 Uhr

Hi Leute,

wir suchen DAS Buch zur Entwicklung von und mit ADO.NET. Es muss auch speziell auf die Erstellung, Implementierung und Integration von DataProvidern eingegangen werden. Das wäre wichtig.

Ansonsten wären noch Themen wie Abwärtskompatibilität und wie man diese im ADO.NET Rahmen gewährleistet ganz interessant...

Können gern auch mehrere Bücher sein. Aber sie müssen gut sein!

Danke

Grüße,
Hendrik

01.06.2007 - 11:38 Uhr

Könntest du nicht sowas machen, wie (Pseudocode)



public int Main()
{

  Form1 tForm = new Form1();
  while(true)
  {
    Application.Run(tForm);

    if(tForm.Relaunch == true)
    {
      tForm = new Form1();
    }
    else
    { 
      break;
    }

  }
}


und dann in der Form1 Class eine Property "Relaunch" implementieren, die je nach Art des Schließen des Forms auf true oder false steht?

Spontaner Einfall, Quick & Dirty...

31.05.2007 - 13:29 Uhr

Bitte immer angeben: ODBC / ADO.NET

Hi Leute,

konkrete Frage: ist es möglich, einen ODBC Treiber in .NET zu entwickeln? Wenn ja, wie macht man das?

Details: wir haben einen ADO.NET DataProvider für eine proprietäre Datenbank entwickelt. Dieser ADO.NET DataProvider steht logischerweise nur .NET Anwendungen zur Verfügung. Das ist ziemlich doof! Wir müssen auch abwärtskompatibel sein (wie ich dieses Wort hasse...). Das heißt, wir brauchen auch eine Schnittstelle für Anwendungen, die kein .NET unterstützen. Da wäre ODBC die richtige Wahl, denke ich (oder?). Aus diesem Grund würde ich halt gern wissen, ob es möglich ist, dem ADO.NET Provider eine ODBC Schnittstelle zu verpassen, die auch in besagten "Nicht-.NET"-Anwendungen verfügbar ist.

Sollte dies nicht möglich sein, wäre ich für weitere Vorschläge sehr dankbar!!!

Danke!

Viele Grüße,
Hendrik

PS: ADO.NET Provider per COM direkt exportieren geht nicht; haben wir schon versucht.

31.05.2007 - 08:54 Uhr

Hat sich erledigt... war 'ne wirklich mühselige Arbeit, die Installation manuell wieder aus dem System zu frickeln, aber hat geklappt.

Also Fazit:

Bei Entwicklung einer Installer-Klasse unbedingt darauf achten, in der Uninstall() Methode Exceptions abzufangen!!! Andernfalls ist bei einem Fehler keine automatisierte Deinstallation mehr möglich!

⚠ ⚠ ⚠

30.05.2007 - 18:36 Uhr

Original von feadur
hallo,

zumindest für Maus- und Keyboardhooks scheint das eine Falschaussage seitens MS zu sein. siehe z.b.

>

Ich glaube mich erinnern zu können, daß einfache Maus- und Keyboard-Hooks die einzigen waren, die MS von dieser Aussage ausgeschlossen hat.

30.05.2007 - 10:57 Uhr

Boar, das ist ja ein echt schwerwiegendes Problem... ich beiß mir hier die Zähne daran aus. Ich bekomme das Produkt nicht mehr deinstalliert, wegen dieser beknackten unbehandelten Ausnahme... 😜 😜 😜

Stichwort: InstallException

Ich kann auch den ganzen Scheiß, den die Installation in der Registry hinterlässt, manuell entfernen. Wahrscheinlich finde ich aber nicht alles, denn wenn ich das tu und hinterher die Installation über das Studio nochmal anstoße, wird anscheinend wieder die fehlerhafte Installation durchgeführt. Denn eine Deinstallation wirft danach immer noch die gleiche Exception, obwohl sie im Code der installer-Class bereits 100% sicher korrigiert ist und ich auch schon mindestens 3 Rebuilts der kompletten Solution gemacht habe...

Kann mir da irgendjemand helfen? Das ist momentan ein echt gravierendes Problem hier...

30.05.2007 - 09:21 Uhr

Hi Leute,

ich hab ein kleines Problem. Ich hab ein Setup Projekt in einer meiner Solutions, das mit einer installer-Class zusammen ein paar Einstellungen vornimmt. Die installer-Class hat auch eine Uninstall() Methode. In der Uninstall() Methode hab ich nun eine Ausnahme, die dazu führt, daß die Deinstallation nicht fortgesetzt wird. Da das Projekt nun aber auf meinem System installiert ist, kann ich es nicht mit einer korrigierten Version des Installers überinstallieren. Das System will die alte (fehlerhafte) Version vorher deinstallieren, was ja wegen der Exception nicht funktioniert...

Wie bekomme ich nun die alte Installation weg, damit ich die korrigierte Installation anstoßen kann?

Danke

Grüße,
Hendrik

30.05.2007 - 00:38 Uhr

Schon, aber wenn ich eine völlig proprietäre Datenbasis habe, die ich in diesen Produkten ansprechen möchte und mich dabei gerne auf die Vorzüge von .NET stützen würde... gibt es da eine Möglichkeit? Eventuell Export nach COM (Interop)?

29.05.2007 - 16:16 Uhr

Bitte immer angeben: proprietärer IDataProvider

Hi Leute,

ist es möglich, beispielsweise aus Excel oder aus VBS oder anderen "Nicht-.Net" Anwendungen/Scripts auf einen ADO.NET DataProvider zuzugreifen?

Wenn ja, wie?

Danke!

Grüße,
Hendrik

29.05.2007 - 11:18 Uhr

Laut Microsoft sind Global Hooks mit C# nicht möglich... was ist da dran?

29.05.2007 - 10:28 Uhr

Für eine Bildschirmtastatur in DirectX Spielen würde ich sagen wäre das Stichwort "Direct3D Hooks" für dich die richtige Wahl.

Ganz interessant fand ich den Thread: http://www.zfx.info/DisplayThread.php?TID=19129

29.05.2007 - 10:22 Uhr

Ich hab mir inzwischen mal den Installer vom MySQL Connector/NET angeschaut. Da drin sieht man ja recht eindrucksvoll, wie man so einen Provider installiert. Aber das funktioniert bei mir irgendwie nicht. Ich kann zwar die Installation machen, die Keys werden auch in der Registry eingetragen, aber ich sehe den DataProvider trotzdem nicht im Connection Wizard....

Jemand 'ne Idee?

16.05.2007 - 09:54 Uhr

Irgendwie scheine ich doch zu blöd zum Googlen zu sein... ich hab nur Wilson's ORMapper gefunden, aber der kostet Geld. Keine wirklich nützlichen Informationen dazu. Und bei Wikipedia habe ich auch nach ORMapper gesucht, aber nur beim deutschen.

Hätte ich es gleich gefunden, hätte ich nicht gefragt.

16.05.2007 - 08:44 Uhr

Okay, da muss ich nachhaken: was ist ein ORMapper?

15.05.2007 - 17:44 Uhr

Okay, danke für deine Mühen und die guten Wünsche.

Andere?

15.05.2007 - 14:15 Uhr

Ich spreche allgemein von typisierten DataSets.

Hast du dir schonmal genau angesehen, was der Design Assistent da generiert?

Also ich habe mal probeweise in einem Testprojekt versucht, das ganze nachzustellen. Ich habe ein typisiertes DataSet angelegt, das sich zu meinem MySQL Server verbindet. Dann habe ich eine Klasse DBTest<T, U, V> angelegt, der ich auf dem generischen Wege den Typ des T: DataSet, der gewünschten U: DataTable und für V eines IDataAdapter implementierenden Typs übergebe.

Damit der Compiler damit arbeitet, habe ich über den DataSet Designer die Basisklasse des darin enthaltenen Adapters von System.ComponentModel.Component auf System.Data.Common.DataAdapter umgestellt. Dadurch kann ich den Adapter auch an die Klasse DBTest als V übergeben (zur Erinnerung, where V: IDataAdapter).

Die Klasse DBTest sieht bei mir also so aus:


using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace DataAdapterTest
{
    public class DBTest<T, U, V>
        where T : DataSet, new()
        where U : DataTable, new()
        where V : IDataAdapter, new()
    {
        private T mSet;
        private U mTable;
        private V mAdapter;

        public DBTest()
        {
            mSet = new T();
            mAdapter = new V();
            mAdapter.Fill(mSet);

            mTable = (U)mSet.Tables[0];
        }
    }
}

Das heißt, eigentlich sollte bei einem Aufruf, wie dem folgenden


DBTest<test2, test2.DataTable1DataTable, DataTable1TableAdapter> tColl = new DBCollectionClass<test2, test2.DataTable1DataTable, DataTable1TableAdapter>();

nun ja in dem Konstruktor von DBTest die ganze Struktur entsprechend aufgebaut werden. Aber...

... in meinem Testprojekt schlägt Fill() nun fehl mit einer NotSupportedException() in der Funktion System.Data.Common.DataAdapter.Fill(DataSet dataSet).

Edit: leider verlangt System.Data.Common.DataAdapter.Fill(DataSet dataSet) ein DataSet. Es gibt keine überladene Methode, die eine DataTable akzeptiert, weshalb ich hier zusätzlich noch den Typ des typisierten DataSets übergeben musste...

Weitere Info:

test2 ist das typisierte DataSet
test2.DataTable1DataTable ist, wie der Name schon sagt, die DataTable des TableAdapters aus dem typisierten DataSet
DataTable1TableAdapter ist dem Namen nach der Adapter (ursprünglich abgeleitet von System.ComponentModel. Component, in meinem Testprojekt hingegen von System.Data.Common.DataAdapter)

15.05.2007 - 08:43 Uhr

Ich bin auch ehrlich gesagt sehr froh darüber, daß C# keine Mehrfachvererbung unterstützt. Täte es das, fände es vermutlich auch Verwendung. Und wenn etwas in der OOP verwirrender nicht sein kann, dann ist es Mehrfachvererbung.

15.05.2007 - 00:23 Uhr

Was ist denn ein Adapter aus einem typisierten DataSet dann (hat hier schonmal jemand damit gearbeitet?)? Wie gesagt, als einzige Ableitung steht als Basisklasse standardmäßig Component bei der Definition der Adapter Klasse.

14.05.2007 - 17:01 Uhr

Okay... klar... der kleineste ist object. Du weißt aber, was ich meine... 😉

Leider sind die typisierten DataAdapter nicht von IDataAdapter, sondern eben von Component abgeleitet. Ich werde zuhause mal ausprobieren (wenn ich Zeit habe), wie der Compiler reagiert, wenn ich dem DataAdapter als Basisklasse IDataAdapter gebe...

14.05.2007 - 15:35 Uhr

Also, wie ich ja bereits festgestellt habe, ist der DataAdapter in einem typisierten DataSet standardmäßig abgeleitet von "Component". Dies führt dazu, daß natürlich in einer Klasse, die den Typ des Adapters über <T> vergeben bekommt die Methoden des DataAdapters nicht verfügbar sind. Logisch. Denn um trotzdem in der Klasse<T> universell auf die Methoden und Eigenschaften der Klasse T (Unterschied beachten) zugreifen zu können, wovon es mehrere geben kann, muss für T der Typ der Basisklasse angegeben werden (gäbe es nur eine Klasse, die T zugeordnet wird, bräuchte ich kein Generic). Und der kleinste gemeinsame Nenner ist hier "Component", welches kein Fill() und keine "Connection" kennt.

Ich dachte, es würde daher ausreichen, die Basisklasse des DataAdapter aus dem typisierten DataSet auf DbDataAdapter oder etwas ähnliches umzustellen. Aber die kennen auch kein Connection und kein Fill()... Hängt wohl damit zusammen, daß die DataAdapter aus den typisierten DataSets erst vom Designer erstellt werden, man also auch den Namen der standardmäßig Fill() genannten Methode beliebig umbiegen kann.

Es muss also wohl eine Klasse oder ein Interface her, die/das "Connection" und "Fill()" bereitstellt. Okay...

... hatte ich schon, hat auch nichts bewirkt.

Ich vermute nun, daß auch Select-/Insert-/Update-/DeleteCommand mit in die neue Basisklasse einfließen müssen, um in der Klasse<T> verfügbar zu sein.

Schade, daß ich keine Zeit habe, dies zu testen. Frühestens am Wochenende. :p

Wird's klarer, worauf ich hinaus will?

13.05.2007 - 22:00 Uhr

Du weiß schon, was ich vorhabe?

Ich möchte die redundanten Codeteile in einer Elternklasse unterbringen. Das allein sollte kein Problem sein.

Doch es geht mir nun darum, in dieser Klasse Objekte generisch unterzubringen:



public class ParentClass<T> where T : IRgendwas, new()
{
  T mAdapter;
}


So weit, so gut... Ich lege dort in der Klasse nun noch einen Konstruktor an. In dem Konstruktor initialisiere ich da Objekt mAdapter und möchte darauf einige Eigenschaften setzen und Methoden ausführen:


public ParentClass()
{
  mAdapter = new T();
  mAdapter.Connection = mConn; // mConn ist vom Typ DbConnection
  mAdapter.Fill(<Tabellenobjekt>);
}


Leite ich nun von dieser Klasse eine Klasse ab:


public class ChildClass : ParentClass<MyDatabaseAdapter>

Und gebe ihr einen Konstruktor:


public ChildClass() : base()
{ }


Dann erhalte ich erstmal beim Kompilieren eine Fehlermeldung, daß Connection und Fill() nicht definiert sind. Das liegt daran, daß die Standard Basisklasse eines Adapters in einem typisierten DataSet vom Typ Component ist. Die kennt natürlich keine Eigenschaft "Connection" und keine Methode "Fill()".

Das heißt, ich muss die Basisklasse der DataAdapter ändern. Daher die Frage: welche Basisklasse muss ich hier verwenden?

Komme ich nun über diese Compiler-Fehlermeldung hinaus (hatte ich schon über eine selbstgebaute Basisklasse erreicht), so erhalte ich zur Laufzeit im Konstruktor der ParentClass eine Exception, die da sagt, daß der SelectCommand des DataAdapters nicht versorgt ist. Stimmt auch. Wenn ich mir das Objekt mAdapter im Inspektor anschaue, ist keines der vier Commands (Select, Insert, Update, Delete) versorgt, alles "null".

Lege ich hingegen in der ChildClass direkt ein Objekt des typisierten DataAdapters an, so sind die Commands versorgt.

Weißt du, woran das liegt? Was mach ich hier falsch? Brauchst du mehr Details?

13.05.2007 - 14:10 Uhr

Niemand 'ne Idee, wie ich 'ne Parent Klasse anlegen kann, um Coderedundanz beim Erstellen von Objekten zu vermeiden, die typisierte DataAdapter enthalten?

Ich will nicht in jeder von mir angelegten Klasse den Code für das Anlegen eines DataAdapter Objekts neu schreiben müssen.

Keiner 'ne Idee?

11.05.2007 - 22:04 Uhr

Wo ist denn technisch der Unterschied zwischen ContainsKey und ContainsValue? Was sie bewirken, ist mir bewusst, aber warum die eine schneller ist, als die andere ist mir nicht ganz klar.

11.05.2007 - 20:12 Uhr

Ach da gibt's keins? Okay... da gibt's so'n Spruch mit "alt" und "Kuh"; der wäre ganz passend.

11.05.2007 - 20:06 Uhr

Also mit LINQ dauern 600.000 zufällige Einträge ca. 0,7 Sekunden. 🙂

11.05.2007 - 19:59 Uhr

Ah, cool, danke... trotzdem ist an der Stelle



mTable = new U();
mAdapter = new V();
mAdapter.Connection = mConn;
mAdapter.Fill(mTable);


SelectCommand immer noch nicht versorgt, obwohl V vom Typ ein DataAdapter aus einem typisierten DataSet ist. Bei der Klasse ist SelectCommand selbstverständlich versorgt, sonst hätte ich kein typisiertes Set.

Woran kann das liegen?

11.05.2007 - 19:14 Uhr

Original von onlinegurke

oder noch genauer:
Was ist daran genauer? Wenn ein Double genau rauskriegen willst und dazu zwei Floats dividierst hast du rein gar nichts gekonnt, außer eine niedrigere Genauigkeit. Die 8 Byte Speicher, die du dabei sparst kann man unter Jux verbuchen. Was am Ende am besten ist, kann man so sowieso nicht sagen (Was ist denn die 1 und was die 400?)

Ach... dann nenne mir bitte jemand das Suffix für Double! D? Mir sind gerade nur F und M geläufig. Sorry.

Mit "genauer" meinte ich eigentlich nicht die Anzahl der Stellen, sondern eigentlich eher semi-synonym "sauberer".

11.05.2007 - 15:45 Uhr

Hi Leute,

ich hab mal wieder ein Problem, bei dem ich nicht weiter komme. Ich hab in einem meiner Projekte eine Reihe typisierter DataSets mit DataTable und DataAdaptern drin. So weit, so gut. Die funktionieren für sich genommen auch alle. Ich habe nun Objekte, die jeweils auf einer DataRow eines solchen DataSets basieren. Diese Objekte halte ich in einer generischen Sammlung.

Ich möchte nun die Verweise auf die DataAdapter und DataTable in der übergeordneten Klasse unterbringen, um nicht für jede generische Sammlung den selben Code schreiben zu müssen (Anlegen der DataTable und DataAdapter Objekte). Darum habe ich auch die Elternklasse generisch gemacht.


public class MyBaseCollection<T, U>
 where T : DataTable
 where U : DataAdapter
{
.
.
.
}

(syntaktische Fehler vorbehalten; Pseudo-Code)

Ich möchte nun in dem Konstruktor dieser Basisklasse schon die Objekte anlegen. Aber folgendes geht ja bekanntlich nicht:



public MyBaseCollection() : MyOverall
{
  T mTable = new T();
  U mAdapt = new U();
}


Ich habe nun für die DataAdapter eine Basisklasse zusammengestrikt, die von DbDataAdapter abgeleitet wurde. Diese habe ich dann als where U : MyDataAdapter in meine generische Sammlung eingedreht:


public class MyDataAdapter : DbDataAdapter

um mit ihrer Hilfe den DataAdaptern eine gemeinsame Basis zu geben. Ohne diese Basisklasse, in der ich auch eine Connection-Property anlegen musste (die Basisklasse DbDataAdapter kennt diese anscheinend nicht), war der nächste Befehl nicht übersetzbar:


mAdapt.Connection = mConn; // DbConnection mConn; Teil von MyOverall

Daher brauchte ich in meiner Klasse MyDataAdapter noch eine Eigenschaft und ein Feld "Connection".

Das lässt sich so auch schon übersetzen bei mir. Nur mäkelt er jetzt beim nächsten Befehl


mAdapt.Fill(mTable);

daß der Adapter kein SelectCommand zugeordnet hat. Im durch <U> übergebenen DataAdapter aus dem typisierten DataSet ist diesem Adapter aber ein SelectCommand zugewiesen, das standalone in der Kindklasse auch funktioniert. Nur auf diesem Wege der Verlagerung des Adapters und der Tabelle in die Elternklasse fehlen auf einmal sämtliche Commands. Selbst die Eigenschaften "SelectCommand" und so sind weg. Jedenfalls zur Laufzeit. Zur Designzeit kann ich sie über Intellisense erreichen...

...

Lange Rede, kurzer Sinn: ist diese Form der Konstruktion überhaupt sinnvoll, um in jeder generischen Sammlung Adapter und Table überall von vornherein verfügbar zu bekommen? Geht das überhaupt so? Oder welchen Weg sollte ich beschreiten, wenn's darum geht, nicht in jeder Sammlung wieder



XYZ.XYZDataTable mTable = new XYZ.XYZDataTable();
XYZDataAdapter mAdapter = new XYZAdapter();

mAdapter.Connection = mConn;
mAdapter.Fill(mTable);


machen zu müssen?

The End

Danke und Grüße,
Hendrik

11.05.2007 - 11:30 Uhr

Die Optik hat sich etwas in Richtung WPF gewandelt (runde Ecken in den Menüs, ganz schick eigentlich).

Und unter der Haube stecken natürlich so schöne Dinge wie LINQ und die ganzen Foundations inklusive der dafür notwendigen Editoren. Auch wenn Microsoft daran noch viel tun muss. Der WPF Editor beispielsweise ist noch für'n Eimer.

11.05.2007 - 08:14 Uhr

Original von talla
Du benutzt nicht zufällig .Net 3.5 oder? Weil dort könntest du mit LINQ einfach den Except Operator verwenden und müsstest nichts manuell durchgehen.

Ich hab hier 'ne C# Express 'Orcas' Beta. Hab darin mal mein Testprojekt geladen. Aber ich habe keinen Zugriff auf die LINQ Funktionalität. Sie taucht im Intellisense nicht auf und auch ein Build Vorgang schlägt fehl... Wenn ich in die Projekteigenschaften schaue, steht dort sinngemäß "Target Framework: .NET 3.5". Schaue ich ins "Help->About", so steht dort etwas von .NET Framework 2.0...

Frage ist, was muss ich einstellen, um LINQ in dem Projekt nutzen zu können?

Danke

EDIT: aaaaaaah...


using System.Core;

alles klar... geht 🙂 Danke!

11.05.2007 - 08:03 Uhr

oder noch genauer:



double newtime = 1.0F/400.0F;


10.05.2007 - 18:14 Uhr

Naja es geht ja darum, daß ich zwei Listen habe; ListeA und ListeB. ListeA enthält eine Reihe Einträge und ListeB. Es soll nun die Restmenge gebildet werden, jeweils aus ListeA zu ListeB und aus ListeB zu ListeA. Also im ersten Schritt beispielsweise soll eine ListeC nach dem Aufruf alle Elemente enthalten, die in ListeA, nicht aber in ListeB enthalten sind. In Schritt zwei dann umgekehrt. Daher habe ich mir diesen Subtraktionsoperator implementiert, der aus ListeB alle Elemente aus ListeA entfernt (und umgekehrt; je nach Aufruf). Eine andere Möglichkeit sah ich dort auf die Schnelle nicht. War auch nur ein Schnellschuss...

Mit doppelten Einträgen innerhalb einer einzelnen Liste hat es jedoch nicht viel zutun.

Beispiel:


ListeA enthält:

Apfel1
Apfel2
Apfel3
Apfel4

ListeB enthält:

Apfel1
Birne2
Apfel3
Birne4

ListeC = ListeA - ListeB wäre somit:
Apfel2
Apfel4

ListeC = ListeB - ListeA wäre somit:
Birne2
Birne4

10.05.2007 - 15:07 Uhr

Hi Leute,

wenn ich eine Liste von der anderen abziehen will (also alle gleichen Einträge rausschmeißen), mach ich das bisher so:


        //class MyList<T> : List<T>
        public static MyList<T> operator -(MyList<T> Liste1, MyList<T> Liste2)
        {
            MyList<T> tList = new MyList<T>(Liste1);

            T[] tArray = Liste2.ToArray();
            for (int i = 0; i < tArray.Length; i++)
            {
                tList.Remove(tArray[i]);
            }
            return tList;
        }

Geht das nicht irgendwie noch schneller? Dieser "Algorithmus" braucht für 30.000 Einträge in List1 (strings "Apfel1..Apfel30000") und 25.000 Einträge in List2 (strings "Apfel1;Birne2;Apfel3..Birne25000") ca. 8 Sekunden.

Oder hab ich eine Klasse in dem riesen .NET Pool übersehen, die das schon optimiert beherrscht?

Danke

Grüße,
Hendrik

10.05.2007 - 12:29 Uhr

Bitte immer angeben: eigenes System (auf ADO.NET)

Hi Leute,

ich hab einen eigens implementierten DataProvider (nach dem Tutorial von Microsoft: http://msdn2.microsoft.com/en-us/library/4ksaf9z5(VS.71).aspx). Diesen möchte ich nun im Connection Wizard sehen können. Also wo man hinkommt, wenn man eine neue Datenquelle hinzufügt und "Datenbank" als Quelle wählt. Dort, wo man den ConnectionString zusammenbaut. Versteht's? Da möchte ich meinen eigenen Provider ebenfalls auswählen können. Wer kann mir sagen, wie ich den da hineinbekomme?

Danke

Grüße,
Hendrik

10.05.2007 - 00:01 Uhr

Versuch mal, die Funktion statt im BackgroundWorker mit BeginInvoke einzuhängen und sag uns mal, ob das auch über 2 Minuten braucht.

07.05.2007 - 13:39 Uhr

Hi,

jemand 'n Plan, wo's sowas gibt? Oder hat sich noch niemand die Mühe gemacht? In dem Paket sind einige Tuts drin, allerdings nur in Form von Sourcecode. Keine Erklärungen, nichts...

Ich würde zum Beispiel gerne an die Verwendung der vielen Funktionen herangeführt werden. Wegfindung, KI, Physik (falls vorhanden), grafische Darstellung, Effekte etc... Gibt's das in Form von Tutorials für diese Engine?

Oder gibt es Alternativen, die einen ähnlichen Funktionsumfang "ab Werk" bieten?

Danke

07.05.2007 - 07:32 Uhr

Danke! 🙂 Ich weiß, mal wieder klarer Fall von "7.e.Q vs. Forensuche... And the Winner is: Forensuche"

Aber was ich noch merkwürdig fand, war der Umstand, daß der Debugger komplett stand. Das VS ließ sich nicht mehr bedienen. Nur der vshost.exe Task ließ sich abschießen, wonach die besagte LoaderLock Meldung kam... Aber das is ja nu weg. 🙂

06.05.2007 - 22:34 Uhr

... okay, "LoaderLock" Exception Handling ausschalten hilft. Aber ist sicher nicht das Gelbe vom Ei...

06.05.2007 - 22:31 Uhr

Hi Leute,

kennt sich hier jemand mit der PurpleSharp Engine aus? Ich hab da 'n Problem mit, weiß nicht, woran's liegt: wenn ich die Tutorials, die dabei sind im Studio im Debugger ausführen will (F5), dann bleibt das Studio immer in der TypeRegistry.cs in der Methode Purple.Tools.TypeRegistry.Add() stehen. Komplett! Ich muss den Programm.vshost.exe Prozess per Taskmanager abschießen und erhalte dann im Studio eine "LoaderLock detected" Exception, die da folgendermaßen ausschaut:


LoaderLock was detected
Message: Die DLL "C:\WINDOWS\assembly\GAC\Microsoft.DirectX.Direct3DX\1.0.2911.0__31bf3856ad364e35\Microsoft.DirectX.Direct3DX.dll" unternimmt einen Versuch, innerhalb der Sperre für den OS-Loader eine verwaltete Ausführung durchzuführen. Versuchen Sie nicht, verwalteten Code innerhalb einer DllMain- oder Bildinitialisierungsfunktion auszuführen, da dies ein Hängen der Anwendung zur Folge haben kann.

Weiß jemand, was das sein könnte? Starte ich das Programm außerhalb des Debuggers (STRG+F5), funktioniert's einwandfrei.

Danke!

Grüße,
Hendrik

04.05.2007 - 23:23 Uhr

Für XML spricht außerdem die beliebige hierarchische Tiefe der Daten. Versuch mal in einer INI Datei mehr als 2 Ebenen zu bauen!

04.05.2007 - 07:38 Uhr

Ich mach's meist so, daß ich die Datei komplett zeilenweise in eine List<string> einlese. Das hat den Vorteil, daß man dann beliebig an jeder Stelle Zeilen einfügen, verschieben, löschen, kopieren und bearbeiten kann. Danach mit foreach wieder wegschreiben und fertig... 🙂