Laden...

Forenbeiträge von VizOne Ingesamt 1.373 Beiträge

12.06.2007 - 16:02 Uhr

Hallo,

Die Suche nach SQL Parser gibt mir bei google eine ganze Menge Links aus. Direkt der erste Treffer schein mir vielversprechend: http://www.sqlparser.com/

Grüße,
Andre

12.06.2007 - 15:34 Uhr

Hallo SunboX,

Stichwort: lineare Interpolation.

Grüße,
Andre

12.06.2007 - 09:19 Uhr

Hallo,

Willkommen im Forum. Bitte halte dich an [Hinweis] Wie poste ich richtig? (6. Codetags, 9. Posten der gefundenen Lösung). Vielen Dank 😉

Grüße,
Andre

12.06.2007 - 07:59 Uhr

Hallo 4breeze,

Ich halte dein Vorgehen für gar nicht schlecht. Du solltest der Bilder-Tabelle noch einen PK spendieren (falls Name nicht schon einer ist).

nun ja man sagt jedoch auch, das Tabellen die nur aus 2 Spalten, also ID und noch einer Spalte bestehen unsinnig sind.

Wer ist denn "man"?

Wenn beide Text sind, dann wäre es sicherlich halbwegs sinnvoll, sollten die beiden Felder jedoch nur char oder Varchar (falls MySql) sein, so wäre es auch eigentlich kein Problem die beiden Tabellen zusammen zu legen.

Wie willst du die Tabellen zusammenlegen? Die Namen aller Bilder in eine (1) Spalte quetschen halte ich für eine schlechte Idee. Die 1:n Beziehung zwischen Artikeln und Bildern wird durch die beiden Tabellen doch gut wiedergegeben. Nehmen wir an, dass ein Bild von mehreren Artikeln verwendet werden kann. Was passiert, wenn ich ein Bild lösche? Mit der Zwei-Tabellen-Version ist das ganz leicht. Mit Alle-Bilder-In-Eine-Spalte muss ich alle Artikel nachschauen und ggf. aktualisieren.

Grüße,
Andre

11.06.2007 - 14:28 Uhr

Ich mach hier zu, bevor es ausartet. Außerdem habe ich die sinnlosen Beiträge entfernt.

11.06.2007 - 14:14 Uhr

Ich mach hier zu, bevor es ausartet. Außerdem habe ich die sinnlosen Beiträge entfernt.

11.06.2007 - 13:59 Uhr

Hallo,

Ich hab zwar überhaupt keinen Plan von Office-Interop etc, aber ich würde mal folgendes sagen:


public:void Tabelle()
{
   wdTbl = wdDoc->Tables[1];
   int nRow = wdDoc->Tables[1]->Rows->Count;
   int nCol = wdDoc->Tables[1]->Columns->Count;
   for( int i = 1; i <= nRow; i++)//Jede zweite
   {
     for( int j = 1; j <= nCol; j++)
      {
         String^ strText = i.ToString()+j.ToString();
         wdDoc->Tables[1]->Cell(i,j)->default->default= strText ;
      }
    }
}

Das erste default ist die Range-Eigenschaft, das zweite die Text-Eigenschaft der Range. Da die beiden Eigenschaften als DefaultMember des jeweiligen Interfaces angegeben sind, muss man sie in C++/CLI über default ansprechen. [PeterLustig]Kling komisch, is aber so.[/PeterLustig]

Grüße,
Andre

11.06.2007 - 12:35 Uhr

Hallo,

Vielleicht findest du hier was bei: Strukturierter und besser Programmieren

Grüße,
Andre

11.06.2007 - 09:58 Uhr

Was hast du denn bereits probiert?

Klingt für mich nach einer Kombination aus "Benutzer aus WBB cookie bestimmen" und FormsAuthentication.RedirectFromLoginPage

Grüße,
Andre

11.06.2007 - 09:45 Uhr

Hallo Oleh,

Willkommen im Forum. Wenn du möchtest, dass man dir hilft, musst du schon etwas mehr Informationen angeben:

  • Was hast du bereits unternommen?
  • Wo hakt es?
  • Gibt es Fehlermeldungen?
    usw.

Beachte bitte auch [Hinweis] Wie poste ich richtig?

Für Anfänger empfiehlt sich das Openbook C#. Siehe Menu rechts!

Grüße,
Andre

11.06.2007 - 09:10 Uhr

Hi Golo,

Ich würde auch zu Unikums Vorschlag greifen (abgesehen von dem DATE oder alternativ (um die Anzahl der Tage pro Monat zu ignorieren)


WHERE YEAR(Datum) = 2006 AND MONTH(Datum) = 6

Noch eine Alternative ohne Tageszahlen:


WHERE (Datum >= CAST('2006/06/01' AS DATETIME)) AND (Datum < CAST('2006/07/01' AS DATETIME))

Ein LIKE müsste mit folgendem Syntax gehen:


WHERE CONVERT(nvarchar, Datum, 111) LIKE '2006/06/%'

(111 ist das Format yyyy/mm/dd)
Nur ist natürlich hier das Problem, dass das Datum in einen String umgewandelt werden muss, was für die Geschwindigkeit schlecht sein dürfte, es sei denn, SQL Server wäre so schlau und könnte aus der LIKE Version die YEAR/MONTH Version optimieren. Ich weiß allerdings nicht, ob dem so ist.

Ich würde also wenn möglich die Version von Unikum oder die Version mit YEAR/MONTH verwenden.

Grüße,
Andre

11.06.2007 - 00:30 Uhr

Hallo,

Ja, wenn du einen Membership/Role-Provider für MySQL angibst. Wie es der Zufall will, gibt es sowas: http://www.codeproject.com/aspnet/MySQLMembershipProvider.asp

Grüße,
Andre

10.06.2007 - 17:31 Uhr

Hallo,

Willkommen im Forum.

Zum einen möchte ich dich bitten, Code-Tags zu verwenden (siehe Punkt 6 [Hinweis] Wie poste ich richtig?)

Zum anderen schau dir doch mal die Eigenschaften (Properties) von SqlConnection an :rtfm:. Bei State und DataSource solltest du doch fündig werden.

Grüße,
Andre

09.06.2007 - 10:43 Uhr

Hallo,

Vielleicht könntest du zumindest für die Karten Symbole verwenden, das würde sicherlich schneller lesbar sein als etwa "4h Ts".

@thejudge: http://de.wikipedia.org/wiki/Hole_Cards

Grüße,
Andre

08.06.2007 - 18:34 Uhr

Hallo,

NHibernate ist nur für den Transfer zwischen Anwendung und Datenbank gedacht. Was Anwendungsseitig aus NHibernate "rauskommt", sind ganz normale Objekte ganz normaler Klassen. Die Darstellung/Datenbindung ist nicht anders als mit "normal" erzeugten Objekten, d.h. man kann z.B. die ObjectDataSource verwenden.

Grüße,
Andre

08.06.2007 - 16:59 Uhr

Oder eben NHibernate, wenn du mit Objekten statt mit DataSets arbeiten möchtest.

08.06.2007 - 15:48 Uhr

Hallo,

Parameter gehen natürlich auch für normale Queries. Grundsätzlich kann man die Parameter so erstellen, wie du es gemacht hast. Vergiss nur nicht, sie auch der Parameter-Liste des Commands zuzufügen (cmd.Parameters.Add(parameter)).

Man kann oft auch den etwas bequemeren Weg gehen:


SqlCommand cmd = new SqlCommand( "SELECT u.ID, u.Name FROM Users u WHERE u.ID = @id", connection );
cmd.Parameters.AddWithValue( "@id", 45 );

Grüße,
Andre

08.06.2007 - 15:39 Uhr

Ich glaube dir natürlich, dass dir die Sicherheit wichtig ist, sonst würdest du dir sicher nicht so viele Gedanken machen. Mit "auf die leichte Schulter nehmen" meinte ich eher, dass du auf der Suche nach einer leichten Lösung vielleicht nicht ganz bis zu Ende gedacht hast.

Mir ging es auch weniger darum, die Möglichkeit der Parameterfälschung zu beurteilen, sondern vielmehr darum, ein Bewusstsein zu schaffen, Sicherheit zu einem First-Class-Member der Programmlogik zu machen. Eben wirklich Sicherheit by Design und nicht "by Zufall der Datenkeys" 😉

Zudem ließe sich eine flexible, wiederverwendbare Lösung sicherlich programmieren. Wenn man Businessrules im Code forciert und Sicherheit zu einer Businessrule erhebt, lässt sie sich relativ problemlos in die Anwendung integrieren. Man kann das aber auch trennen und dann eine recht einfaches API à la bool MayPerform(User user, Action action) verwenden, welches intern die Rollen des Nutzers und z.B. den Zustand der Anwendung überprüft und daraus Rückschlüsse über die Zulässigkeit bestimmter Aktionen zieht.

Viel Erfolg auf jeden Fall weiterhin!

Viele Grüße,
Andre

08.06.2007 - 15:17 Uhr

Hallo,

Natürlich ist das, was ich sage, persönlich gemeint. Sonst hätte ich dich nicht mit "Du" angesprochen, sondern über "jemanden, der so ein System implementieren will" 😉

Aber es war keinesfalls verletzend gemeint, falls du das meintest und so aufgefasst hast. Ich finde es gut und interessant, darüber zu diskutieren. Das ändert allerdings nichts an der Tatsache, dass ich denke, dass du die Sicherheit deiner Anwendung zu sehr auf die leichte Schulter nimmst, bzw. versuchst, die Unsicherheit deiner Anwendung an der falschen Stelle abzudichten.

Natürlich ist die Sicherheit einer Anwendung immer auch zu einem Teil eine Frage der Wahrscheinlichkeit (wie wahrscheinlich ist es, dass das Passwort eines Benutzers missbraucht wird usw.). Aber ich halte es in diesem Fall für völlig unnötig, einen zusätzlichen Unsicherheitsfaktor einzubringen und die Sicherheit möglicherweise vertraulicher Daten auf diese Weise aufs Spiel zu setzen.

Noch ein schönes Szenario: innerhalb eines Büros wird die Anwendung eingesetzt. Herr S. amüsiert sich gerade über die lustigen Fotos der Person, dessen Datensatz er gerade liest. Er schickt den Link an seine Kollegen, damit sie sich ebenso totlachen können. Im Besitz des Links können sich die Kollegen die vertraulichen Daten auf der Seite anschauen. Schon Interessant, was Herr Meyer (zufällig Nachbar einer der Mitarbeiter) wieder an Krediten aufgenommen hat...

Ich kann einfach nicht verstehen, dass du dich dagegen sträubst, die Sicherheit der Anwendung "ordentlich" als Teil der Anwendungslogik zu implementieren und dich stattdessen auf die Zufälligkeit eines Keys verlässt.

Grüße,
Andre

P.S.:

Die Frage ist nur, ob man an bestimmten Stellen das Berechtigungssystem auf Datensatzebene herunterziehen will

Das klingt so, als wenn das a) was außergewöhnliches und b) besonders schwer zu implementieren wäre. Beides ist nicht der Fall.

08.06.2007 - 14:45 Uhr

Hallo,

Mit deinem Vorschlag versuchst du lediglich, die Wahrscheinlichkeit bestimmter Symptome (Datenzugang für unbefugte Nutzer) klein zu halten, statt dich um die Ursache zu kümmern (unsichere Anwendung). Was du vorhast ist keine Lösung, sondern ein Hack, der wahrscheinlich funktioniert.
*Was ist, wenn eine MS SQL Server Datenbank verwendet wird, bei der statt NEWID() NEWSEQUENTIALID() verwendet wird? *Was ist, wenn man statt Guid.NewGuid() Combs verwendet? *Was ist, wenn die IDs unter WinNT generiert werden, wo GUIDs nicht zufällig, sondern mit hoher Wahrscheinlichkeit sequentiell sind? *Was ist mit Browser-History? Die GUIDs stehen dort im Klartext drin. Mal eben nachsehen, was der Kollege macht... *Was ist mit Szenarien, die du und ich nicht kennen?

Ups. Vielen Dank. Bei sensiblen Daten möchte ich mich auf so ein "System" nicht verlassen. Obige Punkte enthalten übrigens einige Punkte, bei denen die Sicherheit deiner Anwendung tatsächlich von der Datenhaltungsschicht abhängen. Bei einer Prüfung innerhalb der Businessschicht ist das eben nicht der Fall. Dort wird ganz klar geguckt: wer will was machen? Was darf er?

Im Sinne deiner Kunden kann ich dich nur bitten, das Thema Sicherheit etwas tiefergehend zu betrachten als "Wird schon nichts passieren."

Grüße,
Andre

08.06.2007 - 10:31 Uhr

Hallo,

Mit ToUpper/ToLower ginge das aber auch: if(derString == derString.ToLower())... Je nachdem, ob der String nicht-Textzeichen enthalten darf usw. könnte das die einfachere Methode ggü. der Überprüfung mit IsUpper/Lower sein.

Grüße,
Andre

08.06.2007 - 10:28 Uhr

Hallo,

Ich sehe das wie burning snow. Das Sicherheitsmodell gehört meines Erachtens in die Anwendung integriert und sollte nicht von der Erratbarkeit von URL abhängen. So wild ist das doch gar nicht. Ein Benutzer gehört einer oder mehrerer Rollen an. Je nach Rolle darf der Benutzer Daten sehen und/oder bearbeiten. Neben einer einfachen Zuordnung an Rollen kannst du bestimmte Aktionen auch detaillierte gestalten, etwa nach dem Motto: wenn der Benutzer zu Abteilung A gehört, darf er mit den Daten von Abteilung B dies und das anstellen.

Solche Regeln gehören zu den Business Rules und sollten als solche auch Teil der Programmierung sein. Wenn die Regeln kompliziert sind, dann sind sie das eben. Trotzdem darf man sich nicht scheuen, sie umzusetzen und anzuwenden. Alles andere ist über Kurz oder lang nur eine unbefriedigende Behelfslösung.

Grüße,
Andre

08.06.2007 - 08:47 Uhr

Hallo,

Naja, ich steh nicht so auf diese "Holzhammer-Satire". Offensichtlich versucht der "Autor" mit Gewalt witzig zu sein. Ist er aber leider meines Erachtens nicht.

Grüße,
Andre

07.06.2007 - 09:26 Uhr

Hallo,

Ich persönlich finde, dass die öffnende Klammer Teil des "Kopfes" ausmacht, ist sie doch schließlich nur eine "Formalität" um dem Compiler mitzuteilen, dass nun ein Code-Block beginnt. Ich sehe das vergleichbar mit XML-Tags, etwa


<if blablabla>
  <anweisung/>
  <anweisung/>
</if>

Ich möchte damit nicht sagen, dass die Variante mit der öffnenden Klammer in der folgenden Zeile falsch, dumm oder schlecht ist (Insofern ist das "Klar: im zweiten." aus meinem früheren Post auch ein falscher Rückschluss von subjektivem Empfinden auf Objektivität - sorry dafür). Nur repräsentiert die Öffnen-In-Der-Selben-Zeile-Methodik mir persönlich am ehesten den logischen Fluss des Codes. Und das, obwohl ich zunächst mehrere Jahre "deine" Variante verwendet habe. Pure Gewohnheit scheidet daher als Entscheidungskriterium bei mir aus. Dass natürlich Absprachen bzgl der Konventionen im Team das Primärkriterium sind, wurde hier im Thread schon mehrfach erwähnt.

Vielleicht sollte jemand mal eine Studie dazu betreiben. Nur wie misst man "Lesbarkeit" objektiv?

Grüße,
Andre

07.06.2007 - 09:07 Uhr

Original von no1gizmo

Beim Programmieren geht es auch um Übersichtlichkeit und Geschmack hin oder her, die Übersichtlichkeit ist bei der Variante, die auch Eclipse und Visaul Studio vertritt (standard), am besten gewährleistet:

An dieser Stelle fehlt es leider an jeglichem objektivem Argument. Nur weil du schreibst, dies sei die übersichtlichste Form, erhebt das diese Behauptung noch lange nicht zur Wahrheit. Argumente sind schlichtweg nicht existent. Verglichen damit sind die Argumente von Steve McConnell, die ich in Code layout kurz angerissen habe, doch bei weitem schlüssiger.

Grüße,
Andre

07.06.2007 - 08:45 Uhr

Hallo,

http://connectionstrings.com/ ist eine gute Quelle für derlei Fragen.

Grüße,
Andre

06.06.2007 - 17:50 Uhr

Hallo,

Authenticate überprüft doch lediglich Anmeldeinformationen aus dem <credentials> Abschnitt in der Config-Datei. Wenn du Membership Provider einsetzt, verwende stattdessen Membership.ValidateUser.

Grüße,
Andre

06.06.2007 - 17:06 Uhr

Hallo,

Vielleicht gar der "Öffnen mit..." Dialog im Explorer? Ich habe nämlich das Problem auch ganz und gar nicht verstanden.

Grüße,
Andre

06.06.2007 - 16:58 Uhr

Hallo,

Es sollte auch eigentlich "repariert" sein. Sollte noch jemand Probleme haben, meldet euch.

Grüße,
Andre

06.06.2007 - 16:53 Uhr

Hallo,

Ist wieder repariert.

Grüße,
Andre

06.06.2007 - 16:45 Uhr

Hallo,

Kann ich (leider) bestätigen. Wir schauen, woran das liegt und wie wir das fixen können.

Grüße,
Andre

06.06.2007 - 15:00 Uhr

Hallo,

Suchst du womöglich eine generische Methode?


public IList<TElement> GetObjects<TElement>() {
    return GetDatenbank().Query<TElement>(typeof(TElement));
}

Grüße,
Andre

06.06.2007 - 14:52 Uhr

Hallo,

Laut Doku benötigt Application.Exit

SecurityPermission für den Aufruf von nicht verwaltetem Code durch den unmittelbaren Aufrufer. Zugeordnete Enumeration: SecurityPermissionFlag.UnmanagedCode

Läuft die Anwendung in einem eingeschränkten Sicherheitskontext, etwa von einem Netzlaufwerk?

Bin leider kein .NET CAS-Experte 🙁

Grüße,
Andre

06.06.2007 - 14:49 Uhr

Hallo,

Es gibt bei 1und1 doch bestimmt irgendwo so ein "Control-Center". Dort sollte irgendwo auch der Punkt Verzeichnisschutz zu finden sein.

Grüße,
Andre

06.06.2007 - 13:44 Uhr

Original von alex309

  
public partial class Form1 : Form  
    {  
  
  
        private void button1_Click(object sender, EventArgs e)  
        {//einen neuen Eventhandler erstellen!  
            button1.Click += new EventHandler(button1_Clicked); //wieso muss ich 2mal auf den Button klicken  
                                                                //damit sich die Farbe ändert???  
            //Aufruf des ersten Delegaten!  
            mydelegate1();                                                      
        }                                                         
  
        void button1_Clicked(object sender, EventArgs e)  
        {  
            label1.BackColor = System.Drawing.Color.Aqua;  
              
        }  
  
      
    }  

Ich nehme an, dass du dem button1 im Designer den button1_click handler zugewiesen hast. Beim ersten Click wird die Methode angerufen und du fügst dem Button einen weiteren handler zu. Beim nächsten Click wird zunächst wieder button1_Click angerufen, danach button1_Clicked (weil der Handler seit dem ersten Click registriert ist). Beim nächsten Aufruf wird button1_clicked 2x(!) aufgerufen werden, da beim letzten button1_Click ein weiterer handler bei button1.Click registriert wird. Ich weiß ja nicht, was du vorhast, aber so ist mist 🙂 Warum nicht einfach direkt button1_Clicked im Designer als handler angeben?

  
private void Form1_Load(object sender, EventArgs e)  
        {//Delegaten an die Eevents binden  
  
            _event1 += mydelegate1;  
            _event2 += mydelegate2;  
            _event3 += mydelegate3;  
            
         //Methoden an die Delegaten binden    
            mydelegate1 += methode1;  
            mydelegate2 += methode2;  
            mydelegate3 += methode3;  
        }  
        private void methode1()  
        {  
            label1.BackColor = System.Drawing.Color.Chartreuse;  
              
            for (int i = 0; i < 100000000; i++)  
            {  
                  
            }  
              
            this.label4.Text = "Methode 1";  
  
            _event2();          //??????? muss mit new erzeugt werden???????  
        }  
  

_event1 += mydelegate1;
_event2 += mydelegate2;
_event3 += mydelegate3;

Hier sind mydelegate1-3 noch null! Du fügst den events also nichts zu.

mydelegate1 += methode1;
mydelegate2 += methode2;
mydelegate3 += methode3;

Gemeinerweise macht der Code nicht das, wonach es aussieht. Der += Operator ersetzt(!) den linksseitigen Delegaten durch einen neuen delegaten, der den linken und den rechten delegaten anruft. Der bestehende delegat wird nicht verändert. (Macht hier eh keinen Sinn, weil mydelegate1-3 hier noch null ist.

Meine Tipps:

  • Benutz den Debugger um zu verstehen, was genau passiert im Programm
  • Lies dich in C# ein (siehe im Menu links unter Ressourcen)

Grüße,
Andre

06.06.2007 - 09:01 Uhr

Gib den Objekten eine Art ID: Spielername, eine Nummer, eine GUID. Was auch immer.

Grüße,
Andre

05.06.2007 - 21:10 Uhr

Hallo,

Du solltest ein Objekt haben, dass die Änderungen aufzeichnet. Idealerweise laufen alle Datenbank-Zugrife über dieses Objekt ab. Das Interface besteht (im einfachsten Fall) z.B. aus diesen Methoden:


IList<T> GetAll<T>();
T GetByID<T>(int id); // Annahme: alle Objekte haben eine int-ID
void Delete(object entity);
void Save(object entity);
void Flush();

Ganz zentral ist die Flush Methode, welche den Datenbank-Inhalt mit dem Inhalt im Speicher synschronisiert. Das geht etwa wie folgt: Wann immer etwas geladen wird (mittels GetByID oder GetAll), "merkt" sich dieser Manager die Objekte in einer internen Liste ("persistente Objekte"). Beim Aufruf von "Flush" schreibt der Manager alle Daten dieser internen Liste in die Datenbank. Bei einem Aufruf von "Delete" verschiebst du das besagte Objekt von der internen Liste in eine zweite interne Liste, in der du alle zu löschenden Objekte speicherst. Bei Flush werden jetzt auch alle Objekte auf der "zu löschen" Liste aus der Datenbank gelöscht.

Zu guter letzt hast du noch die Save() Methode. Mit ihr fügst du ein neues (zuvor nicht persistentes Objekt) in die interne "persistente-Objekte"-Liste zu. Beim Flush werden die neuen Objekte auch in der Datenbank gespeichert.

Wie unterscheidest du neue Objekte (INSERT) und zu aktualisierende Daten (UPDATE)? Am einfachsten legst du fest, dass Objekte mit einer bestimmten ID (z.B. 0) "neu" sind (=> INSERT), die anderen sind bekannt (=> UPDATE).

Das ist natürlich ein ganz primitives Konzept sehr grob ausgearbeitet. Aber so ungefähr funktioniert auch das Lifecycle Management der "großen" Objekt-Relational Mapper wie NHibernate.

Dieses Manager Objekt ist übrigens ein prima Kandidat für das Unit of Work-Pattern

Grüße,
Andre

05.06.2007 - 20:51 Uhr

Hallo,

HttpServerUtility.UrlEncode könnte dir helfen.

Grüße,
Andre

05.06.2007 - 13:52 Uhr

Hallo,

Siehe diesen Thread: Code layout

Grüße,
Andre

05.06.2007 - 00:08 Uhr

Hallo,

Wenn die generierte XML-Datei genauso heißt wie die Assembly (MeineBibliothek.dll -> MeineBibliothek.xml), dann sollte Visual Studio die Kommentare automatisch laden.

Grüße,
Andre

04.06.2007 - 19:44 Uhr

Hallo,

Ja, und bislang ist Rhino Mocks die mit Abstand beste Mocking-Bibliothek für .NET die ich gefunden habe. Im Gegensatz zu vielen anderen Frameworks verwendet sie z.B. keine Strings um Methodennamen anzugeben. Stattdessen kann man mit den Methoden selbst arbeiten. Refactoring-freundlich also. Mir sind einige kleine Bugs aufgefallen bei komplizierten generischen Methoden, aber im Großen und Ganzen bin ich voll zufrieden - und ich mocke, was das Zeug hält.

Ist aber nicht unbedingt Thema dieses Threads 😉

Grüße,
Andre

04.06.2007 - 19:40 Uhr

Hallo,

Um die Bildschirmauflösung zu ändern kannst du ChangeDisplaySettings bemühen Click mich. Dann machst du dir eine Top-Most Form der passenden Größe ohne Rand und fertig 😉

Grüße,
Andre

04.06.2007 - 11:59 Uhr

Hallo,

Schwer zu sagen, wenn du uns keine detaillierte Beschreibung davon gibst, was du machst.

Grüße,
Andre

04.06.2007 - 11:56 Uhr

Hallo,

Noch mehr Kontrolle gibt dir z.B. Rhino Mocks. Damit kann man unter anderem Eventhandler mocken

Grüße,
Andre

04.06.2007 - 11:44 Uhr

Hallo Roli,

Willkommen im Forum. Dein Problem ist wirklich sehr merkwürdig und ich kann dir leider auch nicht weiterhelfen. Ich möchte dich aber dringend bitten, zukünftig Textformatierungen im Post (deutlich!) feinfühliger zu dosieren. GROßSCHREIBUNG und **übermäßiger Gebrauch von[/b] Formatierungen machen den Text unleserlich und wirken auf potenzielle Helfer abschreckend.

Viel Erfolg bei der Fehlersuche und Viele Grüße,
Andre

04.06.2007 - 11:34 Uhr

Hallo,

AttributeCount und MoveToAttribute vom XmlTextReader sind deine Freunde. Schau dir die Doku zum XmlTextReader an. Dort findest du auch ein Beispiel mit Attributen.

Viele Grüße,
Andre

04.06.2007 - 11:22 Uhr

Hallo,

Ich verwende auf meinem Entwicklungscomputer Vista Ultimate mit dem IIS7. Ich würde die Webseiten auf dem Server gerne innerhalb des Intranets zugänglich machen, nach außen hin aber sperren. Beim IIS6 gab es dafür einen Punkt unter "Verzeichnissicherheit" (Einschränkungen für IP-Adressen und Domänen). Beim IIS7 kann ich aber noch nichts dergleichen finden. Bei den Autorisierungsregeln kann ich nur Nutzern und Rollen Rechte geben oder entziehen.

In IIS: "Beschränkungen für IP-Adressen" konfigurieren wurde darauf hingewiesen, dass beim IIS5.1 auf nicht-Serversystemen eben dieser Punkt nicht verfügbar ist.

Jetzt sehe ich zwei Möglichkeiten:

  • Ich hab den benötigten Punkt im IIS7 einfach noch nicht gefunden
  • Unter Vista bietet der IIS7 diesen Punkt gar nicht an (d.h. Warten auf WinServer08 ist angesagt)

In der Doku steht unter Übersicht über IIS-Konzepte->Sicherheitsfeatures folgendes:

Autorisierung
Durch die Autorisierung wird bestimmt, auf welche Ressourcen auf einem Webserver ein bestimmter Benutzer zugreifen kann. In IIS 7.0 können Sie URL-Autorisierungsregeln konfigurieren, die bestimmten Computern, Computergruppen oder Domänen den Zugriff auf Websites, Anwendungen, Verzeichnisse oder Dateien auf dem Server gewähren bzw. verweigern.

Weiß da jemand von euch Genaueres?

Grüße,
Andre

01.06.2007 - 19:28 Uhr

Ich vermute allerdings, dass der betreffende Speicherbereich gar nicht auf dem verwalteten Heap liegt (sondern ein natives "Windows-Objekt" ist) und entsprechend gar nicht vom GC erfasst wird. Trotzdem - vor allem, da ich es auch nicht besser weiß - kann an deinem Gedankengang natürlich was dran sein.

01.06.2007 - 17:28 Uhr

Hallo,

Meiner Meinung nach solltest du etwas "objektorientierter" denken. Ich könnte mir durchaus eine Klasse vorstellen - nennen wir sie Calculator - mit verschiedenen Konstruktoren. Z.B. könnte der Default-Constructor eine Standarddefinition laden, ein andere Konstruktor könnte eine Dateinamen für die Definitionsdatei übergeben bekommen. Dann kann jeder Calculator sich auch noch eigene Sachen "merken" (Instanzvariablen) und arbeitet unabhängig voneinander. Wenn das Objekt noch was aufräumen soll, kann man wunderbar Dispose verwenden. Der vorgeschlagene "dauerstatische Zugriff" und das Singleton-Pattern halte ich für unpassend hier.


Calculator calc = new Calulcator();
calc.Foo();

Calculator calc2 = new Calculator("definitions.xml");
calc.Foo();

Das ist einfach, verständlich und dürfte gut erweiter- und wartbar sein. Denk mal einen Schritt weiter: verpass dem Calculator ein Interface (ICalculator). Erstelle und speichere irgendwo in der Anwendung eine ICalculator-Instanz und lass den Rest der Anwendung diese Schnittstelle verwenden. Jetzt kannst du nicht nur eine andere Definitions-Datei laden, sondern die Implementierung von Calculator komplett umkrempeln und zur Laufzeit austauschen, ohne dass der Rest der Anwendung davon betroffen ist. Sagt Hallo zum Strategy-Pattern 🙂

Grüße,
Andre

P.S.: Das Singleton-Pattern in einer Bibliothek ist eine ganz heikle Sache. Sollte es nach langer, langer Überlegung keinen unumstößlichen Grund geben, dass von der Klasse nur ein einziges Objekt existieren darf, lass das Pattern aus der Lib raus. Du verbaust dir sonst diverse Möglichkeiten der Nutzung.