Laden...
B
Bastor myCSharp.de - Member
Azubi FA/AE Voerde Dabei seit 05.10.2007 62 Beiträge
Benutzerbeschreibung

Forenbeiträge von Bastor Ingesamt 62 Beiträge

16.06.2010 - 15:54 Uhr

Hallo Rainbird,

ich habe versucht meine Solution soweit zu ordnen und entsprechend deinen Vorschlägen zu modelieren - habe mich aber auch durch deinen MSDN Link gelesen.

Hab jetzt ein, zwei Zusammenhänge mehr in deiner Applikation verstanden 😃

Ich verstehe aber noch nicht ganz den Nutzen einer Interface Klasse?
Soweit ich das verstanden habe, wird diese als Proxy Stellvertreter Objekt der Remoting Instanz genutzt. Aber wozu dient das ganze? Wieso nicht direkt die Manager Klasse, statt dem Interface ?

Mein Appserver sieht jetzt folgendermaßen aus:


    public partial class Appserver : Form
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Appserver());
        }

        public Appserver()
        {
            InitializeComponent();
            this.list_Hist.Items.Add(DateTime.Now.ToShortTimeString() + " " + "Initialisiere ...");
        }

        private void ListWellKnownServiceTypes()
        {
            try
            {
                foreach (WellKnownServiceTypeEntry entry in RemotingConfiguration.GetRegisteredWellKnownServiceTypes())
                {
                    this.list_Hist.Items.Add(DateTime.Now.ToShortTimeString() + " " + entry.TypeName + " is available at " + entry.ObjectUri);
                }
            }
            catch (Exception ex)
            {
                string txt = "Eventuell liegt die Konfigurationsdatei in einem falschen Format vor." + Environment.NewLine +
                     "Genaue Fehler Informationen:" + Environment.NewLine + Environment.NewLine +
                "  Nachricht: " + ex.Message + Environment.NewLine +
                "  Quelle: " + ex.Source + Environment.NewLine + Environment.NewLine +
                "  Stack Trace:" + Environment.NewLine +
                ex.StackTrace;
                MessageBox.Show(txt, "Generic Exception", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }

        private void Appserver_Load(object sender, EventArgs e)
        {
            // Daten über die ausführende Assembly abrufen
            Assembly currentAssembly = Assembly.GetExecutingAssembly();


            try
            {
                this.list_Hist.Items.Add(DateTime.Now.ToShortTimeString() + " " + "Try to load Remoting Configuration File ...");

                // Pfad zur Konfigurationsdatei erzeugen
                string configFile = currentAssembly.Location + ".config";
                if (File.Exists(configFile))
                {
                    // Remoting-Infrastruktur konfigurieren
                    RemotingConfiguration.Configure(configFile, true);
                    this.list_Hist.Items.Add(DateTime.Now.ToShortTimeString() + " " + "Remoting Configuration loading complete.");
                }



                this.list_Hist.Items.Add(DateTime.Now.ToShortTimeString() + " " + "Try to load Business Services ...");
                ListWellKnownServiceTypes();
            }
            catch (Exception ex)
            {
                // FileNotFound ?

                // Will catch any generic exception
                string txt;
                txt = "Konfiguration der App.config Datei fehlgeschlagen, oder es liegt ein falsches Format vor." + Environment.NewLine +
                "Stellen Sie sicher das die App.config Datei im selben Verzeichnis wie die Anwendung liegt " +
                " und die Datei im richtigen Format vorliegt." + Environment.NewLine +
                "Nutzen Sie das Hilfe Menü, About um herauszufinden wo die exe Datei liegt." + Environment.NewLine + Environment.NewLine +
                "Genaue Fehler Informationen:" + Environment.NewLine + Environment.NewLine +
                "  Nachricht: " + ex.Message + Environment.NewLine +
                "  Quelle: " + ex.Source + Environment.NewLine + Environment.NewLine +
                "  Stack Trace:" + Environment.NewLine +
                ex.StackTrace;
                MessageBox.Show(txt, "Generic Exception", MessageBoxButtons.OK, MessageBoxIcon.Stop);

                this.list_Hist.Items.Add(DateTime.Now.ToShortTimeString() + " " + "Remoting Configuration File loading failed.");
            }
        }

    }

Die App.config sieht folgendermaßen aus:


<configuration>
<system.runtime.remoting>
	<application>
		<service>
			<wellknown
				mode="Singleton"
				type="CTI_Integration.Extension.Services.CallManager, CTI_Integration.Extension.Services"
				objectUri="CTI_Integration.Extension.Contracts.ICallManager"
		/>
		</service>
		<channels>
			<channel ref="tcp" port="9090">
				<serverProviders>
					<formatter ref="binary"/>
				</serverProviders>
			</channel>
		</channels>
	</application>
</system.runtime.remoting>
</configuration>

Ich habe zusätzlich noch eine AppServer.API (wie du) - welche allerdings nur das Call.cs Klassen Objekt beherbergt (was ich momentan etwas überflüssig finde) - du verwendest die API um Server Funktionen zu integrieren und anzusprechen, allerdings soll mein AppServer lediglich die Call Klassen Objekte verwalten.

Macht eine AppServer API bei mir sinn?

Meine Call Klasse sieht wie folgt aus:


using System;
using System.Data;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Xml.Serialization;

namespace CTI_Integration.AppServer.API
{
    /// <summary>
    /// Beschreibt ein Call Object auf dem Application Server
    /// </summary>
    [Serializable]
    [XmlRoot(ElementName="Call")]
    public class Call
    {
        #region Deklarationen

        // Universal Call ID 1
        [XmlElement(ElementName = "UCID_1", IsNullable = false)]
        string _ucid_1 = string.Empty;
        
        bla bla bla ... 
   
        #endregion

        #region Konstruktor

        /// <summary>
        /// Konstruktor
        /// </summary>
        public Call()
        {
            // Default Konstruktor
        }
      
        Bla bla bla

        #endregion

        #region Eigenschaften

        /// <summary>
        /// Gibt die Universal Call ID zurück oder setzt sie  
        /// </summary>
        public string UCID_1
        {
            get { return _ucid_1; }
            set { _ucid_1 = value; }
        }

        Bla bla bla ...

        #endregion

    }
}



Meine Solution sieht wie folgt aus:

AppServer (Referenziert Appserver.api)
-> Appserver.cs // WinForms
-> App.config // Remoting Config File

AppServer.API (Referenziert nix)
-> Call.cs [Serializable]


EXTENSION

Contracts (Referenziert die Appserver.api)
-> ICallManager (Kein MBR Objekt o.ä.)
IcallManager hat als Rückgabewerte u.a. CALL Objekte , diese zeigen auf Appserver.api.Call

Services (Referenziert Appserver.api / Contracts )
-> CallManager MBR Objekt
CallManager arbeitet eben auch mit Call Objekten, welche auf Appserver.api.Call zeigen

WindowsGUI (Refenziert Appserver.api / Contracts)
-> Habe hier ein Usercontrol liegen, über welches z.b. ein Call Objekt geupdated werden muss


Windows CLIENT

Client (Referenziert die Appserver.api / Contract )
-> Programm selbst ... (sehr groß, besteht auch aus mehreren Projekten)
-> App.config

Mir ist nicht klar, wie ich auf Client Seite das richtige (CallManager) Objekt als Singleton aktivieren soll oder muss ?!

Vorher habe ich es so gemacht:


        try
        {
            object[] args = null;
            Call = (CTI_Integration.Call)(Activator.CreateInstance(typeof(CTI_Integration.Call), args));
            //Call.newClient();
            objNotCreated = (Call == null);

        }
        catch (RemotingException exp)
        { .......}

Das hat ja soweit geklappt, allerdings hatte ich auch die Verwaltung und das zu verwaltende Objekt in einer Klasse gebastelt, sodass das Objekt sich selbst in einer Liste verwaltet hatte , was sehr doof war 😛

Wenn ich jetzt aus dem Windows CLIENT den CallManager aufrufen möchte (liegt ja dann bei CTI_Integration.Extension.Services.CallManager) heisst es, es kann nicht aufgerufen werden, da ich keinen Zugriff darauf bekomme.


Der AppServer lädt also die CallManager Klasse als Singleton Objekt als WellknownType aus einer Konfigurationsdatei - das klappt soweit. (CallManager liegt NICHT beim Server, sondern in der Service Assembly, ich verweise nur in der App.Config auf die Manager Klasse).

Nur erschließt sich mir noch nicht wie ich Clientseitig das richtige Klassenobjekt jetzt WIE instanziere und dann ein entsprechendes Call Objekt rüberschiebe. (Call.cs Klasse , welche EIN Call Objekt beschreibt liegt momentan in der Appserver.API )

Habe wie gesagt den Developers Guide gelesen, aber da wir ja schon weiter sind als es in dem Guide beschrieben oder demonstriert wird , sehe ich vllt. gerade die Zusammenhänge nicht ganz die ich mit der Struktur erreicht haben soll.

Kurz, ich bin verwirrt - würde mich da über Hilfe freuen.

Vielen Dank und Gruß

Sebastian

14.06.2010 - 09:53 Uhr

Hallo Rainbird,

Ich hätte da noch Fragen an dich - ich habe mir deine Beispiel n-Tier Anwendung heruntergeladen und angesehen !

Ich würde gerne, wenn möglich, meine Anwendung ähnlich aufbauen wie du es gemacht hast, ich halte da sehr viel von Strukturierter Qualitativer Programmierung und sehe da einen echten Mehrwert für die künftige änderungen.

Ich gehe davon aus, du meintest das mit deinem Vorschlag für mich genau so wie du in deiner n-Tier Applikation vorgeführt hast? (PN)

Wo kann ich diese begrifflichkeiten wie "Contract" Klasse und alles eigentlich nachlesen , also wo hast du dir das Wissen hergeholt für die Architektur ?

Ich verstehe deine Art Umsetzung leider noch nicht ganz, da ich wie erwähnt ja versuche das ganze irgendwie für mich umzusetzen, sehe ich noch nicht so ganz was da am nähesten für mein Beispiel ist.
Mein AppServer fürs Remoting und die Call Assemblys sind ja nur der kleine Teil der an eine größere CTI Anwendung dran flanscht.

Deine Module sind ja nicht ganz eigenständige Programme, da sie in dem Client geladen werden und aber auch auf die Server API zugreifen.

Wäre eine Umsetzung wie du sie mir vorgeschlagen hast dann wie folgt:

AppServer
-> Server programm GUI oder Konsole
-> CallManager Klasse (MarshalbyRefObj - beinhaltet die genaue Geschäftslogik?)

AppServer API
-> ICallManager (kein MarshalbyRefObj)
-> Call Klasse [Serializeable]


Jetzt kommt für mich das schwierige ... du hast hier ne Schicht mit den Contracts und Services...

Wie würde ich das für mich umsetzen ?!


Windows Client (CTI Anwendung)
-> Windows GUI
-> Referenziert die AppServer API

++Ich habe mich bei deinem Tipp und meiner Umsetzung sehr an deine "LockingService" und "ILockingService", sowie die Klasse "LockInfo" gehalten, da diese meiner Sache am nächsten war. ++

Ich krieg das "zusammen"bauen noch nicht ganz in den Kopf, ich glaube ich denk da noch nicht abstrakt genug ?!

Ich müsste CallManager.cs (in meinem fall) also als Singletone Objekt initialisieren ?
Sollte die CallManager Klasse in ein eigenes Projekt zur Assembly gebuilded werden, so dass ich diese im AppServer refenziere oder liegt die CallManager.cs im AppServer schon richtig dort?

Viele Grüße

Sebastian

09.03.2010 - 16:46 Uhr

Hat sich erledigt - ich habe die Stapelung in der Klasse selbst über Methoden Implementiert.
Ebenso die Suche.

Lässt sich alles abfragen und speichern 😉

Danke für die Hilfe.

mfg

08.03.2010 - 15:27 Uhr

Ich werde parralel mal mit Dictionary programmieren.

Aber am wichtigsten ist momentan:

Nun habe ich über mein Client eine Instanz dieser Klasse angelegt und speichere Daten , also fülle die Propertys der Klasse.
Ich kann beim verbinden mit mehreren Clients auch die Propertys ändern und abrufen - die Clients werden alle aus einem Pool bedient - soweit super !

Allerdings frag ich mich, wie ich das nun mit der List<T> Collection oder ähnlichem realisiere ?

Ich leg ja eine Instanz meiner Klasse auf der Host Anwendung an und habe dort die Propertys zur Verfügung.
Im Grunde muss ich aber mehrere dieser Klassenobjekte in einer Collection halten zum abrufen ?!

Ich hab ein wenig das Gefühl das System nicht verstanden zu haben , oder ich hab mich einfach "verlaufen".

Ich lege ja eine Objektinstanz meiner Call Klasse am Host an. Auf diese Instanz greifen alle anderen Clients zu.

Wie übergeb ich der Instanz dann ein Objekt dieser Klasse ?

Hier mal der Code meiner Klasse - von welcher ich auch eine Instanz am Host anlege:


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Xml;
using System.Xml.Serialization;
using System.Data.Sql;
using System.Collections.Generic;


namespace Remoting
{
    /// <summary>
    /// Class Call Library
    /// </summary>

    public class Call : MarshalByRefObject, IDisposable
    {
        public Call()
        {
            // TODO: Add constructor logic here
        }

        private Dictionary<string,Call> _CallDictionary = new Dictionary<string,Call>();
        private List<Call> _CallCollection = new List<Call>();
        private string _UCID_1;
        private string _UCID_2;
        private UInt32 _CallID_1;
        private UInt32 _CallID_2;
        private string _FIN;
        private string _ANI;
        private XmlDocument _XMLDocument;
        private int ClientsConnected;
		private readonly DateTime CreationTime = DateTime.Now;
        private bool _RONA = false;

        public void newClient(string UCID1, UInt32 CallID1)
        {
            // Count the Connected Clients
            ClientsConnected += 1;
            
            // generate default values
            this.CallID_1 = CallID1;
            this.UCID_1 = UCID1;
        }

        void IDisposable.Dispose()
		{	
			// Reduce the Count of Connected Clients			
		    ClientsConnected -= 1;
		}

        public string GetCallInfo()
        {
            return string.Format("Customer UCID is {0} - Rona State is {1}", this.UCID_1, this.RONA);
        }

        public string UpdateCallInfo(string newUCID, UInt32 newCallID, bool newRonaState)
        {
            // Update local properties
            this.UCID_1 = newUCID;
            this.CallID_1 = newCallID;
            this.RONA = newRonaState;

            // update a database here etc

            return string.Format("Customer UCID is {0} - Rona State is {1}", this.UCID_1, this.RONA);
        }

        public void UpdateNoticeInfo(XmlDocument xmldoc)
        {
            this.XMLDocument = xmldoc;
        }

        public void AddCalltoDictionary(string UCID, Call CallObjekt)
        {
            _CallDictionary.Add(UCID, CallObjekt);
        }

        public void AddCalltoCollection(Call CallObject)
        {
            _CallCollection.Add(CallObject);
        }

        public void FindCallinCollection()
        {
            // Durchsuche Collection nach Call Objekt mit UCID X
            if (_CallCollection.Count > 0)
            {
                // go 
            }
        }

        public bool RONA
        {
            get { return _RONA; }
            set { _RONA = value; }
        }

        public string ANI
        {
            get { return _ANI; }
            set { _ANI = value; } 
        }

        public string FIN
        {
            get { return _FIN; }
            set { _FIN = value; }
        }

        public UInt32 CallID_1
        {
            get { return _CallID_1; }
            set { if( value > 0 )
                    { _CallID_1 = value; }
                  else
                    { _CallID_1 = 0; }
                }
        }

        public UInt32 CallID_2
        {
            get { return _CallID_2; }
            set { if( value > 0 )
                    { _CallID_2 = value; }
                  else
                    { _CallID_2 = 0; }
                }
        }

        public string UCID_1
        {
            get { return _UCID_1; }
            set { _UCID_1 = value; }
        }

        public string UCID_2
        {
            get { return _UCID_2; }
            set { _UCID_2 = value; }
        }

        public XmlDocument XMLDocument
        {
            get { return _XMLDocument; }
            set { _XMLDocument = value; }
        }

        public DateTime DebugCreationTime
        {
            get { return CreationTime; }
        }

        public string DebugHostName
        {
            get { return System.Environment.MachineName; }
        }

        public int Connected
        {
            get { return ClientsConnected; }
        }

    }// Class end
}// Namespace end

Abgesehn davon das ich das mit dem XML Document wohl knicken kann - da nicht Serialisierbar ?
Wie kann ich das lösen?

Erstellt wird die Instanz auf dem Host wie folgt:


.
.
.
    public static Call CallObject;
.
.
.
    private void cmdCreate_Click(object sender, System.EventArgs e)
    {
        string txt;
        try
        {
            bool objNotCreated = false;

            object[] args = null;
            CallObject = (Remoting.Call)(Activator.CreateInstance(typeof(Remoting.Call), args));
            CallObject.newClient(lblDefUCIDValue.Text, Convert.ToUInt32(lblDefCallIDValue.Text));

        }
        catch (RemotingException exp)
        {
            txt = "Verbindung zum Remote Objekt nicht möglich." + Environment.NewLine + Environment.NewLine +
                "Genaue Fehlerinformationen:" + Environment.NewLine + Environment.NewLine +
                "  Nachricht: " + exp.Message + Environment.NewLine +
                "  Quelle: " + exp.Source + Environment.NewLine + Environment.NewLine +
                "  Fehler Trace:" + Environment.NewLine +
                exp.StackTrace;
            MessageBox.Show(txt, "Remoting Exception", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
        catch (System.Net.Sockets.SocketException exp)
        {
            txt = "Verbindung zum Remote Objekt nicht möglich." + Environment.NewLine +
                "Kann es sein das der Server nicht aktiviert ist?" + Environment.NewLine + Environment.NewLine +
                "Genaue Fehlerinformationen:" + Environment.NewLine + Environment.NewLine +
                "  Nachricht: " + exp.Message + Environment.NewLine +
                "  Quelle: " + exp.Source + Environment.NewLine +
                "  Error Code: " + exp.ErrorCode.ToString() + Environment.NewLine +
                "  Native Error Code: " + exp.NativeErrorCode.ToString() + Environment.NewLine + Environment.NewLine +
                "  Fehler Trace:" + Environment.NewLine +
                exp.StackTrace;
            MessageBox.Show(txt, "Socket Exception", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
        catch (Exception exp)
        {
            txt = "Verbindung zum Remote Objekt nicht möglich." + Environment.NewLine + Environment.NewLine +
            "Genaue Fehlerinformationen:" + Environment.NewLine + Environment.NewLine +
            "  Nachricht: " + exp.Message + Environment.NewLine +
            "  Quelle: " + exp.Source + Environment.NewLine + Environment.NewLine +
            "  Fehler Trace:" + Environment.NewLine +
            exp.StackTrace;
            MessageBox.Show(txt, "Generic Exception", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
    }

08.03.2010 - 09:22 Uhr

Keiner Hilfe anzubieten?

04.03.2010 - 11:19 Uhr

Soooo,

@jaensen
Mir steht hier schon ne SQL2005 oder 2008 Enterprise Datenbank zur Verfügung 😉
Geht wirklich darum das wir den möglichst schnellsten weg gehen wollen.
Dictionary hatte ich auch schon im Kopf, aber Dictionarys halten doch Key/Value Pairs vor oder? Ich habe aber eine Klasse in der zwar eine eindeutige Property wäre die ich als Key verwenden kann, aber hat Dictionary die Möglichkeit einer Key/Class Kombination?

Zum Thema Remoting @Rainbird:

ich habe das ganze mit dem Remoting mal gelesen und mich auch an die Umsetzung gemacht.

Ich habe eine Host Anwendung und eine Client Anwendung die sich beide die gleiche Library teilen.

In der Library habe ich dann meine Klasse , die als Singleton aufruf ausgelegt ist.
MarshalByRefObject

Nun habe ich über mein Client eine Instanz dieser Klasse angelegt und speichere Daten , also fülle die Propertys der Klasse.
Ich kann beim verbinden mit mehreren Clients auch die Propertys ändern und abrufen - die Clients werden alle aus einem Pool bedient - soweit super !

Allerdings frag ich mich, wie ich das nun mit der List<T> Collection oder ähnlichem realisiere ?

Ich leg ja eine Instanz meiner Klasse auf der Host Anwendung an und habe dort die Propertys zur Verfügung.
Im Grunde muss ich aber mehrere dieser Klassenobjekte in einer Collection halten zum abrufen ?!

Hat da jemand nen Rat ?

28.02.2010 - 22:43 Uhr

Gott , du hast ja so recht. Statuslosigkeit wird einem dabei erst bewusst - danke.

Unter dem Gesichtspunkt sieht die Umsetzung mit einem Webservice schon anders aus - was ich mich frage , sollte das Cachen nicht trotzdem funktionieren?
Wenn jeder Client eine neue Instanz pro anfrage erzeugt, sollte der Cache doch im Kontext des Workerprocesses laufen?

Zum Projekt , ja - das ganze läuft nur von .NET zu .NET und kommuniziert über LAN/WAN.

Ich werd mir das Remoting ansehen, danke !

mfg

22.02.2010 - 10:57 Uhr

Folgendes Ziel:
Ich habe einen Webservice, der eigentlich als Schnittstelle dienen soll, in dem er Datensätze (Klassenobjekte) in einer Generischen Liste dieses Typs packt und im Speicher halten soll.

Ein Win32 Client soll eben bestimmte Daten die ein Klassenobjekt füllen übergeben , der Webservice hält es im Speicher und ein anderer Win32 Client soll anhand einer ID die im Speicher befindliche Liste nach einem bestimmten KlassenObjekt suchen können und es vom Webservice , falls vorhanden, erhalten.

Folgender Aktueller Stand:
Ich habe den Webservice erstellt , auf diesem liegt bereits eine Klasse, ebenfalls existiert eine generische Liste diesen Typs und eine Webmethode die eben die Attribute der Klasse füllt und sie zu der List<T> packt.

Beim zuweisen dieser Liste in den Cache (System.Web.Caching), zumindest beim debuggen im Webservice, werden die 10 erstellten Klassenobjekte (in einer schleife erstellt) in die Liste gepackt und dem Cache hinzugefügt.
[Dieses funktioniert nur beim debuggen auf dem Webservice - eine andere Webmethode erstellt 10 objekte per schleife]

Wenn ich nun über einen Win32 auf diese Webmethode zugreife und die Methode aufrufe um in einer Schleife ebenfalls 10(oder 1000) Objekte zu erstellen , läuft diese ohne Fehler.

Allerdings möchte ich die erstellte Liste anschließend abfragen und in einer Foreach Schleife ausgeben - die Liste enthält aber nur 1 Objekt. Und zwar das zuletzt erstellte Objekt.

Ich muss aber alle Objekte Cachen.

Frage:
Wie sieht eine Suche als Webmethode innerhalb des List<T> Elements nach einer ID - IN EINEM KLASSENOBJEKT! - aus ?
Und wie bekomme ich dann das gefundene Klassenobjekt übergeben - ich denke über den Index?

Wieso wird jeweils das letzte Objekt nur gecached - wird nicht jeweils beim Aufruf der Methode einfach ein Objekt hinzugefügt ?


Code:

Klassenobjekt

    [Serializable]
    public class Call
    {
        public Call()
        {
            // TODO: Add constructor logic here
        }

        //public List<Call> CallCollection = new List<Call>();
        private string _UCID_1;
        private string _UCID_2;
        private UInt32 _CallID_1;
        private UInt32 _CallID_2;
        private string _FIN;
        private string _ANI;
        private XmlDocument _XMLDocument;

        public void AddCalltoCollection(Call CallObject)
        {
            CallCollection.Add(CallObject);
        }

        public string ANI
        {   get { return _ANI; }
            set { _ANI = value; }
        }
        public string FIN
        {   get { return _FIN; }
            set { _FIN = value; }
        }
        public UInt32 CallID_1
        {   get { return _CallID_1; }
            set { _CallID_1 = value; }
        }
        public UInt32 CallID_2
        {   get { return _CallID_2; }
            set { _CallID_2 = value; }
        }
        public string UCID_1
        {   get { return _UCID_1; }
            set { _UCID_1 = value; }
        }
        public string UCID_2
        {   get { return _UCID_2; }
            set { _UCID_2 = value; }
        }
        public XmlDocument XMLDocument
        {   get { return _XMLDocument; }
            set { _XMLDocument = value; }
        }
    }  

Webservice inkl. Methode zur Zuweisung der Klassenattribute und übergabe an die List<T> und Cachen.

public class CTIAPIService : System.Web.Services.WebService
{
    public CTIAPIService ()
    {
        myCache = Context.Cache;
    }
    public enum FaultCode
    {
        Client = 0,
        Server = 1
    }

    static Cache myCache = null;
    public List<Call> CallCollection = new List<Call>();

    [WebMethod]
    public void GenerateCallObjects(UInt32 callid, string ucid1)
    {
        try
        {
            Call _call = new Call();
            _call.CallID_1 = callid;
            _call.UCID_1 = ucid1;

            CallCollection.Add(_call);

            // Auskommentieren wenn auf Service Ebene getestet wird (sonst doppelt Cached)
            myCache.Insert("myKey", CallCollection, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10));
        }
        catch (Exception ex)
        {
            // Eigene Exception Methode
            throw RaiseException("GetException", "CTIUserInfoAPI", ex.Message, "1100", ex.Source, FaultCode.Server);
        }
    }  

Der Aufruf der Methode sieht dann zu Testzwecken wie folgt aus:

        string UCID1 = "0000338585";
        UInt32 CallID = 6000235;
        CTIAPIService myCTIAPIService = new CTIAPIService();

        for (int i = 0; i < 10; i++)
        {
            myCTIAPIService.GenerateCallObjects(CallID, UCID1 + i.ToString());
        }  

Soviel zum Code. Ich denke - was das Caching Problem betrifft, ist der gepostete Code der eigentlich relevante, da ich die vermutung habe das ich zum falschen Zeitpunkt den Cache fülle.

11.02.2010 - 09:06 Uhr

Weitere Anregungen? 😃

10.02.2010 - 14:14 Uhr

Vielleicht sollte ich noch erwähnen das .NET 2.0 zwingend ist, da der Client , dem ich die Bibliothek bereitstellen soll auf .NET 2.0 programmiert wurde.

10.02.2010 - 13:58 Uhr

Hallo zusammen,

mein projekt soll aus einer schnittstelle bestehen die Serverseitig zur verfügung gestellt werden soll und eine library für win32 clients die mit entsprechenden methoden auf diese schnittstelle zugreifen können sollen.

Die schnittstelle bekommt daten geliefert zu einem telefonanruf bei einer weiterverbindung des gespräches und soll diese dann schnellstmöglich einen anderen client eben die daten übergeben oder eben bereitstellen.

Realisieren wollte ich die Schnittstelle über einen Webservice.

Ich habe nun für die Daten selbst eine Klasse geschrieben und pack das ganze in eine Generic List von entsprechenden klassentyp etc.

Meint ihr das ein Webservice das richtige dafür ist ? Schnell genug scheint er jedenfalls , so dass wenn ich rund 10.000 Objekte mit daten über einen Client erzeuge nur wenige sekunden benötigt (ca. 12 sekunden).

Mein Problem ist , die Daten sollen / müssen im speicher gehalten werden , das werden ca. 10.000 bis 15.000 Datensätze pro tag sein , welche dann täglich bereinigt werden sollen.

Ich hab schon über Caching gelesen.
Wäre ich da mit folgenden auf den richtigen weg: System.Web.HttpContext.Current.Cache
Bzw:
System.Web.Caching.Cache

MFG

05.10.2009 - 15:29 Uhr

Sorry leute ,

ich idiot hab natürlich im leeren DataTable gesucht , auf welches ich nur nen Clone() ablege ...
...wer ins leere greift ann natürlich nur luft fangen 😃

mfg und sorry für das unnötige Thema 😕

05.10.2009 - 15:17 Uhr

verwendetes Datenbanksystem: MSSQL2005

Hallo,

ich habe ein GridView das ich aus einer DataTable befülle.

Nun möchte ich in diesem GridView nach bestimmten einträgen suchen. Da kam mir die DataTable.Select() Geschichte sehr gelegen.

Als ich das ganze noch über DataSets und den Zugriff auf die entsprechenenden Tabellen gelöst habe , lief alles wunderbar.

Code:


        private void GetKennzahl()
        {
            DataTable dt;
            DataRow[] dr;
            
            DataSet DS = new DataSet();
            string filterexpression, SortOrder, Filterkriterium;

            // Wonach soll gesucht gesucht werden
            Filterkriterium = txtKennzahlSearch.Text;

            // Angezeigte Sortierreihenfolge - Aufsteigend
            SortOrder = "Kennzahl ASC";                 

            filterexpression = String.Format("Kennzahl like '%{0}%'",Filterkriterium);

            // Zugriff auf TableAdapter - Füllen der DataTable mit allen Kennzahlen
            dt = KennzahlTA.GetAllDataByKennzahl();
            DS.Tables.Add(dt);
            dtresult = dt.Clone();

            // Select auf DataTable mit filterexpression
            dr = DS.Tables[0].Select(filterexpression, SortOrder);
            
            foreach (DataRow foundrow in dr)
            {
                dtresult.ImportRow(foundrow);
            }

            ViewState.Add("DTResult",dtresult);
            // Gridview an DataTable Result Binden
            GridView_Kennzahlen.DataSource = dtresult;
            GridView_Kennzahlen.DataBind();

        }

Das Funktioniert !

Wenn ich aber folgendes verwende:



....
....
......
Handlisten_DS.usp_KennzahlGVViewDataTable KennzahlDataTable = new Handlisten_DS.usp_KennzahlGVViewDataTable ();

Handlisten_DSTableAdapters.usp_KennzahlGVViewTableAdapter KennzahlTableAdapter = new  Handlisten_DSTableAdapters.usp_KennzahlGVViewTableAdapter ();

DataTable SearchResultTable = new DataTable ();
.
.
.
.
        private void SearchKennzahl ()
        {
            DataRow[] datarow;
            string filterexpression, SortOrder, Filterkriterium;

            Filterkriterium = txt_KennzahlSuche.Text;
            SortOrder = "Kennzahl ASC";

            filterexpression = String.Format ( "Kennzahl like '%{0}%'", Filterkriterium );

            KennzahlTableAdapter.Fill ( KennzahlDataTable );
            SearchResultTable = KennzahlDataTable.Clone ();

            datarow = SearchResultTable.Select ( filterexpression, SortOrder );

            foreach ( DataRow foundrow in datarow )
            {
                SearchResultTable.ImportRow ( foundrow );
            }
            ViewState.Add ( "KennzahlDataTableSearchResult", SearchResultTable );
            
            GridView_Kennzahlen.DataSource = SearchResultTable;
            GridView_Kennzahlen.DataBind ();
        }


Kann mir jemand nen Tipp geben was ich falsch mache?
Oder warum es auf diese Weise nicht klappt?

Beim Debuggen kommt auch kein Fehler - er findet halt nichts.

datarow ist beim debuggen übrigens vom Typ: Handlisten_DS.usp_KennzahlGVRow

Viele Grüße
Sebastian

24.09.2009 - 15:01 Uhr

Falls du über Visio das "Reverse Engineering" benutzen möchtest um eine DDL Datei zu bekommen die per Script direkt die MSSQL Datenbank aufbaut , solltest du noch die Foreign Keys in den Tabellen richtig setzen. (GruppenID in tbl.Schwimmer z.b.)

mfg

23.09.2009 - 11:15 Uhr

Hallo,

ich würde gerne AJAX Controls in meinem Projekt "nachrüsten".
Ich hatte mir dazu mal vor geraumer Zeit AJAX Extensions geladen für Version .Net Framework 1.0.61025.
Die Extensions sind leider nicht sehr umfangreich (Timer, Scriptmanager, Updatepanel).

Das Problem war das die Web.config nicht über alle Referenzen verfügte und ein nachträglich "reinfummeln" aus einem "Ajax enabled website project" hat keinen Erfolg gebracht.

Gibt es eine Möglichkeit die AJAX Controls nachzurüsten irgendwie? Wie passe ich die Web.config richtig an?
Problem hierbei ist, es muss für .Net Framework 2.0 funktionieren.

Für jegliche Tipps oder Links bin ich dankbar!

Viele Grüße
Sebastian

17.09.2009 - 14:32 Uhr

<asp:DropDownList ID="lst_KennzahlParentID" runat="server"
                              DataSourceID="usp_KennzahlParentSelect"                                                                                                                            DataTextField="Kennzahl"    
                              DataValueField="KennzahlID"
                              Width="250px"
                              AppendDataBoundItems="True" 
                              SelectedValue='<%# Bind("ParentID") %>'>
                                                                                 
<asp:ListItem Selected="True" [U][B]Value=""[/B][/U]>Kein Parent</asp:ListItem>
</asp:DropDownList>

Visual Studio hat dem ListItem Value im ASP Code keine beachtung geschenkt wenn nichts drin stand - das heißt es musste Manuell nachgetragen werden. Ich dachte das wäre schon getan , aber naja 😉

Sofern jetzt im Label davor: "" (also nichts) drin steht , wird automatisch der ListItem Eintrag gewählt mit dem Value="" ... kann ich mir die Manuelle Indexzuweisung sparen .. schön blöd von mir.

Problem gelöst.

17.09.2009 - 09:07 Uhr

Eigentlich müsste der Zugriff über meinen Code oben Funktionieren , ansonsten sicher über FindControl();

Aber:
Welches Event kann ich verwenden um der DroDownList einen Index zuzuweisen - denn das Problem ist ja , das ich bei jedem Event welches ich ausprobiert habe noch immer das Label gerendert ist und die DropDownList nicht angesprochen werden kann weil nicht gerendert , oder was auch immer.
Was noch nicht da ist, auf das kann ich auch nicht zugreifen.

Ich verzweifel gleich! Help! 😃

mfg

16.09.2009 - 14:53 Uhr

Hallo zusammen,

ich habe ein kleines Problem mit dem Gridview.
Ich habe einem Gridview mehrere Templatefields eingerichtet und unter anderem in einem Feld eine Dropdownlist angelegt, welche ich über eine Datasource mit Daten fülle.

Im normalfall wird im Gridview eine ID angezeigt - Label. Wenn ich nun eine Zeile editieren möchte soll zu der ID der entsprechende SelectedIndex in der Dropdownlist angezeigt werden.

Die ID die im Label steht hole ich mir ins ViewState sobald ich das GridView editiere:


        protected void GridView_Kennzahlen_RowEditing(object sender, GridViewEditEventArgs e)
        {
            .
            .
            .
            .

            // RowIndex der editierten Zeile
            GridViewRow row = GridView_Kennzahlen.Rows[e.NewEditIndex];

            ViewState["EditRowID"] = e.NewEditIndex.ToString();
            ViewState["EditParentID"] = ((Label)(row.Cells[3].Controls[1])).Text;       
 
            .
            .
            .
        }

Klappt ja alles Wunderbar.

Das Problem:

Da die Cell , in welcher sich das Label befindet, ein Template Field ist und im Edit Modus eine Dropdownlist darstellen soll möchte ich nun die ID , welche im Label stand der Dropdownliste als SelectedIndex zuweisen.

Dies geht aber nicht , da für mich zu jedem Zeitpunkt das GridView noch das Label darstellt.

Selbst in den Events der DropDownList selbst (Init , Preload etc) ist die Zelle die ich oben abfrage noch immer vom TYPE = Label.

Demzufolge suche ich eine Stelle an der ich eben folgendes Anwenden kann:


.
.
.
((DropDownList)(row.Cells[3].Controls[1])).SelectedIndex = Convert.ToInt32(ViewState["EditParentID"]);
.
.

Geht aber wie gesagt nicht , da es zu einem Fehler kommt:

Unable to cast object of type 'System.Web.UI.WebControls.Label' to type 'System.Web.UI.WebControls.DropDownList'.

... da das Feld immernoch als vom Type = Label bestehen bleibt.

Ich bin grausig im erklären Fehlerhafter Programmabschnitte , ich weiß - aber vielleicht hab ichs ja verständlich genug getan.
Falls es fragen gibt stellt sie mir bitte, sodass ich unklarheiten beseitigen kann - ich weiss nicht weiter !

mfg
Sebastian

17.02.2009 - 12:35 Uhr


            for (int i = 0; Listbox.Items.Count > i; i++)
            {
                if (Listbox.Items[i].Selected)
                {

                }
            }


In der Schleife eben das gewünschte erweitern - eventuell die selektierten Einträge in ein Array stecken oder so.

Weiss nicht ob "Sharp" sein Problem schon gelöst wurde?

mfg

06.01.2009 - 15:57 Uhr

Auf die Gefahr das ich was falsche schreibe , werf ich trotzdem mal ein Begriff in den Raum:

Serialisierung

[I]Sämtliche Daten, unabhängig vom Verwendungszweck, werden durch die Felder der Klassen beschrieben. Ein Anwender interessiert sich nicht für diese Details. Er arbeitet mit den Daten, manipuliert sie und erwartet ein fehlerfreies Laufzeitverhalten. Dazu zählt auch, dass nach dem Schließen und dem späteren Neustart des Programms exakt der Zustand wiederhergestellt wird, den ein Objekt vor dem Schließen hatte. Mit anderen Worten heißt das für Sie als Entwickler, alle Daten dauerhaft zu sichern, um sie später wieder wiederherstellen zu können.[/I]

Nachlagewerk: 🛈

Vielleicht ist es das was du suchst.

Viele Grüße

18.12.2008 - 11:57 Uhr

verwendetes Datenbanksystem: MS SQL2005

Hallo 😃

Ist es möglich eine Reihe (Spalte) von Werten einer Scalar Function zu übergeben?

Ich hab kein wirkliches Problem technischer seits , möchte die Abfrage aber übersichtlicher und vielleicht schlanker gestalten.

Folgendes Statement:


SELECT
	 [ServiceID]
	,[KennzahlID]
	,CONVERT(VARCHAR(8), [InsertDate], 112) AS Zeit_ID
	,dbo.fnc_Datum2Intervall(@InsertDate)
	,( 
		SELECT [IntervallId]
		FROM [Db].[dbo].[v_Intervall]
		WHERE 
		SUBSTRING(CONVERT(VARCHAR(10), [InsertDate], 108),1,CHARINDEX(':',CONVERT(VARCHAR(10), [InsertDate], 108),1)+2)
		>= [StartzeitBez] 
		AND 
		SUBSTRING(CONVERT(VARCHAR(10), [InsertDate], 108),1,CHARINDEX(':',CONVERT(VARCHAR(10), [InsertDate], 108),1)+2)
		< [EndzeitBez]
	 ) AS Intervall_ID
	,[Kennwert]
FROM
	[Db].[dbo].[table]
ORDER BY
	[Zeit_ID] ASC

"[InsertDate]" ist allerdings eine ganze Spalte von der ich das Datum zerschnipsel.

Folgende Scalar Function habe ich zu Testzwecken angelegt:


CREATE FUNCTION fnc_Datum2Intervall
(
	@InsertDate datetime
)
RETURNS VARCHAR(10)
AS
BEGIN
	DECLARE @RET VARCHAR(10)
	SET @RET = SUBSTRING(CONVERT(VARCHAR(10), @InsertDate, 108),1,CHARINDEX(':',CONVERT(VARCHAR(10), @InsertDate, 108),1)+2)
	RETURN @RET

END
GO

Problem sollte klar sein - @local_variable kann nur ein Datensatz übergeben werden. Ich möchte aber die komplette Spalte in einem Stück verarbeiten und an die Function schicken bzw. zurückbekommen.

Geht das überhaupt?
Ist sowas performanter?

mfg

02.12.2008 - 10:45 Uhr

Ich könnte dich knutschen jaensen 😉

Klappt wunderbar - lustigerweise war in einem Query Versuch gestern abend auf dem gleichen weg wie du - ach was solls ... DANKE !

Viele Grüße

01.12.2008 - 19:43 Uhr

Noch mal zur Sicherheit:
Du hast Parent-Child Beziehungen wobei Summe 1 und Summe 2 children von Gesamt sind.
Für deine Migration hast du die alten und neuen IDs der rows in eine Tabelle gepackt und möchtest nun den Rows die neue Parent_ID setzen?

Hallo Jaensen,

richtig zusammengefasst.
Die Parent-Child Beziehung besteht allerdings nur Theoretisch für Reportings.
Also keine Keys im Spiel auf der Tabelle.

Das Beispiel zeigt nur einen Ausschnitt - es wurden ein paar mehr alte Tabellen in diese neue Tabelle gepumpt. Dann soll die neue ParentID angepasst werden , anhand der alten ID / ParentID.

Ich bin leider nicht mehr auf der arbeit , sodass ein Test deines Codes auf Morgen früh fällt 😃

Auf welche Tabelle joinst du eigentlich. Die Tabellen aus denen die alten ID/ParentID's kommen existieren nur in einer anderen Datenbank.

Oder Joinst du auf die gleiche Tabelle?

// Grad nochmal gelesen , also auf die gleiche Tabelle joinen.

01.12.2008 - 18:24 Uhr

Tee hilft auch nimmer 😉
Probiers mal mit Kaffee... 😉

Habs noch nicht ganz geschnallt, aber probiers mal so:

  
UPDATE Test SET Parent_Id =   
      CASE WHEN CCI_ParentID is NULL  
      THEN  
         ID  
      ELSE  
         CCI_ID  
      END  
  

Bin leider nicht so der Kaffee Genießer 😉

Danke für eure Hilfsbereitschaft!

Wenn das ganze doch nur so Trivial zu lösen wäre 😃

Ich bin ein echt schlechter Erklärbär - deshalb versuche ich es nochmal.

Nach eurem Beispielen würde ich einfach die [ParentID] Spalte GLEICH der [CCI_ParentID] Spalte setzen.

Das funktioniert nicht - denn die [CCI_ID] ist != der [ID] Spalte.

Beispiel:

VORHER


ID   Kennzahl   ParentID   CCI_ID   CCI_ParentID
--------------------------------------------------------------
4    Summe A    NULL          6             8
5    Summe B    NULL          7             8
6    Gesamt     NULL          8             99

NACHER SOLL


ID   Kennzahl   ParentID   CCI_ID   CCI_ParentID
--------------------------------------------------------------
4    Summe A      6         6             8
5    Summe B      6         7             8
6    Gesamt       NULL      8             99


Anhand dieses Beispiels nochmal verdeutlicht. Die ersten beiden Datensätze beziehen sich auf die ParentID '8'.

Es soll nun in der [ParentID]-Spalte nicht die '8' sondern die '6' stehen!

Denn in der alten Tabelle, aus denen die CCI Daten kommen, ist 'Gesamt' in der [Kennzahl] Spalte die ID 8 und in der neuen Tabelle die 6!
Also müssen sich die anderen neuen IDs nun auf die 6 anstatt der 8 beziehen!

Ich hoffe das war etwas verständlicher. 😦

MFG !

01.12.2008 - 17:18 Uhr

verwendetes Datenbanksystem: MS SQL 2005

Hallo,

ich bin dabei eine alte Datenbank in ein neues Muster zu mirgrieren und hab hier und da ein paar kleine Probleme.
Nachdem ich heute schon 3 Stunden son monsterquery saß halten mich nun ganz andere Sachen auf und das schlimme - man kommt ums verrecken nicht weiter. Tee hilft auch nimmer 😉

Ich bin auch bischen mit meinen Lateien am ende.

Folgendes Beispiel: Tabelle1


ID   Kennzahl   ParentID   CCI_ID   CCI_ParentID
--------------------------------------------------------------
4    Summe A    NULL          6             8
5    Summe B    NULL          7             8
6    Gesamt     NULL          8             99
.
.
..
67   Archiv      NULL         99            NULL
.
.

Ziel:

Also - die CCI_ID's sind werte aus einer alten Tabelle - die ID's in der neuen Tabelle sind , wie oben zu sehen, aber anders.
Nun müssen die alten Werte umgemapped werden auf die neuen ID's!

Dies Betrifft nur die ParentID's.

In der "NULL" Spalte der neuen [ParentID] soll nun statt z.b. der '8' die '6' stehen!

In der Spalte der [ID] = 6 sollte in der ParentID Spalte statt '99' eben die '67' stehen.

Die Tabelle ist nur eine Migrationstabelle - es könnten änderungen daran vorgenommen werden - lieber ist mir natürlich Temporäre Tabellen zu nutzen wenn es sein muss.

Kann mir jemand weiter helfen ?
Ich hab mich in meinen Abfragen verzettelt und seh den Wald vor lauter Bäumen nicht mehr!

mfg

31.10.2008 - 10:55 Uhr

Hallo zusammen,

folgender Quellcode wird von mir öfters aufgerufen.

Es gibt auch Situationen , bei denen ich nicht den "KennzahlTableAdapter" nutze , sondern einen anderen.

Das Control ist auch nicht immer dasselbe , genau wie das Text und ValueField.

Jetzt ist es mir ein bischen blöd geworden nicht immer den Code rumzukopieren, denn man müsste doch durch eine Methode oder Klasse eine Menge Code sparen können.

Aber ich steh ehrlichgesagt auf dem Schlauch - alle Ansätze die ich auf Papier kritzel können vorn und hinten nicht klappen.

Ich kann ein wenig UML , und versteh grundsätzlich die prinzipien des OOP - mehr oder weniger. Hab da einfach zuwenig praktische Erfahrung !

Wie würdet ihr vorgehen , um folgenden Quellcode zu vereinfachen ? Klasse schreiben? Methode?

Paar Tipps und Hilfe wären echt erste Sahne !

Viele Grüße


        Handlisten_DSTableAdapters.KennzahlTableAdapter KennzahlTA = new Handlisten_DSTableAdapters.KennzahlTableAdapter();

            lst_VerfKennzahlen.DataSource = KennzahlTA.GetDataByKennzahlSubSelect(Convert.ToInt32(lst_AdminService.SelectedValue));
            lst_VerfKennzahlen.DataTextField = "Kennzahl";
            lst_VerfKennzahlen.DataValueField = "KennzahlID";
            lst_VerfKennzahlen.DataBind();

            lst_AusgKennzahlen.DataSource = KennzahlTA.GetDataByKennzahlSelect(Convert.ToInt32(lst_AdminService.SelectedValue));
            lst_AusgKennzahlen.DataTextField = "Kennzahl";
            lst_AusgKennzahlen.DataValueField = "KennzahlID";
            lst_AusgKennzahlen.DataBind();

11.08.2008 - 11:30 Uhr

Kleine Syntaxfehler ausgeschlossen , funktioniert das wunderbar!

Danke dir.

11.08.2008 - 10:42 Uhr

verwendetes Datenbanksystem: MSSQL2005

Hallo,

da ich mich leider immernoch durch den Stored Procedure Jungel hangeln muss und noch nicht den dreh mit den Subquerys raushabe , hätte ich eine frage .

Folgendes Statement gibt mir eine Exception beim Execute aus:



USE [HandlistenDb]

GO

CREATE PROCEDURE [dbo].[usp_ServiceGVView]

AS

SELECT 
	[ServiceID]
   ,[Service]
   ,(SELECT	[Service_Bereich].[ServiceBereich]
	 FROM	[Service] 
		LEFT OUTER JOIN	[Service_Bereich] 
	 ON		[Service].[ServiceBereichID] = [Service_Bereich].[ServiceBereichID])
   ,[Status]
      
FROM   [HandlistenDb].[dbo].[Service]

IF (@@ERROR = 0)
	-- kein Fehler
		BEGIN
			RETURN 0
		END
	ELSE
		-- Fehler
		BEGIN
			RETURN -1
		END

Folgende Exception:


Msg 512, Level 16, State 1, Line 6
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Tabellen sehen folgendermaßen aus:

Service

ServiceID (PK)
Service
ServiceBereichID (FK)
Status


Service_Bereich

ServiceBereichID (PK)
ServiceBereich
Status

Da der FK in der Service Tabelle nur FK ID's beinhaltet ,die in einer GridView Ansicht nicht brauchbar sind , da die zusammenhänge ersichtlich sein müssen - brauche ich die Anzeige der ServiceBereiche.

2 Stored Procs geht auch nicht , da ich über eine Datasource ein GridView fülle.

Was ist am Subquery falsch?

Der Code Parser meckert nicht, aber beim Execute gibts gemecker? 🙁

Viele Grüße

08.08.2008 - 11:43 Uhr

Oh,

vielen Dank 🙂

mit _:::

MFG

08.08.2008 - 10:54 Uhr

verwendetes Datenbanksystem: MSSQL2005

Hallo,

meine wenigkeit hat doch tatsächlich wieder ein Problem. 🤔

Folgendes Szenario:
2 Listboxen haben Einträge; per Button kann ich einträge in die andere Box verschieben.
Die Reihenfolge in Listbox 2 soll der Ansichts-reihenfolge in einem Gridview entsprechen.

Dazu dient die Sort_ID.
Da das ganze in einer MN_Tabelle gemapped wird , kommt es vor das in ListBox2 kein eintrag vorhanden ist. Somit keine Sort_ID vorhanden.

Mit folgender Prozedur verschieb ich einen Eintrag:


ALTER PROCEDURE [dbo].[usp_KennzahlenADD]

  @ServiceID int
 ,@KennzahlID int
 
AS

DECLARE @Sort_ID int

SELECT @Sort_ID = max([MN_ServiceKennzahl].[Sort_ID]) +1 
FROM [MN_ServiceKennzahl] 
WHERE ([MN_ServiceKennzahl].[ServiceID] = @ServiceID)

IF (@Sort_ID < 1)
BEGIN
	SET @Sort_ID = 1
END

INSERT INTO [HandlistenDb].[dbo].[MN_ServiceKennzahl]	
(
	 [ServiceID]
	,[KennzahlID]
	,[Sort_ID]
)

VALUES	
(
	 @ServiceID
	,@KennzahlID
	,@Sort_ID
)

Problem ist folgendes:

Wenn der Select nach der Max(Sort_ID) nichts zurückliefert (also NULL) möchte ich die Sort_ID aber auf 1 setzen.
Dachte das es mit dieser IF - Abfrage einfach umzusetzen wäre - aber funktioniert nicht.

Habe das gefühl er springt garnicht da rein?
Weder bei
IF @Sort_ID = NULL / 0 / < 1

Kann mir jemand helfen?

Viele Grüße

06.08.2008 - 09:39 Uhr

Geht hier ja nur um ein paar hundert Datensätze 🙂
Nichts weltbewegendes , kann dir da so genau nichts sagen ^^

Sind nicht beide Lösungen mit Sub Select?Ich führe einen durch und GMLOD hat ja auch einen ? Oder versteh ich das falsch?

05.08.2008 - 16:36 Uhr

Habs nun so gelöst:



DECLARE @ServiceID int

--SET @ServiceID = 35

SELECT * 
FROM [Kennzahl] 
WHERE [Kennzahl].[KennzahlID] not in 
(
	SELECT [MN_ServiceKennzahl].[KennzahlID] 
	FROM [Kennzahl] 
	right outer join 
		[MN_ServiceKennzahl]
				ON 
					[Kennzahl].[KennzahlID] = [MN_ServiceKennzahl].[KennzahlID]
	WHERE 
		[MN_ServiceKennzahl].[ServiceID] in (@ServiceID)
)


Trotzdem vielen dank für deine Hilfe.

Viel Grüße

05.08.2008 - 15:49 Uhr

Versteh das Subselect mit deinem "1 from othertable where" nicht ganz?

Auf was soll ich hier abfragen ?

Such mir ID , Kennzahl raus
FROM
(inner join gedöhns)
WHERE folgendes nicht existiert
(Select ..... hier muss ich ja auf meine ServiceID kommen)

Ich muss ja irgendwie auch die Variable zulassen - die ServiceID kommt von einem Control.

mfg

05.08.2008 - 15:15 Uhr

verwendetes Datenbanksystem: MSSQL2005

Hallo zusammen,

ich habe eine Denkblockade.

Ich brauche ein Select das mir alle Werte ausgibt die abhängig einer ID nicht zu dieser ID gehören.

Habe schon mit Left / Right Join probiert - aber es geht hier nicht um das Filtern von NULL Werten.

Tabelle Service
ID----Service
----+----------
1-------Blub--
2-------Blab--
3-------Blib---

MN Service_Kennzahl
ID----KennzahlID----ServiceID
----+----------------+-------------
1----------1---------------1-------
2----------2---------------1-------
3----------3---------------1-------
4----------5---------------1-------
6----------3---------------2-------
7----------4---------------2-------
8----------5---------------2-------

Tabelle Kennzahlen
ID------Kennzahl-----
-----+-----------------
1---------Post--------
2---------Fax---------
3---------Email-------
4---------XXXX------
5---------XXXX------

So sieht die Tabellenstruktur aus um welche es geht.

Ich möchte beispielsweise alle Kennzahlen haben , die NICHT in der MN Tabelle mit ServiceID verknüpft sind!

Steh da auf dem Schlauch.

So bekomme ich alle datensätze die verbunden sind in der MN Tabelle , aber brauche praktisch die negation.


ALTER PROCEDURE [dbo].[usp_KennzahlenSelectByServiceId]

	@ServiceID int
AS

SELECT     
	[Kennzahl].[KennzahlID]
              , [Kennzahl].[Kennzahl]

FROM         
	[Service]
                    INNER JOIN
                      [MN_ServiceKennzahl] 
			ON 
		                  [Service].[ServiceID] = [MN_ServiceKennzahl].[ServiceID] 
	    INNER JOIN
                      [Kennzahl] 
			ON 
			 [MN_ServiceKennzahl].[KennzahlID] = [Kennzahl].[KennzahlID]

WHERE     
	([MN_ServiceKennzahl].[ServiceID] = @ServiceID)

ORDER BY
	[Sort_ID]


Steh auf dem Schlauch.

Jemand einen Rat ?

Viele Grüße

04.07.2008 - 10:49 Uhr

Hallo Peter,

danke für deine Hilfe. Hab das Problem nun doch gelöst bekommen - über den anfänglichen Ansatz ^^


    protected void cmdTest_Click(object sender, EventArgs e)
    {
        int i;

        string[] KennzahlenID = new string[lst_kennzahlen.Items.Count];
        string[] Kennzahlen = new string[lst_kennzahlen.Items.Count];

        for (i = 0; lst_kennzahlen.Items.Count > i; i++)
        {
            if (lst_kennzahlen.Items[i].Selected)
            {
                Kennzahlen[i] = lst_kennzahlen.Items[i].Text;
                KennzahlenID[i] = lst_kennzahlen.Items[i].Value;

                //lst_Test.Items.Add(Kennzahlen[i]);
                lst_Test.Items.Add(new ListItem(Kennzahlen[i], KennzahlenID[i].ToString()));
            }
        }



mfg

04.07.2008 - 10:22 Uhr

Alternativ:


        CultureInfo CI = new CultureInfo("de-DE");
        DateTime myDT = DateTime.Now;
        TextBox.Text = myDT.ToString("t", CI);

Statt "t" kannst du auch eines dieser Kürzel einsetzen:

Symbol.Typ..................................Aufruf.......................Ergebnis
d..... kurzes Datumsformat..................string.Format("{0:d}",Wert)..04.07.2008
D..... langes Datumsformat..................string.Format("{0:D}",Wert)..Freitag, 4. Juli 2008
t..... kurzes Zeitformat....................string.Format("{0:t}",Wert)..10:12
T......langes Zeitformat....................string.Format("{0:T}",Wert)..10:12:45
f......Datum & Uhrzeit komplett (kurz)......string.Format("{0:f}",Wert)..Freitag, 4. Juli 2008 10:12
F......Datum & Uhrzeit komplett (lang)......string.Format("{0:F}",Wert)..Freitag, 4. Juli 2008 10:12:45
g......Standard-Datum (kurz)................string.Format("{0:g}",Wert)..04.07.2008 10:12
G......Standard-Datum (lang)................string.Format("{0:G}",Wert)..04.07.2008 10:12:45
M......Tag des Monats.......................string.Format("{0:M}",Wert)..04 Juli
r......RFC1123 Datumsformat.................string.Format("{0:r}",Wert)..Fri, 04 Jul 2008 10:12:45 GMT
s......sortierbares Datumsformat............string.Format("{0:s}",Wert)..2008-07-04T10:12:45
u......universell sortierbares Datumsformat.string.Format("{0:u}",Wert)..2008-07-04 10:12:45Z
Y......Jahr/Monats-Muster...................string.Format("{0:Y}",Wert)..Juli 2008

04.07.2008 - 09:57 Uhr

Könnte ich mit ...


lst_kennzahlen.Items.IndexOf(/* Was einfügen ? Objekt erwartet von ListItem */);


...versuchen die Position aus der anderen ListBox zu holen ?

Andernfalls müsste ich wohl die Stored Procedure umschreiben um statt über die ID , den Wert abzugleichen - was ich aber ungern machen würde.

mfg

03.07.2008 - 17:25 Uhr

[...]

Ich bekomme 4 Columns wieder.

ValueField ist die ID Column und DataText Field ist die zweite Column.

[...]

Hallo Bastor

Nein, kannst du nicht.
Du kannst (solltest) aber als .Value bzw. <ListControl>.DataValueField deine ID hinterlegen, dann kannst du anhand dieser deine Daten holen.

Gruss Peter

Bereits so getan , oder meinst du was anderes?

Hab ein wenig an einen weiterem Problem gebastelt , was ich habe. Ich will Verfügbare Werte aus einer Listbox (die aus ner Stored Procedure die daten kriegt) per Button klick in eine andere packen.

Das Problem ist das ich diesselben ID Werte hinter den DataTextField von ListBox2 brauche wie sie in Listbox1 bestehen.
Weil die Index der Listbox1 der ID aus der Tabelle entspricht aus welcher ich sie hole oder reinschreiben will.

Kann ich einem Item in der Listbox zusätzliche Werte zuweisen ?

Hier mal mein Code soweit:


    protected void cmdTest_Click(object sender, EventArgs e)
    {
        //int i = 0;
        //string[] Kennzahlen = new string[lst_kennzahlen.Items.Count];
        //int[] KennzahlenID = new int[lst_kennzahlen.Items.Count];


        //foreach (ListItem Item in lst_kennzahlen.Items)
        //{
        //    if (Item.Selected)
        //    {


        //        Kennzahlen[i] = lst_kennzahlen.SelectedItem.Text;
        //        KennzahlenID[i] = lst_kennzahlen.SelectedIndex;

        //        i++;
        //    }
        //}


        int i;

        string[] KennzahlenID = new string[lst_kennzahlen.Items.Count];
        string[] Kennzahlen = new string[lst_kennzahlen.Items.Count];

        for (i = 0; lst_kennzahlen.Items.Count > i; i++)
        {
            if (lst_kennzahlen.Items[i].Selected)
            {
                Kennzahlen[i] = lst_kennzahlen.Items[i].Text;
                KennzahlenID[i] = lst_kennzahlen.Items[i].Value;

                lst_Test.Items.Add(Kennzahlen[i]);
                //lst_Test.Items.Insert(Convert.ToInt32(KennzahlenID[i]), Kennzahlen[i]);
            }
        }


        
    }

    protected void cmdBlub_Click(object sender, EventArgs e)
    {
        
        foreach (ListItem Row in lst_Test.Items)
        {
            
[B]               /* Das klappt ja so - aber der Index ist eben der von ListBox2 */
               /* An dieser Stelle müsste ich irgendwie an den Index kommen den "Row.Text" in ListBox1 hat ! */[/B]
                int KennzahlID = Convert.ToInt32(lst_Service.SelectedValue);

                
                string Kennzahl = Row.Text;
                //Saveit(ServiceID, KennzahlID);
        }
    }


lst_Test.Attributes.Add();

Geht auf jedenfall nicht. Steh ein wenig auffen Schlauch da ich an mehreren Fronten was mache und glaub ich einfach den richtigen Baum im Wald nicht sehe 🙂

Viele Grüße

03.07.2008 - 15:29 Uhr

Hallo,

ich habe eine Listbox mit einer DataSource. Die DataSource habe ich mit dem Wizard erstellt - sie zeigt auf eine Stored Procedure , mit welcher ich ein Select auf eine Tabelle richte.

Ich bekomme 4 Columns wieder.

ValueField ist die ID Column und DataText Field ist die zweite Column.

Wenn ich etwas ausgewählt habe in dieser ListBox und einen Button Clicke, möchte ich Informationen übergeben (an eine andere ListBox / Textboxen).

Gibt es eine Möglichkeit an die Daten der andere Columns zu kommen , welche ich ja nicht in der ListBox anzeige ? Sie sind ja vorhanden , denn im Eigenschaften Fenster von Visual Studio kann ich ja nach belieben das DataText Field auswählen - nur wie greife ich darauf zu wenn ich es nicht anzeige?


protected void cmdTest_Click(object sender, EventArgs e)
{
  foreach(ListItem Item in ListBox.Items)
  {
      {
         if(Item.Selected)
         {
           // Infos über die DataSource rausfinden?
           TextBox.Text = Listbox.Data ....Column3.Value oder so?
         }
      }
  }
}

So in etwa , dachte ich - aber ich finde kein Objekt womit ich den richtigen Zugriff realisiere weil ich ehrlichgesagt keine Ahnung habe ob das überhaupt geht was ich möchte.

Viele Grüße

24.04.2008 - 14:48 Uhr

Problem gelöst ...

Wir haben beim debuggen die DataBind(); Aufrufe nach der SelectedIndex Zuweisung gesetzt und es funktioniert jetzt.

Finde es bis jetzt zwar immernoch nicht schlüssig warum es jetzt funktioniert so und vorher nicht , aber naja.
Vorallem weil als die DataBind() Aufrufe noch vorher stattgefunden haben , hatten die ersten beiden funktioniert , aber der letzte nicht?

Falls du da eventuell licht reinbringen kannst ?


        if (!Page.IsPostBack)
        {
            // Entgegennahme der URL Parameter
            string test1 = Request.QueryString["Test1"];
            string test2 = Request.QueryString["Test2"];
            string test3 = Request.QueryString["Test3"];



            // Zuweisung der Parameter auf die dropdown Controls
            int Response1, Response2, Response3;

            bool result_1 = Int32.TryParse(test1, out Response1);
            this.lst_OrganisationsEinheit.SelectedIndex = Response1;

            bool result_2 = Int32.TryParse(test2, out Response2);
            this.lst_ServiceBereich.SelectedIndex = Response2;

            bool result_3 = Int32.TryParse(test3, out Response3);
            this.lst_Service.SelectedIndex = Response3;

            this.lst_OrganisationsEinheit.DataBind();
            this.lst_ServiceBereich.DataBind();
            this.lst_Service.DataBind();

            // Aktivieren / Deaktivieren der Controls bei übergebenen Parametern
            if (test1 == null)
            {
                this.lst_OrganisationsEinheit.CssClass = "einblenden";
            }
            else
            {
                if (test2 == null)
                {
                    this.lst_ServiceBereich.CssClass = "einblenden";
                }
                else
                {
                    if (test3 == null)
                    {
                        this.lst_Service.CssClass = "einblenden";
                    }
                    else
                    {
                        this.lst_Service.CssClass = "ausblenden";
                    }
                    this.lst_ServiceBereich.CssClass = "ausblenden";
                }
                this.lst_OrganisationsEinheit.CssClass = "ausblenden";
            }

            txtDatum_Stunden.Text = Convert.ToString(System.DateTime.Now.Hour);
            txtDatum_Minuten.Text = Convert.ToString(System.DateTime.Now.Minute);

        }

Ja ich weiss das ich die TryParse() Geschichten nicht auswerte , aber es kommen nur Integer raus - werden ja aus einer Datenbank gezogen wo ich weiss was drin steht etc. 😉

mfg

24.04.2008 - 12:44 Uhr

Hallo zusammen,

ich übergebe einer Seite bis zu 3 Parameter über einen Querystring.

Die Parameter weise ich dann 3 DropDownlisten zu. Die DropDownlisten werden über Stored Procedures gefüllt.
Die Datenbindung habe ich über den Visual Studio Designer bewerkstelligt.

Abhängig von der getroffenen Auswahl wird ein GridView gefüllt über eine Stored Procedure (die SP benötigt die ID's aus den dropdownlisten).

Wenn ich alle DropDownlisten Manuell auswähle funktioniert alles.
Wenn ich 2 Parameter übergebe klappt es auch.

Nur wenn ich 3 Parameter abrufe und zuteilen möchte weigert sich die dritte DropDownList (Service) den Wert anzunehmen?
Der Request.Querystring ist richtig ...
Bei der Zuweisung des Strings zum SelectedIndex der Service DropDownLit wird der Wert nicht übernommen ...

Weiss einer ne Lösung oder ein Tipp ?
Weiss mittlerweile nich mehr weiter - hab schon über DataBind() rumgespielt etc. dadurch hab ich wenigstens erreicht das überhaupt was in die dritte List gepumpt wird.

Hier der Code..


    protected void Page_Load(object sender, EventArgs e)
    {


        if (!Page.IsPostBack)
        {
            // Entgegennahme der URL Parameter
            string test1 = Request.QueryString["Test1"];
            string test2 = Request.QueryString["Test2"];
            string test3 = Request.QueryString["Test3"];


            this.lst_OrganisationsEinheit.DataBind();
            this.lst_ServiceBereich.DataBind();
            this.lst_Service.DataBind();

            // Zuweisung der Parameter auf die dropdown Controls
            this.lst_OrganisationsEinheit.SelectedIndex = Convert.ToInt32(test1);
            this.lst_ServiceBereich.SelectedIndex = Convert.ToInt32(test2);
            this.lst_Service.SelectedIndex = Convert.ToInt32(test3);

            // Aktivieren / Deaktivieren der Controls bei übergebenen Parametern
            if (test1 == null)
            {
                this.lst_OrganisationsEinheit.CssClass = "einblenden";
            }
            else
            {
                if (test2 == null)
                {
                    this.lst_ServiceBereich.CssClass = "einblenden";
                }
                else
                {
                    if (test3 == null)
                    {
                        this.lst_Service.CssClass = "einblenden";
                    }
                    else
                    {
                        this.lst_Service.CssClass = "ausblenden1";
                    }
                    this.lst_ServiceBereich.CssClass = "ausblenden1";
                }
                this.lst_OrganisationsEinheit.CssClass = "ausblenden1";
            }

            txtDatum_Stunden.Text = Convert.ToString(System.DateTime.Now.Hour);
            txtDatum_Minuten.Text = Convert.ToString(System.DateTime.Now.Minute);

        }
    }

    protected void SQLDS_SB_Select_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        //this.lst_ServiceBereich.Items.Clear();
        //this.lst_ServiceBereich.Items.Add(new ListItem("-Keine Auwahl-", "0"));
    }
    protected void SQLDS_S_Select_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        
    }
    protected void lst_OrganisationsEinheit_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.lst_ServiceBereich.DataBind();
        this.lst_Service.DataBind();
    }

    protected void lst_ServiceBereich_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.lst_Service.DataBind();

    }

22.04.2008 - 16:59 Uhr

Keine Bange 🙂

Hatte nur noch was anderes zu erledigen gehabt - das GC.Collect und die Converts sind schon verschwunden.

22.04.2008 - 16:35 Uhr

mich wundert auch nichts mehr ! lol

Tut mir echt leid für die verplemperte Zeit ...

einfach den else - Zweig verpennt .. kann natürlich nicht funktionieren . AU MAN ey ...

Weiss grad nicht ob ich mich freu das ich wieder an anderen dingen basteln kann oder ich weinen sollte wie dumm ich war ^^

Besten dank dir !

Viele Grüße

22.04.2008 - 16:12 Uhr

Genau diesselbe , als wenn der Inhalt null wäre ..

"Input string was not in a correct format."

Echt zum aufhängen ..

22.04.2008 - 15:58 Uhr

verwende string.IsNullOrEmpty GENAU so wie ich es beschrieben habe und es wird funktionieren.

Ups, tut mir leid. Sollte wohl aufmerksamer lesen, dankeschön!

Trotzdem krieg ich ne Exception.

Ich habe jetzt einfach mal den Wert "1" zugewiesen... trotzdem spinnt er. Er hat auch im debugger den "1"er Wert drin. Sollte also kein Problem sein?

SaveToDatabase funktion ist oben schon gelinked.
Ich seh einfach das Problem nicht 🙁

Hier mal nen Bild vom debugger grad:

22.04.2008 - 15:41 Uhr

   protected void Button1_Click(object sender, EventArgs e)
    {
        int KennzahlID;
        int Kennwert;
        int counter = 0;

        try
        {
            foreach (GridViewRow row in GridView1.Rows)
            {
                KennzahlID = Convert.ToInt32(row.Cells[0].Text);
                Kennwert = Convert.ToInt32(((TextBox)row.Cells[2].Controls[1]).Text);

                if (((TextBox)row.Cells[2].Controls[1]).Text = String.IsNullOrEmpty)
                {
                    Kennwert = 0;
                }

                SaveToDataBase(KennzahlID, Kennwert);
                counter++;

                //KennzahlID = Convert.ToInt32(String.Empty);
                //Kennwert = Convert.ToInt32(String.Empty);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

Klappt nur nicht , krieg ich Fehler:

Cannot implicity convert type 'string' to 'bool'
Cannot convert method group 'IsNullOrEmpty' to non-delegate type 'string'. Did you intend to invoke the method?

Ich muss die Abfrage ja in der schleife machen , weil ja Zeilenweise durchlaufen wird und jedes mal gespeichert wird.
In einer Zeile kann die textbox ja ein leeren wert enthalten.

Ich kann doch nicht anfangen jetzt wieder wild rumzu-converten oder?

😭

22.04.2008 - 15:14 Uhr

Hallo,

Drängeln nach knapp drei Stunden, nun ja...

Bitte berücksichtige meinen Hinweis, dass nicht Convert.ToInt32 verwendet werden sollte, sondern besser Int32.TryParse. Aber darin liegt nicht das Problem, denn Du sagst ja, dass die "0" genommen wird.

Die **Exception **deutet sehr stark darauf hin, dass der **CommandString **falsch ist. Ausgerechnet den hast Du aber nicht angegeben.

**ExecuteNonQuery **liefert immer 1 als Ergebnis zurück!

Bei UPDATE-Anweisungen, INSERT-Anweisungen und DELETE-Anweisungen ist der Rückgabewert die Anzahl der vom Befehl betroffenen Zeilen. Für alle anderen Anweisungstypen ist der Rückgabewert 1. Bei einem Rollback ist der Rückgabewert ebenfalls 1.

Jürgen

Meinst du mit command string die Stored Procedure ?
Das Speichern klappt ja generell wenn die txtbox Felder alle ausgefüllt sind.

Aber wenn jemand nix in die textbox einträgt dann wird ne exception geworfen wie oben beschrieben , was ich unterbinden will.


USE [Datenbank]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_StoredProcedure..]

		
			 @DateTime datetime
			,@Kennwert int
			,@ServiceID int
			,@KennzahlID int
			,@UserAccount varchar(10)

           
AS

INSERT INTO 
		[Tabelle]	

(
	 [InsertDate]
	,[DateTime]
	,[KennWert]
	,[ServiceID]
	,[KennzahlID]
	,[UserAccount]
)

VALUES	
(
	  getdate() 
	,@DateTime
	,@Kennwert
	,@ServiceID
	,@KennzahlID
	,@UserAccount
)

hinzufügen möchte ich noch:

C#-Code:
GC.Collect();

das ist an dieser stelle unter umständen ein performancekiller, da hierbei der gesamte managed bereich abgedeckt wird. sommit auch der von anderen anwendungen.

C#-Code:
catch (Exception ex)
{
throw ex;
}

wozu hast du ein try-catch wenn du nichts anderes machst als die exception wieder zu werfen??

Mit dem GC Collect hatte ich irgendwo mal gelesen gehabt , hab ich auch desöfteren in bestehenden programmen vorgefunden.

Die Catch throw geschichte ist nur ein Platzhalter.

mfg

22.04.2008 - 13:57 Uhr

Falscher Forumsbereich oder weiss niemand eine Lösung? 🙁

22.04.2008 - 11:08 Uhr

verwendetes Datenbanksystem: MS SQL Server 2003

Hallo zusammen,

Ich steh grad irgendwie auf dem schlauch.

Ich stelle ne verbindung zu einer datenbank her und schreibe dann über eine schleife die Datensätze aus einem GridView über parametresierte Stored Procedures in eine Tabelle.

Die Werte hol ich mir einmal aus der ID einer Spalte und zum anderen aus einer TextBox die dynamisch an das GridView drangehängt wird, je nachdem wieviele Zeilen halt kommen. (Edit Template ..)

Nun kann es aber vorkommen das in der TextBox kein Wert eingegeben wird. Dann soll in die Datenbank eben "0" stehen.
Die Tabelle erlaubt für die Spalte auch ein null.

Beim speichern durchläuft die Foreach schleife die Zeilen und im KennWert steht "0" ...
Exception:
Input string was not in a correct format.

Keine Ahnung wie ich das abfangen soll und vorallem wo genau ..


    protected void Button1_Click(object sender, EventArgs e)
    {
        int KennzahlID;
        int Kennwert;
        int counter = 0;

        /*
        if (txt_Datum.Text == "")
        {
            Response.Write("Datum auswaehlen!");
        }
        */
        try
        {
            foreach (GridViewRow row in GridView1.Rows)
            {

                    KennzahlID = Convert.ToInt32(row.Cells[0].Text);
                    Kennwert = Convert.ToInt32(((TextBox)row.Cells[2].Controls[1]).Text);

                    SaveToDataBase(KennzahlID, Kennwert);
                    counter++;

                //KennzahlID = Convert.ToInt32(String.Empty);
                //Kennwert = Convert.ToInt32(String.Empty);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }


    }

    // DB Connection mit aufruf der USP und übergabe der nötigen Parameter
    protected void SaveToDataBase(int KennzahlID, int Kennwert)
    {
        string connstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conn = new SqlConnection(connstr);

        try
        {
            conn.Open();
            SqlCommand com = new SqlCommand("usp_StoredProcedure....", conn);
            com.CommandType = CommandType.StoredProcedure;

            SqlParameter para1 = com.Parameters.Add("@DateTime", SqlDbType.DateTime);
            para1.Value = txt_Datum.Text;
            para1.Direction = ParameterDirection.Input;

            SqlParameter para2 = com.Parameters.Add("@Kennwert", SqlDbType.Int);
            para2.Value = Kennwert;
            para2.Direction = ParameterDirection.Input;

            SqlParameter para3 = com.Parameters.Add("@ServiceID", SqlDbType.Int);
            para3.Value = lst_Service.SelectedItem.Value;
            para3.Direction = ParameterDirection.Input;

            SqlParameter para4 = com.Parameters.Add("@KennzahlID", SqlDbType.Int);
            para4.Value = KennzahlID;
            para4.Direction = ParameterDirection.Input;

            SqlParameter para5 = com.Parameters.Add("@UserAccount", SqlDbType.NVarChar);
            para5.Value = System.Environment.UserName;
            para5.Direction = ParameterDirection.Input;

            // Wiedergabe der betroffenen Zeilen
            int affectedrows = com.ExecuteNonQuery();

            if (affectedrows == 1)
            {
                lblSuccessful.ForeColor = System.Drawing.Color.Green;
                lblSuccessful.Text = "- Speichern Erfolgreich!";
            }
            else
            {
                lblSuccessful.ForeColor = System.Drawing.Color.Red;
                lblSuccessful.Text = "- Speichern Fehlgeschlagen!";
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
            GC.Collect();
        }
    }

Hab erst gedacht das die Textbox ein String.Empty oder "" vorweisen würde.
Dem ist aber nicht so, denn bei leer gelassener Textbox gibts ein "0" als Value. Entspricht das einem "null" ?

if ( KennWert == null )
Kennwert = 0;

... geht ja auch nicht ..

Die Tabellenspalte erwartet im übrigen einen INTEGER Wert.

Wahrscheinlich echt trivial aber ich dreh mich im Kreis.

mfg

22.04.2008 - 10:50 Uhr

Hallo,

vielen Dank füür Deine info.

Habe jetzt folgendes ausprobiert,

allerdings meckert mir jetzt VS2005 rum das ich das ganze nicht in int konvertieren kann 😦

hier der Code

  
private void button1_Click_1(object sender, DataGridViewCellEventArgs e)  
        {  
       
            int id = (int) kundeDataGridView.CurrentRow.Cells ["Nummer"];  
  
            MessageBox.Show(id);  
        }     
  

Fehlermeldung:
Fehler 1 Eine Konvertierung vom Typ "System.Windows.Forms.DataGridViewCell" in "int" ist nicht möglich.


int id = Convert.ToInt32(kundeDataGridView.CurrentRow.Cells ["Nummer"]);

so vielleicht ?

mfg