Laden...
Avatar #avatar-3134.png
TiltonJH myCSharp.de - Member
Stud. Dipl. Inf. Leipzig Dabei seit 16.09.2006 87 Beiträge
Benutzerbeschreibung

Forenbeiträge von TiltonJH Ingesamt 87 Beiträge

14.11.2008 - 12:20 Uhr

Hallo,

Dann hol dir nicht die Light Version. Das sind auch keine 104MB. Du brauchst auch nicht alles, was da drin ist, denke ich.

Jedenfalls hast du definitiv die falsche Version oder du hast eine ältere vollständige Clientinstalltion nicht sauber deinstalliert und deswegen die falschen DLLs. Da ist nichts 104MB groß.

  1. große dateien die es gar nich gibt

[...] Da ist nichts 104MB groß.

Oracle "Instant Client Downloads for Microsoft Windows (32-bit)"


>

folgendes sieht man dort:


Version 11.1.0.6.0
	Instant Client Package - Basic:		instantclient-basic-win32-11.1.0.6.0.zip (43,316,697 bytes)
	Instant Client Package - Basic Lite:	instantclient-basiclite-win32-11.1.0.6.0.zip (17,012,357 bytes)
[...]

Version 10.2.0.4
	Instant Client Package - Basic:		instantclient-basic-win32-10.2.0.4.zip (34,742,358 bytes)
	Instant Client Package - Basic Lite:	instantclient-basiclite-win32-10.2.0.4.zip (10,566,014 bytes)


Version 10.2.0.3
	Instant Client Package - Basic:		instantclient-basic-win32-10.2.0.3-20061115.zip (34,469,920 bytes)
	Instant Client Package - Basic Lite:	instantclient-basiclite-win32-10.2.0.3-20061115.zip (10,360,970 bytes)
[...]

Version 10.1.0.5
	Instant Client Package - Basic:		instantclient-basic-win32-10.1.0.5-20060419.zip (31,926,105 bytes)
[...]

und fällt dir was auf? die größe der zip-archive zB?

hier mal eine dir /S auflistung von instantclient-basic-win32-11.1.0.6.0.zip


 Verzeichnis von [...]\Oracle-Client\instantclient-basic-win32-11.1.0.6.0

14.11.2008  11:36    <DIR>          .
14.11.2008  11:36    <DIR>          ..
03.10.2007  18:49    <DIR>          instantclient_11_1
               1 Datei(en)              0 Bytes

 Verzeichnis von [...]\Oracle-Client\instantclient-basic-win32-11.1.0.6.0\instantclient_11_1

03.10.2007  18:49    <DIR>          .
03.10.2007  18:49    <DIR>          ..
03.10.2007  18:48            13.824 adrci.exe
03.10.2007  18:48             3.363 adrci.sym
03.10.2007  18:49               315 BASIC_README
03.10.2007  18:48            29.696 genezi.exe
03.10.2007  18:48            13.027 genezi.sym
17.05.2005  12:48         1.060.864 mfc71.dll
09.05.2005  05:29           348.160 msvcr71.dll
03.10.2007  18:38           516.096 oci.dll
03.10.2007  18:38           246.731 oci.sym
10.09.2007  12:57            77.824 ocijdbc11.dll
10.09.2007  12:57            13.143 ocijdbc11.sym
03.10.2007  16:03            18.944 ociw32.dll
03.10.2007  16:03             4.516 ociw32.sym
25.07.2007  10:47         1.879.924 ojdbc5.jar
25.07.2007  10:48         1.977.444 ojdbc6.jar
03.10.2007  05:04         1.388.544 orannzsbb11.dll
03.10.2007  05:04           295.819 orannzsbb11.sym
03.10.2007  18:33           868.352 oraocci11.dll
03.10.2007  18:49           258.636 oraocci11.sym
03.10.2007  18:43       109.096.960 oraociei11.dll
03.10.2007  18:43         2.860.504 oraociei11.sym
03.10.2007  18:49    <DIR>          vc71
03.10.2007  18:49    <DIR>          vc8
              21 Datei(en)    120.972.686 Bytes

 Verzeichnis von [...]\Oracle-Client\instantclient-basic-win32-11.1.0.6.0\instantclient_11_1\vc71

03.10.2007  18:49    <DIR>          .
03.10.2007  18:49    <DIR>          ..
03.10.2007  18:33           868.352 oraocci11.dll
03.10.2007  18:49           258.636 oraocci11.sym
               2 Datei(en)      1.126.988 Bytes

 Verzeichnis von [...]\Oracle-Client\instantclient-basic-win32-11.1.0.6.0\instantclient_11_1\vc8

03.10.2007  18:49    <DIR>          .
03.10.2007  18:49    <DIR>          ..
03.10.2007  18:07           569.344 oraocci11.dll
03.10.2007  18:07               380 oraocci11.dll.manifest
03.10.2007  18:49           446.291 oraocci11.sym
               3 Datei(en)      1.016.015 Bytes

     Anzahl der angezeigten Dateien:
              27 Datei(en)    123.115.689 Bytes
              11 Verzeichnis(se)

is dir die oraociei11.dll (109.096.960 Bytes) aufgefallen?

  1. was das prog alles brauch

[...] Du brauchst auch nicht alles, was da drin ist, denke ich.

richtig! ich brauche nich alles aus dem zip archive, aber ich brauche jede der DLLs. auch die oraociei11.dll (109.096.960 Bytes). ansonsten bekomme ich eine fehlermeldung.

  1. verschmutzes windows

[...] Jedenfalls hast du definitiv die falsche Version oder du hast eine ältere vollständige Clientinstalltion nicht sauber deinstalliert und deswegen die falschen DLLs. [...]

das kann ich ganz und gar ausschliesen. die clients werden in einer blitzblanken WinXP Pro 32 Bit getested. da is nur das Framwork (v2.0.50727) und alle anderen XP updates drauf. ferner is das eine VM in einer "VirtualBox 2.0.4 for Windows hosts x86" die nach jedem test zurück gesetzt wird.

welche andere versionen außer die bei oracle zum download stehen gibt es denn noch? die instantclient-basic-win32-10.2.0.4.zip (34,742,358 bytes) zb? ja, große klasse da is dann die eine DLL nur noch ca. 84MB groß. das bringt uns dann schon sehr viel näher an die 1,5MB der JDBC jar oder an die größe meines C# progs von 354.816 Bytes 😜 (ACHTUNG!!! SARKASMUS)

MfG

Tilton

13.11.2008 - 20:31 Uhr

@GMLOD: danke für den tipp, aber
a) is das auch nich sehr viel kleiner, alle DLLs im basic lite ca. 30,9MB
b) bekomme ich dann folgende fehlermeldung


---------------------------
Fehler: OracleException
---------------------------
ORA-12737: Instant Client Light: unsupported server character set WE8ISO8859P15

Methode: Void Check(System.Data.OracleClient.OciErrorHandle, Int32)

StackTrace:
   bei System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)

   bei System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)

   bei System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)

   bei System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)

   bei System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

   bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

   bei System.Data.OracleClient.OracleConnection.Open()

--------------------------
OK   
---------------------------

die codierung kann ich aber nicht einfach ändern, da noch andere recht alte anwendungen diese DB so benutzen wie sie is und diese unterkeinen umständen zu stöhren sind.
bin mir nich mal sicher ob das in einer schon seit 2005 produktiven DB überhaupt geht und ohne risko von datenverlust oder inkompalitäten zu eben diesen alten progs.
(never change a runnig system!! 😉 )

Fazit:
basic lite is keine alternative für meine zwecke

EDIT: das ganze is ganze is halt nur bedrückened wenn man sich die JDBC jar mal anschaut, die is ca 1,5 MB groß und kann (soweit ich weis) alles.

gehört zwar nich wirklich hier her, aber kann man java sachen überhaupt und in dem falle die JDBC jar irgendwie mit C# unter einen hut bringen??

MfG

Tilton

PS: die DB is eine 9.2i auf einem Windows Server 2003 SE SP2

13.11.2008 - 19:38 Uhr

Hallo noch mal,

ich hab das jetzt mit dem andern con-string mal versucht, funzt prima!


"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<IP oder name>)(PORT=1521))(CONNECT_DATA=(SID=<SID>)));Uid=<username>;Pwd=<passwort>"

nur diese risigen DLLs sind noch immer unangenehm.

MfG

Tilton

13.11.2008 - 19:26 Uhr

hallo,
also ich arbeite recht viel mit C# und oracle. funzt auch alles prima soweit.

die tatsache das man aber den Oracle-Client installieren muss, damit die verbindung zur DB aufgebaut werden kann ist mehr als nur lästig.

wenn man den Oracle-Client nicht installiert bekommt man sowas


---------------------------
Fehler: Exception
---------------------------
System.Data.OracleClient erfordert Version 8.1.7 oder höher der Oracle-Clientsoftware.

Methode: Int32 DetermineClientVersion()

StackTrace:
   bei System.Data.OracleClient.OCI.DetermineClientVersion()

   bei System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)

   bei System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)

   bei System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)

   bei System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

   bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

   bei System.Data.OracleClient.OracleConnection.Open()

---------------------------
OK   
---------------------------

eine möglichkeit den client nicht zu installieren und einfach ein paar DLLs mit in das prog-verz zulegen würde ich auch sehr schön finden.

Ich habe mir jetzt den Instant Client gezogen. Hier habe ich die vier DLLs in mein Startup-Path copiert (oraociei11.dll, oci.dll, orannzsbb11.dll, oracci11.dll)

das wollte ich mal probieren aber mir fehlt die orannzsbb11.dll in dem von mir vor 2h oder so herruntergeladenem Instant Client (instantclient-basic-win32-11.1.0.6.0.zip). so kommt noch immer der selbe fehler wie oben.

wenn ich dann die mfc71.dll, msvcr71.dll und die ociw32.dll mit rein packe erhallte ich wie es scheint schon mal eine funktionstüchtigen OracleClient der mir folgende meldung um die ohren haut:


---------------------------
Fehler: OracleException
---------------------------
ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA


Methode: Void Check(System.Data.OracleClient.OciErrorHandle, Int32)

StackTrace:
   bei System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)

   bei System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)

   bei System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)

   bei System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)

   bei System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)

   bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

   bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

   bei System.Data.OracleClient.OracleConnection.Open()

---------------------------
OK   
---------------------------

also gehe ich mal davon aus das was mit meinem Con-String nich mehr stimmt.

das is auch auch soweit nachvollziehbar denn im falle eine client-installation muss dieser noch konfiguriert werden. es gibt einen s.g. "Oracle Net Manager" in dem dann lokal ein "Dienst" angelegt wird. In diesem wird dann zb die "SID" (bzw "Service-Name"), das protkoll (zB: TCP/IP), die eigentliche IP (bzw. ein name der per DNS aufzulösen ist) und eine port-nr (standart mässig die 1521) eingetragen wird. das ganze muss zum "lisener" des eigentlichen servers passen (dieser wird ähnlich dem dienst, auf den rechner wo sich die DB befindet, eingerichtet).

nun is die frage wie muss mein connection string ausschaun damit ich ohne die gerade oben beschriebene einrichterei auf meine DB rauf komme.

derzeitiger aufbau:


"Server=<SID>;Uid=<username>;Pwd=<passwort>"

[...]

  
[...]  
    string CONNECTION_STRING = "User Id=bla;Password=bla;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.4.13)(PORT=1521))(CONNECT_DATA=(SID=stillmms)));";  
[...]  
  

[...]

das werde ich mal ausprobieren und mich wieder melden.

Fragen:

  • Kenn jmd einen weg kennt die ollen DLLs wegzulassen?
  • die oraociei11.dll is ca 104MB groß? warum is die so riesig? das bläht das C#-prog auf wie nix anders

für sonstige anmerkungen die licht ins dunkel bringen würde ich mich freuen.

MfG

Tilton

08.10.2008 - 17:47 Uhr

moin, kannst ja dann auch sowas machen zB


	List<string[]> test = new List<string[]>();
	test.Add(new string[] { "A", "1" });
	test.Add(new string[] { "B", "2" });
	test.Add(new string[] { "C", "3" });
	test.Add(new string[] { "D", "4" });

mfg

tilton

btw:
ich hoffe das nur ein bsp ist mit dem ein einzelnes zeichen in einen string packen, wo es doch so schöne char[] gibt, bzw
string test = "A1"
und dann
test[0] == "A"
test[1] == "1"

(string is ja auch nur ein dynamisch wachsendendes char[]) 😉

30.09.2008 - 18:26 Uhr

tach auch, ich hab mir das grad mal alles durch gelesen, hab aber irgend wie nich alles verstanden.

lass mich aml versuchen zu beschreiben was du machen willst.

  1. du hast einen string zb "0123456789abcdef"

  2. du möchtest diesen verschicken
    (es werden doch sicherlich byte (bzw byte[]) verschickt, oder?)

  3. du bekommst einen antwort
    (das sind doch noch bestimmt auch wieder byte (bzw byte[]) oder?)

dh also du möchtest den eine HexString in ein byte[] wandeln (wobei dann zb der string "ff" in den binärwert 0xff gewandelt wird) und das ganze auch wieder zurück oder wie seh ich das falsch?

denn daführ hätte ich eine lösung da

MfG

Tilton

PS: ich glaube du solltest dein ausgangspkt und dein ziel mal genauer/detailierter beschreiben, ich vermute nähmlich das die/das idee/konzept des umsetzens in code falsch is, und somit auch jeglicher code

28.08.2008 - 16:47 Uhr

so was in der art hab ich schon vermuttet.

vielen dank für die hilfe!

MfG

Tilton

PS: der Beitrag kann dann als gelöst gekennzeichnet werden.

28.08.2008 - 16:29 Uhr

ich gehe davon aus, dass Child IComparable<Child> implementieren muss. Das geerbte IComparable<Parent> wird nicht reichen.

Genau da scheint der fehler gelegen zu haben, jetzt geht alles wie es soll.

gibs ne begründung warum das IComparable<Child> auch mit rein muss?
warum vererbt er diese eigenschaft nicht einfach mit?

MfG

TiltonJH

edit: @herbivore, ja hab ich übersehn, haben das wohl gleichzeitig geschrieben

28.08.2008 - 16:23 Uhr

das ist die genaue exception die ich bekomme:


Exception: InvalidOperationException

Message:
Fehler beim Vergleichen von zwei Elementen im Array.

TargetSite:
Void SwapIfGreaterWithItems[TValue](T[], TValue[], System.Collections.Generic.IComparer`1[T], Int32, Int32)

StackTrace:
bei System.Collections.Generic.ArraySortHelper1.SwapIfGreaterWithItems[TValue](T[] keys, TValue[] values, IComparer1 comparer, Int32 a, Int32 b)

bei System.Collections.Generic.ArraySortHelper1.QuickSort[TValue](T[] keys, TValue[] values, Int32 left, Int32 right, IComparer1 comparer)

bei System.Collections.Generic.ArraySortHelper1.Sort[TValue](T[] keys, TValue[] values, Int32 index, Int32 length, IComparer1 comparer)

bei System.Collections.Generic.ArraySortHelper1.Sort(T[] items, Int32 index, Int32 length, IComparer1 comparer)

bei System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)

bei System.Collections.Generic.List1.Sort(Int32 index, Int32 count, IComparer1 comparer)

bei System.Collections.Generic.List`1.Sort()

bei Child.Sort()
//.....

sollte ich vlt noch die class Child noch etwas erweitert darstellen...


internal class Child : Parent
{
    //... der rest der Klasse, nat. auch add-methoden um "subChilds" zu füllen
    private List<Child> subChilds = new List<Child>();

    public void Sort()
    {
        subChilds.Sort();
        foreach(Child c in subChilds)
            c.Sort();
    }
    //...

}

eine dopplung der classen kann ich ausschliesen

MfG

TiltonJH

28.08.2008 - 15:59 Uhr

hallo,

ich hab glaub ich ein kleiners verständnis problem, und so noch nix dazu gefunden.

worum geht es:
ich habe eine List<T> wobei T eine eigene Klasse von mir ist (ich nenn die mal "Child"). Nun will ich das mir .Sort() mir diese liste sortiert wird wie das zb bei List<string> kein prob ist.
nun bekomme ich aber eine InvalidOperatoinException.
dann fällt mir auf, dass das nur richtig sein kann, woran sollte den "Child" auch unterschieden werden. -> also hab ich die base-class von "Child" (ich nenn sie mal "Parent") um das IComparable interface erweitert und also auch die "CompareTo" methode implementiert.

tata immer noch der selbe fehler.

noch mal ein bissen code um zeigen was ich habe
hier mal die classen (stark vereinfacht)


internal abstract class Parent : IComparable<Parent>
{
	public Parent(string name)
	{
		this.Name = name;
	}
	public int CompareTo(Parent other)
	{
		return this.Name.CompareTo(other.Name); 
	}
	public string Name
	{
		get;
		private set;
	}
}
internal class Child : Parent
{
	public Child(string name)
		: base(name)
	{ }
}

und hier mal einen auszug aus der methode wo sortieren werden soll


//...

List<Child> list = new List<Child>();

// Childs werden hinzugefügt...

list.Sort();

//...

nun die große frage was mache ich falsch bzw was muss ich anders machen?
ich bin mir nich sicher was und aus der MSDN werd ich auch nich richtig schlau.

MfG

Tilton

26.08.2008 - 17:39 Uhr

tach auch,

schau mal in die MSDN bei (PropertyGrid.SelectedObject

wenn du dem die CommonSettings zuweist?

(ka ob das was bringt)

MfG

Tilton

25.08.2008 - 13:59 Uhr

hallo,

anscheined ist es doch sehr wichtig wie man etwas verglichen haben möchte, deshalb hab ich die hier erwähnten möglichkeiten mal zusammengefasst. da kann sich man sich dann das raussuchen was man braucht.


public enum EqualOptions { Default, CompareSorted, CompareSorted_IgnorDoubledValues_IgnoreNull };

public static bool Equals(string[] right, string[] left)
{
	return Equals(right, left, EqualOptions.Default);
}

public static bool Equals(string[] right, string[] left, EqualOptions options)
{
	if (right == null && left == null)
		return true;
	if ((right == null && left != null) || (right != null && left == null))
		return false;
	if (right.Length != left.Length)
		return false;
	if (right.Length == 0)
		return true;
	if (right.Length == 1)
		return right[0] == left[0];

	switch (options)
	{
		case EqualOptions.CompareSorted:
			return EqualsList(right, left);
		case EqualOptions.CompareSorted_IgnorDoubledValues_IgnoreNull:
			return EqualsHash(right, left);
		default:
			return EqualsArray(right, left);
	}
}

private static bool EqualsArray(string[] right, string[] left)
{
	for (int i = 0, n = right.Length; i < n; i++)
		if (right[i] != left[i])
			return false;

	return true;
}

/*
 * ignors:
 * - the given order by sorting the elements
 */
private static bool EqualsList(string[] right, string[] left)
{
	List<string> listRight = new List<string>(right.Length);
	listRight.AddRange(right);
	listRight.Sort();
	List<string> listLeft = new List<string>(left.Length);
	listLeft.AddRange(left);
	listLeft.Sort();

	for (int i = 0, n = listRight.Count; i < n; i++)
		if (listRight[i] != listLeft[i])
			return false;

	return true;
}

/* 
 * ignors:
 * - the given order
 * - the case of having more then 1 equal string
 * - the value null
 */
private static bool EqualsHash(string[] right, string[] left)
{
	Dictionary<string, bool> dictionary = new Dictionary<string, bool>(right.Length);
	foreach (string s in right)
		if (s != null)
			dictionary[s] = true;

	foreach (string s in left)
		if (s != null && !dictionary.ContainsKey(s))
			return false;

	return true;
}

25.08.2008 - 11:24 Uhr

um das mit .Net 2.0 für Win2k kompatibel zu halten hab ich das jetzt mit dem Dictionary gelöst.

das ist dann wie du das meintest herbivore?


public static bool Equals(string[] right, string[] left)
{
	if (right == null && left == null)
		return true;
	if ((right == null && left != null) || (right != null && left == null))
		return false;
	if (right.Length != left.Length)
		return false;
	if (right.Length == 0)
		return true;
	if (right.Length == 1)
		return right[0] == left[0];

	Dictionary<string, bool> dictionary = new Dictionary<string, bool>(right.Length);
	foreach (string s in right)
	{
		try
		{
			dictionary.Add(s, true);
		}
		catch (ArgumentException) { }
	}

	foreach (string s in left)
	{
		if (!dictionary.ContainsKey(s))
			return false;
	}

	return true;
}

da ich mit Hashtables o.ä. noch nix weiter gemacht hab frag ich mich was mit werten passiert die doppelt vorkommen, also zB 2 oder mehrmals der selbe string in den string[]s vorkommt. ich geh mal davon aus das ein key "uniqe" innerhalb ein und der selben Hashtable sein muss?

dh. also das bei


foreach (string s in right)
{
	dictionary.Add(s, true);
}

eine exception geworfen wird?

edit:
jap, es wird eine ArgumentException geworfen. --> (code oben angepasst)

das bringt ein weiters prob mit sich.
nehmen wir mal folgendes an:


string[] a = { "test0", "test0", "test1", "test2" };
string[] b = { "test0", "test1", "test2", "test2" };

diese beiden string[]s würden bei der Hash variante == true sein,
bei der mit den listen aber nicht.

MfG

TiltonJH

20.08.2008 - 19:59 Uhr

hallöle,

na da will ich doch meinen senf auch noch mal abgeben. 😉

das mit split lass ich mal fix wech, weil is ja egl klar.


public static bool Equals(string[] right, string[] left)
{
	if (right == null && left == null)
		return true;
	if ((right == null && left != null) || (right != null && left == null))
		return false;
	if (right.Length != left.Length)
		return false;
	if (right.Length == 0)
		return true;
	if (right.Length == 1)
		return right[0] == left[0];

	List<string> listRight = new List<string>(right.Length);
	listRight.AddRange(right);
	listRight.Sort();
	List<string> listLeft = new List<string>(left.Length);
	listLeft.AddRange(left);
	listLeft.Sort();

	for (int i = 0, n = listRight.Count; i < n; i++)
	{
		if (listRight[i].Length != listLeft[i].Length)
			return false;
		else if (listRight[i] != listLeft[i])
			return false;
	}
	return true;
}

wobei ich mir beim überprüfen der länge der einzel-strings nicht sicher bin, das sollte die die "string-vergleich-methode" (String.Equals) auch machen bevor sie sich die einzellnen char blöcke vornimmt oder?

Wenn man statt des Sortierens die Werte zum Vergleichen in ein Hashset (oder als Key in ein Dictionary schreibt) sinkt der Aufwand gar auf O(n).

das hab ich nich verstanden, was meinst du damit? (Ich lern an Bsp-Code am besten. 😉 )

Man beachte auch die in Performancefragen immer sehr wichtige DoNothingLoop, wie jedermann weiss kommt es sonst desöfteren zu IRQ_NOT_LESS_OR_EQUAL-Bluescreens bei Roland Midi Karten

Was hat das bitte mit .Net zu tun?? oder mit dem vergleichen 2er string[]??

MfG

Tilton

15.07.2008 - 11:56 Uhr

hallo, alle miteinander

danke für all die antworten.

herbivore hat meine frage an sich schon beantwortet.

was aber nicht geht, weshalb du selber daran denken musst. Das ist gemeint.

ich wollte egl nur das Interface auch als gedankenstütze nutzen, geht aber nich, gut muss ich eben selber denken 🤔

an all die andern, das man abstakte klassen nutzen sollte is mir
a) klar und verständlich
b) kann ich da statische methoden auch nich vererben oder meine kindklassen per static abstrakt methoden zwingen diese methoden zu implementiern (weil es das eben nich gibt (static abstrakt)) und darum ging es mir ja im wesentlichen

für eine weiterentwickliung in C# mal mit zu beachten wäre vlt:

  1. static definierte methoden in einen interface zwingen die davon abgeleiteten klassen eine solche static methode zu implementieren

  2. static abstrakt definierte methoden in einer abstrakten klasse zwingen die davon abgeleiteten klassen eine solche static methode zu implementieren

(beides sind im wesentlichen nur compiler erweiterungen, die keinen wirklichen einfluss auf den aktiven code hätten)

wem das noch nich reicht dem zeige ich gerne noch den code wo und warum ich das gerne hätte 😁

14.07.2008 - 15:14 Uhr

Lösung: Definiere die Methoden einfach per Konvention in allen Klassen.

Was meinst du damit genau??

Ich will egl nur dafür sorgen das in allen klassen die mein interface implementieren auch einen statische methode mit drin ist.

dh. der compiler gibt mir ja eine fehlermeldung wenn ich eine methode vergesse zu implementieren
das mag ich eben auch für die statische methode nutzen

MfG

Tilton

01.07.2008 - 17:01 Uhr

ich war so frei das etwas anzupassen, und wollte euch das nich vorenthalten


internal string getProperCase(string original)
{
	return getProperCase(original, new char[] { ' ', '.', ',', '-', '_' });
}
internal string getProperCase(string original, char[] separator)
{
	int originalLength;
	try	{ originalLength = original.Length; }
	catch (NullReferenceException) { throw new ArgumentNullException("original"); }
	if (originalLength == 0) return original;
	if (originalLength == 1) return original.ToUpper();

	StringBuilder stringBuilder = new StringBuilder(originalLength);
	stringBuilder.Append(Char.ToUpper(original[0]));
	stringBuilder.Append(original.Substring(1).ToLower());

	originalLength--;
	int indexAfterLastSeparator = 1;
	int indexOfSeparator = original.IndexOfAny(separator, indexAfterLastSeparator);
	while ((indexOfSeparator < originalLength) && (indexOfSeparator >= indexAfterLastSeparator))
	{
		indexAfterLastSeparator = indexOfSeparator + 1;
		if (Char.IsLetter(stringBuilder[indexAfterLastSeparator]))
			stringBuilder[indexAfterLastSeparator] = Char.ToUpper(stringBuilder[indexAfterLastSeparator]);

		indexOfSeparator = original.IndexOfAny(separator, indexAfterLastSeparator);
	}
	return stringBuilder.ToString();
}

jetzt bricht er auch nicht mehr bei 2 auf einanderfolgenden separatoren ab

MfG

Tilton

01.07.2008 - 16:26 Uhr

für alle die im allgemeinen ICOs bauen/zeichen oder aus dlls bzw exe extrahieren wollen, der freeware ico-editior IcoFX 🙂

MfG

Tilton

01.07.2008 - 15:33 Uhr

Hallo zusammen,

so richtig verstehe ich das problem nich.

mal so'n bischen code von mir:


internal enum EnumType {eins, zwei, drei, usw}

internal partial class Form1 : Form
{
	internal Form1()
	{
		InitializeComponent();
		//...
		comboBoxType.Items.AddRange(Enum.GetNames(typeof(EnumType)));
		comboBoxType.SelectedIndex = 0;
		//...
	}
	//...
	internal EnumType EnumType
	{
		get { return (EnumType)Enum.Parse(typeof(EnumType), comboBoxType.SelectedItem.ToString()); }
	}
	//...
}

das funzt doch egl recht gut?? wenn man das parsen noch in einen entsprechenden try-catch-block packt, kann man das auch ohne probs in diesen SelectedIndexChanged einfügen

MfG

Tilton

30.01.2008 - 16:58 Uhr
  1. ich würde mal überprüfen ob die datei wirklich UTF8 ist, wenn die sich mit nem hex editor anschaut müsste dann da wo sich ein ü befindet ein
C3 BC

zu lesen sein, auserdem sollten UTF8-dateien immer in den ersten 3 byte

EF BB BF

enthalten
und wenns kein UTF8 is is die XML beschreibung quark
--> beschwerde an den der das verbrochen hat 😉

  1. schon mal die "default"-codierung versucht? das dürfte auf den den deutschen ms-win rechnern der Windows-1252 codierung entsprechen
18.01.2007 - 17:53 Uhr

Hallo,

Ich denke so wie das svenson geposted hat is das schon besser als meines (das da noch ne Exeption rein muss hab ich mir auch schon überlegt).
Habs dann auch so gemacht, is wohl besser so. Nur schade um die zeit die ich da in Grübeln gesteckt habe. 🙁

Auf jeden fall vielen Dank für die schnellen Antworten.

MfG

TiltonJH

PS: @herbivore: Ich denke der Thread kann geschlossen werden.

EDIT: Als Ergebnis des Ganzen gibt es ein C#-Snippet Klasse für das Erstellen eines HexStrings aus Byte[] und auch wieder zurück..

18.01.2007 - 15:55 Uhr

Hallöchen, ich habe eine Methode geschrieben die mir einen String aus hexadecimal Zeichen in ein byte[] um wandelt.


        public static byte[] hexStringToByteArray(string hexString)
        {
            ASCIIEncoding ascii = new ASCIIEncoding();
            byte[] byteArray = ascii.GetBytes(hexString.ToLower());
            for (long i = 0; i < byteArray.LongLength; i++ )
            {
                if ((byteArray[i] >= 0x30) && (byteArray[i] <= 0x39))
                {
                    byteArray[i] -= 0x30;
                }
                else
                {
                    if ((byteArray[i] >= 0x61) && (byteArray[i] <= 0x66))
                    {
                        byteArray[i] -= 0x57;
                    }
                    else return null;
                }
            }
            byte[] hexByteArray = new byte[byteArray.LongLength / 2];
            long j = 0;
            for (long i = 0; i < byteArray.LongLength; i += 2)
            {
                hexByteArray[j] = (byte)((byteArray[i] * 0x10) + byteArray[i + 1]);
                j++;
            } 
            return hexByteArray;
        }

Der String schaut zB so aus "188d19faba961238a36b982498eb1a9a".
Es funz auch alles so wie ich mir das gedacht habe aber mir sind Zweifel gekommen ob das so die eleganteste Lösung ist oder ob es da evtl. eine bessere Lösung gibt?

MfG

TiltonJH

07.11.2006 - 09:41 Uhr

Original von Borg
...
Ein Programm mit einer solchen willkürlichen und sinnfreien Einschränkung würde bei mir sehr schnell im NUL-Device landen...

X(

ne mal im ernst, der anfangs post war ja nicht von mir, sondern von "pringels" und deine methode ist in dem problem von ihm sicher die bessere methode, mir ging es aber eben darum auch kopien zu finden...
und ob dann das progi melden kann das es sich um eine kopie der datei handelt oder nich... wenn ich so drüber nach denke könnte man beide sachen sogar kombinieren (also jetzt für mein prog), na ja mal sehn...

MfG

Tilton

06.11.2006 - 09:16 Uhr

das mag ja sein, aber mit meiner methode kann ich auch kopien der selber datei ausfindig machen...

MfG

Tilton

03.11.2006 - 16:09 Uhr

hmmm... ja das seh ich ein...


using System;
using System.Security.Cryptography;
using System.IO;

namespace System.IO
{
    static class FileCompare
    {
        public static bool binaryCompare(string filePath1, string filePath2)
        {
            if (File.Exists(filePath1) && File.Exists(filePath2))
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] binaryMD5_1 = md5.ComputeHash(File.OpenRead(filePath1));
                byte[] binaryMD5_2 = md5.ComputeHash(File.OpenRead(filePath2));
                for (int i = 0; i < binaryMD5_1.Length; i++) 
                    if (binaryMD5_1[i] != binaryMD5_2[i]) return false;
                return true;
            }
            else return false;
        }
    }
}

so das dürfte dann die endgültige Version sein... und man kann den Thread als gelöst bezeichnen

MfG
Tilton

03.11.2006 - 14:32 Uhr

habs begriffen... (glaube ich)... so besser?


using System;
using System.Security.Cryptography;
using System.IO;

namespace System.IO
{
    static class FileCompare
    {
        public static bool binaryCompare(string filePath1, string filePath2)
        {
            if (File.Exists(filePath1) && File.Exists(filePath2))
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] binaryMD5_1 = md5.ComputeHash(File.OpenRead(filePath1));
                byte[] binaryMD5_2 = md5.ComputeHash(File.OpenRead(filePath2));
                bool returnType = true;
                for (int i = 0; i < binaryMD5_2.Length; i++)
                {
                    if (binaryMD5_1[i] != binaryMD5_2[i])
                    {
                        returnType = false;
                        break;
                    }
                }
                return returnType;
            }
            else return false;
        }
    }
}

MfG

Tilton

03.11.2006 - 12:07 Uhr

?( wie meinst das jetzt? ich will doch nicht die byte[] vergleichen sondern die jeweiligen dateien

Tilton

03.11.2006 - 10:48 Uhr

Moin,

so das Problemchen hat mir keine Ruhe gelassen und da ich sowas auch gut für das Prog was gerade schreibe gebrauchen kann, hab ich da mal eine Klasse geschrieben, welche das jetzt hinbekommt. Das Dateien-Vergleichen läuft über das vergleichen der MD5-Hash codes, sollte also sehr Zuverlässig sein.

Hier nun der Code:


using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;

namespace System.IO
{
    static class FileCompare
    {
        public static bool binaryCompare(string filePath1, string filePath2)
        {
            if (File.Exists(filePath1) && File.Exists(filePath2))
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

                byte[] binaryMD5_1 = md5.ComputeHash(File.OpenRead(filePath1));
                byte[] binaryMD5_2 = md5.ComputeHash(File.OpenRead(filePath2));

                StringBuilder strBuilder1 = new StringBuilder(32);
                StringBuilder strBuilder2 = new StringBuilder(32);

                foreach (byte binary in binaryMD5_1)
                {
                    strBuilder1.Append(binary.ToString("x2"));
                }
                foreach (byte binary in binaryMD5_2)
                {
                    strBuilder2.Append(binary.ToString("x2"));
                }

                if (strBuilder1.ToString() == strBuilder2.ToString()) return true;
                else return false;
            }
            else return false;
        }
    }
}

Das erstellen der MD5-Hash-Codes ist zeitlich natürlich von der größe der jeweiligen Dateien abhängig.
Weis jemand ob eine "foreach"-Schleife oder eine eine normale "for"-Schleife (die auch über alle Einträge läuft) performanter ist? Oder sind die gleich?

Wenn jemand noch Verbesserungsvorschläge oder sonstige konstruktive Kritik hat würde mich das freuen.

MfG

Tilton

27.10.2006 - 09:19 Uhr

🤔
hmm, auch mist hat jemand einen andern vorschlag?
gibs da evtl. schon ne andere klasse mit der man einen hash code über eine datei erzeugen kann?
oder muss ich mir hier selber noch eine klasse schreiben die sowas richtig kann?

MfG

Tilton

27.10.2006 - 09:11 Uhr

Hi, ja is mir gestern dann auch noch durch den kopf gegangen das equals da nich gut is, dann wohl eher so was❔


    ...
    FileStream file1 = File.Open(dateiPfad1, FileMode.Open);
    FileStream file2 = File.Open(dateiPfad2, FileMode.Open);
    if (file1.GetHashCode() == file2.GetHashCode())
    {
        ...
    }
...

da der hash code ja so hoffe ich auf grundlage der datei erzeugt wird? pfad und auch attribute der datei im hash code mit zu nutzen wäre nich so super, weil ergebnis wird verfälscht oder?

MfG

Tilton

26.10.2006 - 16:09 Uhr

Hi

    FileStream file1 = File.Open(dateiPfad1, FileMode.Open);
    FileStream file2 = File.Open(dateiPfad2, FileMode.Open);
    if (file1.GetHashCode().Equals(file2.GetHashCode()))
    {
        ...
    }

schon mal so was in der art versucht? oder einfach gleich mit .Equals? ich hoffe mal das das wirklich auf denn FileStream anwendet und so die dateien binär vergleicht.

MfG

Tilton

26.10.2006 - 15:38 Uhr

Original von Flo80
...

  
private void Form1_Load(object sender, EventArgs e)  
{  
        //überflüssiger code  
                Form3 f3 = new Form3();  
                f3.MdiParent = this;  
        //überflüssiger code  
        Form2 f2 = new Form2();  
        f2.MdiParent = this;  
        f2.Show();          
}  

...

Wobei man dann das Weg lassen kann, da du ja das Form3 erst später benötigst und eh noch einmal neu instanzierst.

MfG
Tilton

26.09.2006 - 15:24 Uhr

@herbivore: danke für den tipp... jetzt geht es 😁

hier noch mal den reparierten code für alle die es interessiert:


using (StreamReader sr = new StreamReader(path.fullPath,Encoding.Default))
{
	string input;
	while ((input = sr.ReadLine()) != null)
	{
		list.Add(input);
	}
}

26.09.2006 - 01:17 Uhr

Ich muss das hier noch mal aufgreifen... ich versuche so etwas in der art umzusetzten:


using (StreamReader sr = File.OpenText(path.fullPath))
{
	string input;
	while ((input = sr.ReadLine()) != null)
	{
	list.Add(input);
	}
}

das funzt so weit auch ganz gut, aber hab hier das selbe prob mit den umlauten, die verschwinden einfach aus dem text
hab hier schon so ziemlich alles versucht dem ding "Encoding.Default" einzureden das interessiert ihn aber nich die bohne, mit einem FileStream komme ich der sache schon näher, aber das unterstürzt das zeilen weise lesen ja nich...


using (FileStream fs = File.Open(path.fullPath, FileMode.Open, FileAccess.Read, FileShare.None)) 
{
	Encoding encoding = Encoding.Default;
	byte[] buffer = new byte[1024];
	fs.Read(buffer, 0, 1024);
	string input = encoding.GetString(buffer);
	// input müsste hier noch in zeilen zerlegt werden...
	list.Add(input);
}

... und die größe des buffers statisch zu deffinieren zu müssen ist auch sehr lästig.

kann mir da evtl. jmd helfen?

24.09.2006 - 18:18 Uhr

mag sein das ich noch nicht so sehr lange min C# arbeite, aber was soll denn nun wieder das heisen?

ich meine, zu welcher Aufwandsklasse - z.B. O(1), O(n), ... - die jeweilige Operation gehört. Aber wenn du so fragst, dann ist vermutlich ArrayList schon das richtige für dich. 🙂

speziell was ist denn nun bitte eine Aufwandsklasse? cpu lasstig? speicherlasstig? oder wie?

24.09.2006 - 18:01 Uhr

danke für die schnelle hilfe, aber was meinst du mit:

Allerdings zu anderen Kosten als LinkedList.

was für kosten denn?

24.09.2006 - 17:39 Uhr

also ich kann im .NET 2003 keine "LinkedList" finden X(

ich suche trozdem nach einer collection-klasse welche eigenschaften der "LinkedList" (so wie sie das in Java tut) aufweist, soll heisen die List müsste übereinen Index bzw Iterator ansteuerbar sein und löschen und einfügen an beliebiger stelle unterstützen

kann mir da jemand helfen?