Laden...

Forenbeiträge von thomae Ingesamt 94 Beiträge

19.10.2011 - 13:08 Uhr

Hm das klingt eingermassen vernünftig. Nur komme ich mit Fiddler nicht so recht klar..
Nur soviel, IE wird nicht neu gestartet denn es geht einfach ein neues Tab auf.

Gibt es dazu einen Lösungsansatz?

19.10.2011 - 10:41 Uhr

Hallo Taucher

nein ich denke das ist nicht möglich. Es scheint mir mehr, als dass IE eine neue Session eröffnet wieso auch immer.

Kannst du ein ähnliches Problem auf deiner Seite auch nachvollziehen?

Grüsse

Marc

07.10.2011 - 14:09 Uhr

Hallo zusammen

ich bin ein wenig erstaunt ob dem Verhalten des IE (nicht zum ersten Mal) 😉

Wir haben einen Mechanismus implementiert, der es uns erlaubt einen Link unserer gesicherten Seite zu speichern. Wird der Link geklickt wird geprüft ob der User bereits eine aktive Session hat, wenn nicht wird eine erstellt, der Login Dialog dargestellt und nach erfolgreichem Login ein Redirect auf die ursprüngliche URL gemacht. Hat der User eine aktive Session erscheint der Report ohne Login Dialog. Soweit klappt alles ganz gut.

Speichere ich den Link im IE oder FF als Shortcut klappts, genauso wenn ich jemandem den Link per Mail sende. Wenn ich mir aber eine Liste von Links in Word erstelle und anschliessend mit CTRL + Mouse den Link anklicke scheint es keine aktive Session zu geben, auch wenn ich schon eingeloggt bin und es eine aktive Session gibt.

HttpContext.Current.Session[xy] existiert in diesem speziellen Fall nicht.

Kennt jemand die Ursache dieses Problem und hat einen Lösungsansatz bereit?

Gruss

Marc

17.03.2011 - 15:37 Uhr

@Herbivore, könntest du mir das kurz in meinem Codebeispiel zeigen / erweitern?

Danke

17.03.2011 - 15:32 Uhr

Und war das so gemeint mit interpolieren?

 private static Color convertColor(Color colorToConvert)
        {
            if (colorToConvert.A == 255 || colorToConvert.A == 0)
            {
                return colorToConvert;
            }

            Color whiteColor = Color.White;

            int newRValue = colorToConvert.R + (whiteColor.R - colorToConvert.R) * colorToConvert.A/255;
            int newGValue = colorToConvert.G + (whiteColor.G - colorToConvert.G) * colorToConvert.A / 255;
            int newBValue = colorToConvert.B + (whiteColor.B - colorToConvert.B) * colorToConvert.A / 255;

            Color convertedColor = Color.FromArgb(newRValue, newGValue, newBValue);

            return convertedColor;
        }
17.03.2011 - 15:27 Uhr

So mit Bitmap?

 private static Color convertColor1(Color colorToConvert)
        {
            if (colorToConvert.A == 255 || colorToConvert.A == 0)
            {
                return colorToConvert;
            }

            Rectangle r = new Rectangle(0,0,1,1);
            Bitmap bmp = new Bitmap(1, 1);            

            using (Graphics gbm = Graphics.FromImage(bmp))
            {
                gbm.FillRectangle(new SolidBrush(colorToConvert), r);
            }

            int newRValue = bmp.GetPixel(0, 0).R;
            int newGValue = bmp.GetPixel(0, 0).G;
            int newBValue = bmp.GetPixel(0, 0).B;

            Color convertedColor = Color.FromArgb(newRValue, newGValue, newBValue);

            return convertedColor;
        }

Führt nicht ganz zum gewünschten Effekt. Wenn wir beispielsweise:

A: 80
R: 255
G: 0
B:0

Nehmen würde ich ein schwaches ROT erwarten. Ist aber nicht der Fall..

17.03.2011 - 15:12 Uhr

R: 220
G: 0
B: 27

das ist hier die Urfarbe.

A: 100 heisst dass es eine gewisse Transparenz gibt was wiederum heisst, dass meine Urfarbe Richtung Weiss streben soll..

17.03.2011 - 14:42 Uhr

Hallo zusammen

ich versuche eine Farbe mit Alpha in eine Farbe ohne Alpha zu konvertieren.

Startfarbe:

A: 100
R: 220
G: 0
B: 27

Endfarbe?

Und es geht nicht darum einfach das Alpha abzuschneiden. Ich möchte das Alpha mit in meine Kovertierung einbeziehen. Also soll eine abgeschwächte Form der Urfarbe ohne Alpha entstehen.

Alles klar?

Als Ansatz mal meine "Lösung" 😃

private static Color convertColor(Color colorToConvert)
        {
            if (colorToConvert.A == 255 || colorToConvert.A == 0)
            {
                return colorToConvert;
            }

            int alpha = colorToConvert.A;
            int newRValue = colorToConvert.R + alpha;
            if (newRValue > 255)
            {
                newRValue = 255;
            }
            int newGValue = colorToConvert.G + alpha;
            if (newGValue > 255)
            {
                newGValue = 255;
            }
            int newBValue = colorToConvert.B + alpha;
            if (newBValue > 255)
            {
                newBValue = 255;
            }

            Color convertedColor = Color.FromArgb(newRValue, newGValue, newBValue);

            return convertedColor;
        }

Gruess

Marc

08.03.2011 - 15:38 Uhr

verwendetes Datenbanksystem: <Oracle 11R2>

Hallo zusammen

ich bin dabei eine Reporting Homepage zu implementieren. Die Homepage besteht aus verschiedenen Seiten welche jeweils irgendwelche Report mit Grid + Chart darstellen.

In einem meiner Reports habe ich 1 Grid + 10 Charts. Die Daten die von der DB abgefragt werden sind für alle Elemente die selbe.

StringBuilder query = new StringBuilder();
query.Append("SELECT MEAS_DATE, ");
query.Append("TOTAL, VALUE_1, VALUE_2, VALUE_3, VALUE4 ");
query.Append("FROM REPORTING.example ");
query.Append("WHERE MEAS_DATE > SYSDATE - 31 ");
query.Append("GROUP BY MEAS_DATE DESC ");

SqlDataSource dataSource = new SqlDataSource();
dataSource.ProviderName = "System.Data.OracleClient";
dataSource.ConnectionString = DbHandler.getConnectionString("USR_XY", "myPwd");
dataSource.SelectCommand = query.ToString();
gridView.DataSource = dataSource;
gridView.DataBind();

Diese Abfrage gibt mir 30 Rows zurück und steht schön geschrieben im Grid.

Nun möchte ich 5 Grafiken machen.

  1. Top 10 aller Total Rows absteigend nach Total geordnet
  2. Top 10 aller Value_1 Rows absteigend nach Value_1 geordnet
  3. Top 10 aller Value_2 Rows absteigend nach Value_2 geordnet
  4. Top 10 aller Value_3 Rows absteigend nach Value_3 geordnet
  5. Top 10 aller Value_4 Rows absteigend nach Value_4 geordnet

Dazu modifiziere ich für jedes Chart die Datasource:

if (gridView.DataSource.GetType() == typeof(SqlDataSource))
{
     SqlDataSource modifiedSource = gridView.DataSource as SqlDataSource;
     modifiedSource.SelectCommand = "SELECT * FROM (SELECT * FROM (" + modifiedSource.SelectCommand + " ) ORDER BY " + sortColumnDBName + " DESC) WHERE ROWNUM <= 10";
     chart.DataSource = modifiedSource;
}

Wobei sortColumnDBName das zu sortierende DB Field ist.

Das funktioniert an und für sich ganz gut. Ist aber bei steigender Anzahl Charts alles andere als effizient. Da für 5 Charts + 1 GridView 6 mal die DB abgefragt ist.

Ich möchte das Ganze nun ein wenig optimieren und die Daten nur einmal zu lesen versuchen. Gibt es da eine hübsche Möglichkeit? Evtl was mit LINQ? Oder muss ich alles in einer DataTable + DataView zwischenspeichern und dann selber sortieren?

Danke schon mal im Voraus.

Gruss

Marc

23.02.2011 - 15:15 Uhr

Ganz einfach:

HttpContext.Current.Response.ClearHeaders();

Vorab.. Also sollten die Settings dann so aussehen:

HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.AppendHeader("Content-Disposition", String.Format("attachment;filename={0}", fileName));
HttpContext.Current.Response.TransmitFile(fileNamePath);
HttpContext.Current.Response.End();

23.02.2011 - 14:45 Uhr

Hallo zusammen

ich brauche mal wieder eure Hilfe.

IIS7.5
ASP.Net 3.5
Https

Ich habe in eine meiner Pages einen Button "Export Excel". Durch das Klicken des Buttons wird ein Exceldokument aufbereitet und heruntergeladen. Ich mache das mit folgendem Code:

HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.AppendHeader("Content-Disposition",
String.Format("attachment;filename={0}", fileName));
HttpContext.Current.Response.TransmitFile(fileNamePath);
HttpContext.Current.Response.End();

Das Ganze klappt ausgezeichnet solange ich meine Seite nicht mit HTTPS anspreche. Wenn ich das tue, dann erhalte ich eine Nachricht "Internet Explorer can not download xy from www.xy.com. Internet Explorer was not able to open this Internet site." In anderen Browsers läuft es natürlich ohne Probleme.

Ich habe den Verdacht, dass IE versucht die Excel Applikation im Browser zu starten... Aber das ist nur eine Vermutung.

Kann mir jemand weiterhelfen? Ich möchte eigentlich das File nur zum Download anbieten. Wie muss ich meinen Code anpassen?

Danke schonmal

Marc

14.02.2011 - 15:26 Uhr

Ich habs mal installiert 😃

14.02.2011 - 09:48 Uhr

TrendMicro OfficeScan

14.02.2011 - 09:09 Uhr

Vielleicht noch ein Wort zu den verwendeten Maschinen.

Wir arbeiten mit Quad Core Maschinen mit 4 GB Ram. Es handelt sich dabei um 64 Bit Maschinen, da aber in der Firma nur Windows XP zugelassen ist läuft das OS dementsprechend mit 32 Bit..

Bin ziemlich ratlos, zumal das Problem auf 2 Maschinen auftritt..

14.02.2011 - 09:07 Uhr

Nein gar nichts..

14.02.2011 - 09:04 Uhr

Hallo zusammen

wir arbeiten mit Visual Studio 2010 und haben immer wieder Abstürze der Entwicklungsumgebung. Meist ist es der Fall, dass wir in die Kaffeepause gehen und nach der Pause erscheint eine Nachricht dass Visual Studio neu gestartet werden muss.

Ist jemand anderem dieses Problem auch bekannt? Irgendwelche Ansätze das sauber zu fixen?

Gruss

Marc

09.02.2011 - 14:12 Uhr

Danke Abt 😃 Ich denke auch dass es Sinn macht. Ich schreibe mir jetzt noch ein kleines Exe dass mir das Umbenennen und archivieren abnimmt dann ist das ne ganz saubere Sache.

Grüsse

Marc

09.02.2011 - 13:47 Uhr

Ach so danke für die Erklärung.

Also ich fasse für alle (und vor allem für mich) kurz zusammen.

Ich habe in meinem Visual Studio ein Post-Build Event aufgesetzt:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler -p "$(ProjectDir)." -v /$(ProjectName)

Auf dem Server habe ich 2 Ordner:

MyPage

MyPage_Publish

Nach dem builden benutze ich die Publish action in VS und publishe meine Seite in den Publish Ordner MyPage_Publish auf dem Server.

Nach dem publishen benenne ich MyPage um in MyPage_xy und bennene anschliessend MyPage_Publish um in MyPage.

So verfahre ich für alle publishs.

Ist das so alles korrekt?

07.02.2011 - 09:38 Uhr

Und welche Option im VS wird bevorzugt verwendet?

1: "Replace matching files with local copies"
2: "Delete all existing files prior to publish"
Variante 1 erübrigt sich bei meiner angesprochenen Methode, da keine Files im Ordner existieren.
Nichts desto trotz würde ich sowieso auf Variante 2 setzen, da ich das gefühl hab, dass der Vergleich bei Content-Files oft nicht funktioniert.

Stimmt natürlich sorry

Und gibt es auch die Möglichkeit vorzucompilieren? Ansonsten wäre ja nach dem Umbenennen die jeweils ersten Requests sehr langsam..

Vorkompilieren geht über eine Post-Build-Action:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler -p "$(ProjectDir)." -v /$(ProjectName)

Hm aber dieses Script hilft mir nur fürs Kompilieren im Localhost richtig? Ich möchte nach dem Publshen auf den Server vorkompilieren..

07.02.2011 - 08:31 Uhr

Danke für eure Kommentare..

Und welche Option im VS wird bevorzugt verwendet?

1: "Replace matching files with local copies"
2: "Delete all existing files prior to publish"

Und gibt es auch die Möglichkeit vorzucompilieren? Ansonsten wäre ja nach dem Umbenennen die jeweils ersten Requests sehr langsam..

Gruss

Marc

04.02.2011 - 15:26 Uhr

Hallo zusammen

ich möchte gerne mal eure Meinung zum Thema publishen einer Webseite lesen.

Wir haben eine ASP.Net (3.5) Applikation entwickelt, die wir auf einem Windows 2008 Server mit IIS 7.5 als Website laufen lassen.

Das Ganze funktioniert einwandfrei, da wir aber gleichzeitig relativ viele Benutzer online haben können, möchten wir so wenig Downtime wie möglich. Da wir bisher in eienr Testphase waren habe ich mein Publish jeweils mit der Option in Visual Studio gemacht. Und dabei die Einstellung "Delete all existing files prior to publish" verwendet. Mir ist klar dass wir so nicht in einen produktiven Modus wechseln können, da so immer die ganze Seite neu erstellt wird. Das kostet erstens beim kopieren, zweitens beim kompilieren und die Seite ist für eine Weile offline. Als weiterer Schwachpunkt sehe ich, dass auch alle Files gelöscht werden die in der Applikation selber hochgeladen wurden.

Wenn ich das Konzept richtig verstanden habe würde es reichen nur die geänderten Dateien zu kopieren. Somit wäre der Rest der Seite immer verfügbar?! Ich habe eine xcopy Lösung angedacht, aber möchte wie Eingangs geschrieben mal eure Meinung hören bzw. lesen. Ich bin mir auch nicht im klaren, ob man besser via SMB (FileShare), FTP oder sonst was publishen sollte.

In einem der Beiträge hier im Forum wird davon geschrieben, dass man sich 2 Seiten einrichten soll. und nach dem publishen umswitcht. Erscheint mir irgendwie ein bisschen nach einem Bastelansatz...

Danke für eure Kommentare

Grüsse

Marc

04.02.2011 - 14:45 Uhr

Danke Leute ich war nun fähig das Issue zu lösen.

Es handelte sich dabei um 2 CSS Probleme:

Das Tag <h1> habe ich im CSS erweitert allerdings ohne eine Schriftgrösse anzugeben. Anscheinend kam der IE damit icht wirklich zurecht.

Der zweite Punkt hatte mit einem CSS Eintrag "position: relative; " zu tun. Nachdem ich die Positionierung des Menüs angepasst habe funktioniert alles einwandfrei.

Mir ist zwar nach wie vor ein Rätsel wieso der Firefox und andere Browser kein Problem hatte aber das wird wohl nur Micro$oft erklären können.

Danke und ein schönes Wochenende

Marc

02.02.2011 - 14:18 Uhr

Hallo zusammen

genau richtig M@TUK, es hängt irgendwie mit dem Compatibility Mode des IE zusammen. Im Intranet Modus sieht es schlecht aus, in Internet Modus gut..

Aber was heisst das jetzt für mich? Ist meine Seits schlecht designet oder der IE nicht zu gebrauchen?

Cheers

31.01.2011 - 12:50 Uhr

Das Aussehen der Page ist unterschiedlich. Für mich sieht es so aus als würde nicht der selbe HTML Code zurück kommen. Es sind keine riesigen Unterschiede, aber sie sind halt nicht identisch. Ein Beispiel ist dass ein <div> einmal schön mit Background gerendert wird, aber einmal zu gross erscheint..

31.01.2011 - 12:43 Uhr

verwendete Web-Technologie: <ASP.NET>

Hallo zusammen

ich hoffe jemand kann mir helfen.

Ich habe in unserem Intranet eine neue Site published. Dazu haben wir einen Windows 2008 Server mit IIS 7 verwendet.

Wenn ich nun die Seite mit der IP Adresse anspreche:

http://10.20.150.60/Portal.aspx

Sieht die Seite anders aus als wenn ich sie mit Servernamen anspreche:

http://CSVOR001/Portal.aspx

An was liegt das? Und kann ich im IIS irgendwo eine Einstellung machen um das selebe Resultat zu erreichen?e

Liebe Grüsse

Marc

27.12.2010 - 13:39 Uhr

Hallo zusammen

ich bin dabei eine Homepage zu implementieren, welche mir Daten einer DB in aufbereiteter Form darstellen soll. Es ist möglich n Grids und n Charts für jedes Grid auf einer Seite zu haben. Das funktioniert soweit ganz gut. Ich sehe die Daten in gewünschter Form und bin damit auch ganz zufrieden.

Nun möchte ich einen Schritt weiter gehen und die Daten dem User per Excel zur Verfügung stellen können. Dazu soll der User auf der Page einen Export button drücken können, serverseitig wird dann das File erstellt und anschliessend dem User zum Download angeboten. Da ich relativ neu in der ASP Welt bin habe ich mich erst mit den Com libraries rumgeschlagen, was ja eher nicht empfehlenswert ist 😉

"Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment"

http://support.microsoft.com/kb/257757

So habe ich weiter gesucht und bin auf folgendes Framework gestossen:

http://npoi.codeplex.com/releases/view/49524

Ich habe ein wenig rumgespielt, allerdings unterstützt dieses Framework das handeln von Charts nur unter der Verwendung von Templates. D.h. es können keine neuen Charts eingefügt werden.. Das kommt für mich nicht in Frage, da meine Pages sehr dynamisch aufgebaut werden.

Lange Rede, kurzer Sinn. Was empfehlt ihr für Komponente oder Ansätze um Excel Files in einer IIS Umgebung sauber exportieren zu können?

Ich bin für alle Hinweise sehr dankbar.

Frohe Festtage und viele Grüsse

Marc

06.09.2010 - 13:25 Uhr

Hallo zusammen

ich bin dabei mich schlau zu machen, wie ich am Besten die Kommunikation innerhalt meines ASP Projektes umsetzen soll. Ich habe dazu einige Ansätze gelesen, bin mir aber nicht sicher ob ich alles richtig verstanden habe und möchte vorab mal euch hier um Rat fragen.

Hauptanforderung:
Ein Control "ControlA" das eine DropDownList enthält soll an einer beliebigen Stelle eingebettet werden können. Wir das selektierte Value auf der DropDownList geändert soll das Control "ControlMenu" welches auch an einer beliebigen Stelle eingebettet sein kann darauf reagieren und eine Methode aufrufen um sagen wir mal das Menü neu zu zeichnen....

Kann mir da einer möglichst rasch helfen..

Vielen Dank

Marc

13.11.2008 - 12:57 Uhr

Ich weiss eben auch nicht was die Provider machen, echt ärgerlich.

Generisch Spalten werden nicht abgerufen, und der Wert CHECF ist ein Parameterwert, der aber leider nicht statisch ist!
Komisch ist auch das das Ganze mit einem OracleClient 10.0 läuft!?

Ich habe jetzt eine Tabelle aufgebauen wo ich userspezifische Werte reinschreibe und die dann mittels einer Funktion abfrage, so kann wie du auch erwähnt hast eine View darum packen!

Hier mein Ansatz:

-- TABLE
CREATE TABLE APPL_FCS_DB.SYS_QUERY_PARAMETERS (
PARAMETER_NAME VARCHAR2(50) NOT NULL,
PARAMETER_VALUE VARCHAR2(50) NOT NULL,
CREATED_BY VARCHAR2(30) NOT NULL,
CREATED_ON DATE NOT NULL
);

-- PACKAGE
CREATE OR REPLACE PACKAGE &&objowner..pg_query_params AS

-- internal formatting constants  
number_format               CONSTANT VARCHAR2(50) := &#39;FM99999999999999990.0000000000&#39;;  
date_format                 CONSTANT VARCHAR2(50) := &#39;DD.MM.YYYY HH24:MI:SS&#39;;  
  
outst_debt_client           CONSTANT VARCHAR2(50) := &#39;OUTST_DEBT_CLIENT&#39;;  
outst_debt_checkdate        CONSTANT VARCHAR2(50) := &#39;OUTST_DEBT_CHECKDATE&#39;;  
outst_debt_appl_setcurr     CONSTANT VARCHAR2(50) := &#39;OUTST_DEBT_APPL_SETCURR&#39;;  
outst_debt_service          CONSTANT VARCHAR2(50) := &#39;OUTST_DEBT_SERVICE&#39;;  
  
 PROCEDURE set_parameter_str(  
    p_param_name IN VARCHAR2,  
    p_param_value IN VARCHAR2);  
      
PROCEDURE set_parameter_date(  
    p_param_name IN VARCHAR2,  
    p_param_value IN DATE);  
      
PROCEDURE set_parameter_number(  
    p_param_name IN VARCHAR2,  
    p_param_value IN NUMBER);  

FUNCTION get_parameter_value_str(
p_param_name IN VARCHAR2) RETURN VARCHAR2;

FUNCTION get_parameter_value_date(  
    p_param_name IN VARCHAR2) RETURN DATE;  
      
FUNCTION get_parameter_value_number(  
    p_param_name IN VARCHAR2) RETURN NUMBER;  
      

END pg_query_params;
/

-- VIEW
CREATE OR REPLACE VIEW &&objowner..V_APP_SPR_TEST
AS
SELECT
*
FROM
TABLE
(
&&objowner..pg_table_func.get_oust_debts(
&&objowner..pg_query_params.get_parameter_value_str(&&objowner..pg_query_params.outst_debt_client),
&&objowner..pg_query_params.get_parameter_value_date(&&objowner..pg_query_params.outst_debt_checkdate),
&&objowner..pg_query_params.get_parameter_value_str(&&objowner..pg_query_params.outst_debt_appl_setcurr),
&&objowner..pg_query_params.get_parameter_value_str(&&objowner..pg_query_params.outst_debt_service)
)
);
COMMENT ON TABLE &&objowner..V_APP_SPR_TEST IS 'TEST VIEW';

Hat jemand einen anderen Ansatz

13.11.2008 - 10:36 Uhr

verwendetes Datenbanksystem: Oracle 9i V2
verwendetes .Net Framework: 2.0
verwendeter Oracle Client: 9.2.0.1.0

Hallo Leute

ich suche seit Gestern nach einer Lösung für mein Problem, hoffe jemand kann mir hier helfen.

Ich habe eine Oracle Table Function (PIPILINED) erstellt um diverse Sachen ein wenig zu optimieren.

Anschliessend habe ich die Table Function aufgerufen mit SQL+ was problemlos geht. das query sieht so aus:

SELECT
*
FROM
TABLE
(
&&objowner..pg_table_func.get_oust_debts('CHECF', SYSDATE, 'USD', 'K2r')
);

Nun wollte ich genau dieses Query absetzen aus .Net (C#) bekomme aber ständig die Meldung "ungültiger Spaltenname".

Es liegt aber definitiv nicht an der Query das konnte ich prüfen. Habe anschliessend daran geacht einerseits mit einem OLEDbProvider und OracleDbProvider zu testen. Bei beiden der selbe Effekt.

Hat da jemand einen Ansatz um mir zu helfen?

Und ist es möglich nur den DataProvider für .Net zu erhöhen ohne den OracleClient upzugraden?

Liebe Grüsse

Thomä

30.07.2008 - 13:01 Uhr

verwendetes Datenbanksystem: Oracle 9i

Hallo Leute

ich schlage mich schon seit längerer Zeit mit folgendem Problem rum:

Ich bekomme Inputdaten aus aller Welt - Sprich die verwendeten Zeichen könnten unterschiedlicher nicht sein. Nun möchte ich alle Zeichen die erlaubt sind in meiner Datenbank ablegen.

Dazu habe ich folgende Klasse geschrieben:


using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace com.comfone.HDSClient.Utils
{
    class StringChecker
    {
        private static string regexPattern = "^[A-Za-z-0-9,._!?=()%/;+*@$-]$";
        
        public static string ReplaceMethode(Match m)
        {
            switch (m.Value)
            {
                case "\r":
                    return "";

                case "\n":
                    return "";

                case "'":
                    return "´";

                case "\"":
                    return "";

                case "p":
                    return "-";

                case "Z":
                    return "S";

                case "[":
                    return "s";

                case "":
                    return "e";

                case "":
                    return "E";

                case "{":
                    return "Z";

                case "|":
                    return "z";

                case "D":
                    return "n";

                case "C":
                    return "N";

                case "ó":
                    return "o";

                case "Ó":
                    return "O";

                case "y":
                    return "Z";

                case "z":
                    return "z";

                case "B":
                    return "l";

                case "A":
                    return "L";

                case "":
                    return "a";

                case "":
                    return "A";

                case "ž":
                    return "z";

                case "Ž":
                    return "Z";

                case "š":
                    return "s";

                case "Š":
                    return "S";

                case "":
                    return "C";

                case "
":
                    return "c";

                case "–":
                    return "-";

                case "ä":
                    return "ae";

                case "ü":
                    return "ue";

                case "ö":
                    return "oe";

                case "é":
                    return "e";

                case "è":
                    return "e";

                case "ê":
                    return "e";

                case "ë":
                    return "e";

                case "á":
                    return "a";

                case "à":
                    return "a";

                case "â":
                    return "a";

                case "æ":
                    return "ae";

                case "å":
                    return "a";

                case "ì":
                    return "i";

                case "í":
                    return "i";

                case "î":
                    return "i";

                case "ï":
                    return "i";

                case "ò":
                    return "o";

                case "ô":
                    return "o";

                case "õ":
                    return "o";

                case "ù":
                    return "u";

                case "ú":
                    return "u";

                case "û":
                    return "u";

                case "ý":
                    return "y";

                case "ÿ":
                    return "y";

                case "ø":
                    return "o";

                case "œ":
                    return "oe";

                case "ß":
                    return "ss";

                case "ç":
                    return "c";

                case "ñ":
                    return "n";

                case "ã":
                    return "a";

                case "&":
                    return "and";

                case "":
                    return "";

                case "0":
                    return "0";

                case "1":
                    return "1";

                case "2":
                    return "2";

                case "3":
                    return "3";

                case "4":
                    return "4";

                case "5":
                    return "5";

                case "6":
                    return "6";

                case "7":
                    return "7";

                case "8":
                    return "8";

                case "9":
                    return "9";

                default:
                    return m.Value;
            }
        }

        public static string replaceNotAnsiCharacters(string stringToCheck)
        {
            string retValue = stringToCheck;
            Regex myRegex = new Regex(regexPattern);
            MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceMethode);
            if (!myRegex.IsMatch(stringToCheck))
            {
                retValue = "";
                for (int i = 0; i < stringToCheck.Length; i++)
                {
                    retValue += Regex.Replace(stringToCheck[i].ToString(), "-*.*", myEvaluator, RegexOptions.IgnoreCase);
                }
            }
            return retValue;
        }
    }
}

Nun reicht dies aber nicht! Ich suche nach einer besseren Variante, die mir alles nicht erlaubte noch weglöscht!

noch besser wäre eine Lösung die ich direkt auf der datenbank anwenden kann. Per Trigger oder so..

Weiter habe ich das Problem, dass meine DB jetzt Daten beinhält welche nicht zulässig sind. Hoffe jemand kann mir helfen..

Danke schon mal

Thomä

08.01.2008 - 11:20 Uhr

Ok danke Leute, ist genau so wie ichs mir gedacht habe. Da ich in einem Team entwickle und die Leute möglichst einfach arbeiten sollen werde ich mir einen Wrapper bauen!

08.01.2008 - 11:15 Uhr

Das war auch meine Idee allerdings habe ich einen gewissen Respekt von dem Ändern von generiertem code. Es könnte sein dass ich das Framework erweitern will. Klappt das ohne Probleme?

08.01.2008 - 10:48 Uhr

Danke für deine Antwort.

Ich habe diesen Ansatz auch gesehen, allerdings finde ich es sehr unpraktisch, dass ich dann die Namen des jeweilges Ressourcesfiles kennen muss. Das ist die oben erwähnte Klasse doch um eines praktischer oder nicht?

Evtl. sonst noch was?

08.01.2008 - 10:36 Uhr

Hallo Leute

ich werde nicht so ganz schlau aus den gefundenen Beiträgen Daher poste ich meine Frage hier kurz und bündig.

Ich habe mir ein Framework programmiert welches auf Bitmaps als Resources beinhält. Jetzt möchte ich in einer konkreten Implementation auf die Resourcen zugreifen . Leider ist die Klasse Resources.resx eine internal Klasse -> Sie kann nicht gelesen werden. Und ich möchte nicht im automatisch generierten Code rumwühlen.

So habe ich mir eine Klasse gebaut die wie folgt aussieht:


using System;
using System.Collections.Generic;
using System.Text;
using System.Resources;
using System.Drawing;

namespace Project_Namespace
{
    public static class ResourcesManager
    {
        public static Bitmap ActionCancel
        {
            get
            {
                return Properties.Resources.ActionCancel;
            }
        }
    }
}



So würde ich jetzt jede Ressource wrappen.. Gibt es nichts eleganteres? Denn so müsste ich für alle neuen Ressourcen eine Property hinzufügen.

Thomä

18.12.2007 - 16:34 Uhr

Ach das Basestream Flush ist nicht wirkungsvoll 😦

18.12.2007 - 16:12 Uhr

ich hab jetzt mal mein datareceived eventhanlder weggenommen und es so probiert..


private void readDataSpecialBaud(SerialPort serialPort)
        {
            try
            {
                string lastReadWriteResult = "";
                int maximalAllowedTimeout = 5000;
                readFinished = false;
                errorOccured = false;
                progressBar.Value = 0;
                readWriteResult = "";
                serialPort.Open();
                serialPort.Write("/?!\r\n"); //Start befehl
                lastReceivedTime = DateTime.Now;
                int count = 0;

                while (!errorOccured && count == 0)
                {
                    if (lastReceivedTime.AddMilliseconds(maximalAllowedTimeout) < DateTime.Now)
                    {
                        errorOccured = true;
                        MessageBox.Show("Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?");
                        readWriteResult = "Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?";
                        break;
                    }
                    count = serialPort.ReadChar();
                }                
                if (!errorOccured)
                {
                    string to4800 =0X06 + "040\r\n"; //Befehl zum umschalten auf 4800
                    serialPort.Write(to4800); 
                    serialPort.BaseStream.Flush();
                    serialPort.Close();
                    Thread.Sleep(250);         
                    serialPort.BaudRate = 4800;
                    serialPort.Open();
                    Thread.Sleep(250);                    
                    lastReceivedTime = DateTime.Now;
                    while (!errorOccured)
                    {
                        if (lastReceivedTime.AddMilliseconds(maximalAllowedTimeout) < DateTime.Now)
                        {
                            errorOccured = true;
                            MessageBox.Show("Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?");
                            MessageBox.Show(readWriteResult);
                            readWriteResult = "Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?";
                            
                            break;
                        }
                        if (!string.IsNullOrEmpty(readWriteResult) && readWriteResult != lastReadWriteResult)
                        {
                            lastReadWriteResult = readWriteResult;
                            if (progressBar.Value + 1 < progressBar.Maximum)
                            {
                                progressBar.Value++;
                            }
                            else
                            {
                                progressBar.Value = 0;
                            }
                        }
                        readWriteResult += serialPort.ReadExisting();
                    }

                    progressBar.Value = progressBar.Maximum - 1;
                    if (serialPort != null && serialPort.IsOpen)
                    {
                        serialPort.Close();
                    }
                    if (!errorOccured)
                    {
                        MessageBox.Show("Lesen der Daten korrekt beendet");
                        string folderName = ConfigurationManager.Instance.ZaehlerDatenFilePath;
                        string filename = getFileName(ref folderName, lastReadWriteResult);
                        saveFile(folderName, filename, readWriteResult);
                    }
                }
            }
            catch (Exception ex)
            {
                errorOccured = true;
                if (serialPort.IsOpen)
                {
                    serialPort.Close();
                }
                readWriteResult = "Error: \r\n" + ex.StackTrace;
                MessageBox.Show("Error, Aktion abgebrochen");
            }
        }


-> keine verbesserung

Betreffend der Whileschlaufen. Wie willst du sonst überwachsen ob das Gerät antwortet?

18.12.2007 - 15:42 Uhr

Hmm ich habe ja ein existierendes C++ Programm. Da funktioniert die umschalterei wie folgt..

char to4800[]=".040\r\n"; // Befehl zum Umschalten auf 4800 Baud
to4800[0]=0X06;

... Open
... Read 1 Char

SendData(to4800, 6);
Sleep(pause)
SetCommState(neue Baudrate)

und schwups geht es..

Ich habe das Gefühl das es mit den Eventhandlern zusammenhängt..

18.12.2007 - 15:36 Uhr
private static SerialPort getSerialPortConnection(ConnectionType cType, int baudrate)
        {
            SerialPort sp = new SerialPort();
            if (cType == ConnectionType.RS232)
            {
                sp.PortName = "COM1";
            }
            else if (cType == ConnectionType.Bluetooth)
            {
                sp.PortName = "COM5";
            }
            sp.BaudRate = baudrate;
            sp.Handshake = Handshake.None;
            sp.ReadTimeout = 2500;
            sp.WriteTimeout = 2500;
            sp.ReadBufferSize = 100;
            sp.DtrEnable = true;
            sp.RtsEnable = true;
            sp.DataBits = 7;
            sp.Parity = Parity.Even;
            return sp;
        }

private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            lastReceivedTime = DateTime.Now;
            readWriteResult += ((SerialPort)sender).ReadExisting();
            if (readWriteResult.IndexOf('!') > 0)
            {
                readWriteResult = readWriteResult.Substring(0, readWriteResult.IndexOf('!') + 1);
                ((SerialPort)sender).Close();
                readFinished = true;
            }
        }

        private void sp_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
        {
            MessageBox.Show(readWriteResult);
            readFinished = true;
            errorOccured = true;
            readWriteResult = e.EventType.ToString() + "\r\n" + e.ToString();
            ((SerialPort)sender).Close();
        }


private void readDataSpecialBaud(SerialPort serialPort)
        {
            try
            {
                string lastReadWriteResult = "";
                int maximalAllowedTimeout = 5000;
                readFinished = false;
                errorOccured = false;
                progressBar.Value = 0;
                readWriteResult = "";
                int bufferSizeBefore = serialPort.ReadBufferSize;
                int receivedBytesThresholdBefore = serialPort.ReceivedBytesThreshold;
                serialPort.ReadBufferSize = 1;
                serialPort.ReceivedBytesThreshold = 1;
                serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
                serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(sp_ErrorReceived);
                
                serialPort.Open();
                serialPort.Write("/?!\r\n"); //Start befehl
                lastReceivedTime = DateTime.Now;
                 
                while (!errorOccured && string.IsNullOrEmpty(readWriteResult))
                {
                    if (lastReceivedTime.AddMilliseconds(maximalAllowedTimeout) < DateTime.Now)
                    {
                        errorOccured = true;
                        MessageBox.Show("Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?");
                        readWriteResult = "Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?";
                        break;
                    }
                }
                if (!errorOccured)
                {
                    string to4800 = 0X06 + "040\r\n"; //Befehl zum umschalten auf 4800
                    serialPort.Write(to4800);
                    serialPort.Close();
                    serialPort.BaudRate = 4800;
                    serialPort.ReadBufferSize = bufferSizeBefore;
                    serialPort.ReceivedBytesThreshold = receivedBytesThresholdBefore;
                    Thread.Sleep(1000);
                    serialPort.Open();
                    if (serialPort.IsOpen)
                    {
                        MessageBox.Show("Open :-)");
                    }
                    lastReceivedTime = DateTime.Now;
                    while (!readFinished && !errorOccured)
                    {
                        if (lastReceivedTime.AddMilliseconds(maximalAllowedTimeout) < DateTime.Now)
                        {
                            MessageBox.Show(readWriteResult);
                            errorOccured = true;
                            MessageBox.Show("Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?");
                            readWriteResult = "Error, Aktion abgebrochen: Mehr als " + maximalAllowedTimeout + " Millisekunden keine Antwort!\r\nIst der Kopf am Zähler angeschlossen?";
                            break;
                        }
                        if (!string.IsNullOrEmpty(readWriteResult) && readWriteResult != lastReadWriteResult)
                        {
                            lastReadWriteResult = readWriteResult;
                            if (progressBar.Value + 1 < progressBar.Maximum)
                            {
                                progressBar.Value++;
                            }
                            else
                            {
                                progressBar.Value = 0;
                            }
                        }
                    }

                    progressBar.Value = progressBar.Maximum - 1;
                    if (serialPort != null && serialPort.IsOpen)
                    {
                        serialPort.Close();
                    }
                    if (!errorOccured)
                    {
                        MessageBox.Show("Lesen der Daten korrekt beendet");
                        string folderName = ConfigurationManager.Instance.ZaehlerDatenFilePath;
                        string filename = getFileName(ref folderName, lastReadWriteResult);
                        saveFile(folderName, filename, readWriteResult);
                    }
                }
            }
            catch (Exception ex)
            {
                errorOccured = true;
                if (serialPort.IsOpen)
                {
                    serialPort.Close();
                }
                readWriteResult = "Error: \r\n" + ex.StackTrace;
                MessageBox.Show("Error, Aktion abgebrochen");
            }
        }

Ich hoffe du verstehst was ich bezwecken möchte..

18.12.2007 - 15:27 Uhr

Ich brings nicht hin. Wenn ich den Port schliesse und die Baudrate auf die selbe setze die schon drin steht und es wieder öffne ist es kein Problem. Aber wenn cih sie ändere bekomme ich im SerialErrorReceivedEventHandler eine Meldung:

e.e.EventType = RXParity
e.ToString() = System.IO.Ports.SerialErrorReceived EventArgs

?? X(

18.12.2007 - 14:39 Uhr

Habe mir gedacht dass ich das Gerät anspreche, ein serialPort.ReadChar einstreue und anschliessend umschalte.. Aber du weisst ja wer denkt.

Früher in C++ habe ich es ebenfalls so gemacht und nach dem char lesen ein SetCommState aufgerufen.. Aber was verdammt macht das SetCommState..

Werde mal versuchen den Port zu schliessen und neu zu öffnen und dabei hoffe ich dass das Gerät nicht in den "timeouthammer" läuft 😉

Wenn du ne Idee hast -> Her damit

18.12.2007 - 14:23 Uhr

Jep habe ich erst auch gedacht.. Scheint aber nicht wirklich zu funzen. Und den Umweg wie hier http://www.codeproject.com/KB/dotnet/DotNetComPorts.aspx beschrieben wird ja wohl mit .net 20. nicht mehr nötig sein?!

Bin ratlos

18.12.2007 - 14:08 Uhr

Hallo Leute

ich hoffe ich bin hier richtig.

Ich bin dabei ein externes Gerät über RS232 anzusprechen. Dieses Gerät kommuniziert standartmässig mit 300 BPs. Es gibt aber einige Ausnahmne, die nach dem erstmaligen ansprechen die Baudrate per Befehl ändern können. Und da stosse ich an. Soweit ich gelesen habe und auch selber scho programmiert habe gab es früher (allerdings noch in C++) eine Methode Namens SetCommState.

Meine Lösung für die 300 Baud basiert aus der Klasse SerialPort die neu ist für .net 2.0. Gibt es eine neue Möglichkeit den COM-Port zur Laufzeit umzustellen?

Wäre dankbar für jede Antwort!

Grüsse

Thomä

14.11.2007 - 11:07 Uhr

Original von FZelle
Schonmal Try/Cath in main um das Run versucht?

Nein, wieso auch, ich will ja erzwingen, dass im Falle einer nicht behandelten Exception der WindowsabortDialog erscheint.. Dies war aber nicht der Fall

14.11.2007 - 11:04 Uhr

Hei Leute danke für eure "grünen" Beiträge 👍, ich hatte und habe ja auch meine Sorgen und Bedenken!

Ob ihr glaubt oder nicht, der Fehler scheint nur unter ganz komischen Umständen aufzutreten. -> Wenn der Drucker zu warm druckt er Anfangs nicht mehr korrekt bevor das Programm abstürzt. Es ist mir fast peinlich dies hier zu erwähnen, aber ich habe keine andere Idee.

13.11.2007 - 15:33 Uhr

Ich habs mal versucht, konnte aber den Fehler bisher noch nicht reproduzieren. Allerdings habe ich den Printertreiber gewechselt. Statt eine Postscript Version verwende ich jetzt eine PCL Version. Damit ist der Fehler bisher nicht wieder aufgetreten. Da jeder Test über 1000 Blätter verschwendet möchte ich euch fragen ob jemand irgendetwas mit diesem Phänomen anfangen kann?? Ich weiss dass für grosse Druckmengen welche aus einem Client gestartet werden eine PCL von Vorteil ist, weil er die Daten bereits für den Drucker aufbereitet und dies nicht der Drucker selber managen muss. Aber woher kommt bloss der Programmabsturz?

13.11.2007 - 11:33 Uhr

Original von Khalid
Und im Debugger funktioniert es reibungslos?

Ja leider !

Original von Khalid
Hast du einmal eine Release und einmal eine Debug Version? Wenn ja, gibt es da unterschiede (Code durch Präprozessor)?

Nein, nicht das ich wüsste.

Ich werde die von dir erwähnten Möglichkeiten testen und das Resultat hier posten!

Danke schon mal

13.11.2007 - 11:13 Uhr

Hallo Leute

ich bin ratlos! Seit einiger Zeit entwickle ich mit .Net und C# aber dies ist mir noch nie passiert.

Ich drucke in meiner Applikation x-100 Dokumente. Neuerdings verabschiedet sich das Programm ohne eine Fehlermeldung. Die Windows Logs sind ebenfalls leer und ich kann mir nicht erklären wie es dazu kommen kann.

Als Sicherheit habe ich den FormClosing Eventhandler implementiert und mache darin eine Abfrage ob wirklich beendet werden soll. Auch diese Meldung erscheint nicht.

Von der Art her ist es zu Vergleichen mit dem Beenden eines Prozesses im TaskManager! Nur ist dies nicht der Fall.

Hat jemand eine Idee oder einen guten Link zu diesem Thema?

Ah was ich noch vergessen habe, wenn ich den selben Vorgang mit dem aus der Entwicklungsumgebung gestarteten Programm versuche läuft es problemlos. Ich habe das Ganze auf 2 Maschinen getestet mit dem selben Resultat!

Danke schon mal im Voraus

12.11.2007 - 12:48 Uhr

Hallo herbivore

hat etwas länger gadauert bis ich es testen konnte. Sorry für die Nachfrage nach dem Code, war gerade etwas zu faul wenn ich ehrlich bin 😉

Ich habe es jetzt ebenfalls getestet und bin zum Schluss gekommen, das wir beide recht haben. Der Unterschied wird durch den Errorblinkstyle erwirkt. Ist er auf AlwaysBlink gesetzt ist er ständig ersichtlich, bei BlinkIfDifferentError oder NeverBlink jedoch nur für eine gewisse Zeit. Default ist er auf BlinkIfDifferentError...

Danke für die prompte Mithilfe, werde mal alles umstellen!

Grüsse und bis zum nächsten mal

Thomä

06.11.2007 - 16:43 Uhr

Hast du mir kurz das Beispiel, kann mir nicht erklären wieso das bei mir nicht läuft.

06.11.2007 - 14:13 Uhr

Original von tomtom62
Der Text erscheint immer wieder
Thomas

Hast du das auch mal getestet? Wenn ich mit dem Cursor auf dem Errorprovider bleibe bis der Tooltiptext mit dem Fehler verschwindet schaffe ich es anschliessend nicht dass er wieder auftaucht. War auch verwundert, aber ich habe dies gerade vorhin nochmals in 2 verschiedenen UserControls getestet. Bei normalen Tooltip von Textboxen funktioniert es prima, nicht aber beim Errorprovider.