Laden...

Forenbeiträge von mtaesler Ingesamt 36 Beiträge

03.07.2009 - 17:51 Uhr

Danke 👍
Ich schau es mir morgen mal an und implementiere es mit

gruß mtaesler

03.07.2009 - 17:10 Uhr

Hallo serial, Vielen Dank jetzt funktioniert es (SqlCacheDependencyAdmin)

Hier nochmal der Quellcode
Default.aspx


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:GridView ID="GridView1" runat="server" EnableViewState="false" />
                <asp:Timer ID="Timer1" runat="server" Interval="1000" ontick="Timer1_Tick" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>

Default.aspx.cs


protected void Page_Load(object sender, EventArgs e)
    {
        DataTable data = (DataTable)Cache.Get("Data");
        if (data == null)
            data = getData();

        GridView1.DataSource = data.DefaultView;
        GridView1.DataBind();
    }
    protected void Timer1_Tick(object sender, EventArgs e)
    {
        DataTable data = (DataTable)Cache.Get("Data");
        if (data == null)
            data = getData();
            
        GridView1.DataSource = data.DefaultView;
        GridView1.DataBind();
    }
    private DataTable getData()
    {
        string connectionString = "connString";
        DataTable data = (DataTable)Cache.Get("Data");
        if (data != null)
            return data;

        data = new DataTable();
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCacheDependencyAdmin.EnableNotifications(connectionString);
            SqlCommand command = new SqlCommand("SELECT tf60, time FROM dbo.Data ORDER BY time DESC", connection);
            SqlCacheDependency dependency = new SqlCacheDependency(command);

            SqlDataAdapter adapter = new SqlDataAdapter(command);
            adapter.Fill(data);

            Cache.Insert("Data", data, dependency);
        }
        return data;
    }

Ich hoffe mal das er sich die Daten jetzt nur holt wenn auch neue Daten in der DB stehen. Kommt mir alles nämlich ein bischen Langsam vor 🤔

Wäre nett wenn nochmal jemand drüberschaut - Danke 👍

gruß mtaesler

03.07.2009 - 15:38 Uhr

Hallo,

habe im Netz folgendes gefunden
http://www.microsoft.com/germany/msdn/connection/vwd2005/MissionControlCenter/flug07/CacheMeIfYouCan.mspx#ERF

Da wird erklärt wie das Caching funktioniert
da heißt es auch man muss über die Kommandozeile die DatenBank konfigurieren.
(Überall steht etwas anderes)

So sieht der Befehl aus: aspnet_regsql -C <ConnectionString> -ed
wenn ich es ausführe kommt folgende Fehlermeldung


Die Datenbank wird für die SQL-Cacheabhängigkeit aktiviert.

.Fehler. Details der Ausnahme:
Instanzausfall.

Es kann keine Verbindung mit der SQL-Datenbank hergestellt werden, um die Cachea
bhängigkeit zu registrieren.

ConnectionString ist aber richtig!

Hier heißt es mann muss es mit einem SQL Befehl machen

ALTER DATABASE db SET ENABLE_BROKER

hilft mir aber auch nicht weiter

Hier im Forum hat mal jemand geschrieben das es mit ExpressVersionen garnicht möglich sei.

Was ist denn nun richtig? Was mach ich Falsch?

Vielen Dank
gruß mtaesler

02.07.2009 - 18:02 Uhr

Hallo serial,

siehe weiter oben - da habe ich schon alles geschrieben - habe auch noch nichts geändert.

Langsam glaube ich das dass garnicht geht was ich vorhabe 🙁

Also das dass GridView neu geladen wird wenn neue Daten in die DB geschrieben werden ohne das der User die Seite neu laden muss.

gruß mtaesler

02.07.2009 - 16:15 Uhr

Danke für den Tipp 👍
aber leider läuft es noch nicht


<system.web>
    <caching>
      <sqlCacheDependency enabled="true" pollTime="60000">
        <databases>
          <add name="dbo.DATA" connectionStringName="connstring" pollTime="9000000"/>
        </databases>
      </sqlCacheDependency>
    </caching>
</system.web>

gruß mtaesler

02.07.2009 - 13:49 Uhr

Danke für den Link aber es klappt noch nicht. Irgendetwas mache ich noch Falsch 🙁
Hier mal der Quellcode:

In der Global.asax starte ich SqlDependency

void Application_Start(object sender, EventArgs e) 
    {
        System.Data.SqlClient.SqlDependency.Start("ConnectionString");
    }

Default.aspx mit meiner GridView


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
            <Scripts>
                <asp:ScriptReference Path="~/Script.js" />
            </Scripts>
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="up1_Load">
            <ContentTemplate>
                <asp:GridView ID="GridView1" runat="server" EnableViewState="false" />
                <asp:HiddenField ID="LatestDisplayTick" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>

JavaScript File (Script.js)


function Check() {
    PageMethods.GetLatestHeadlineTick(OnSucceeded, OnFailed);
}
function OnSucceeded(result, userContext, methodName) {
    var LatestTick = parseInt(result);
    var LatestDisplayTick = parseInt($get('LatestDisplayTick').value);
    if (LatestTick > LatestDisplayTick)
        __doPostBack('UpdatePanel1', '');
    else
        setTimeout("Check()", 5000);
}
function OnFailed(error, userContext, methodName) { }

function pageLoad() {
    setTimeout("Check()", 5000);
}

und noch Default.aspx.cs


protected void Page_Load(object sender, EventArgs e)
    {
        DataTable data = (DataTable)Cache.Get("Data");
        if (data == null)
        {
            data = getData();
        }
        GridView1.DataSource = data.DefaultView;
        GridView1.DataBind();
    }
    private DataTable getData()
    {
        DataTable data = new DataTable();
        using (SqlConnection connection = new SqlConnection("ConnString"))
        {
            SqlCommand command = new SqlCommand("SELECT tf60, time FROM dbo.DATA", connection);
            SqlCacheDependency dependency = new SqlCacheDependency(command);

            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = command;

            DataSet dataset = new DataSet();
            adapter.Fill(dataset);

            data = dataset.Tables[0];
            Cache.Insert("Data", data, dependency);
        }
        return data;
    }
    [WebMethod]
    public static long GetLatestHeadlineTick()
    {
        DataTable dt = (DataTable)HttpContext.Current.Cache.Get("Data");
        DataRow row = dt.Select("", "time DESC")[0];
        return ((DateTime)row["time"]).Ticks;
    }

    protected void up1_Load(object sender, EventArgs e)
    {
        DataTable dt = (DataTable)Cache.Get("Data");
        LatestDisplayTick.Value = GetLatestHeadlineTick().ToString();

        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

Ich weiß nicht mehr weiter - Vielen Dank für Hinweise

gruß mtaesler

01.07.2009 - 18:02 Uhr

Ok habe herausgefunden das man für SqlDependency noch was an der Db umstellen muss
ALTER DATABASE db SET ENABLE_BROKER

und man darf kein * beim SELECT benutzen und muss die Tabellen über dbo. Ansprechen
dbo.Adresse
dbo.TelNummer usw

Habe ich jetzt auch so gemacht - funktioniert aber noch nicht.

gruß mtaesler

01.07.2009 - 16:04 Uhr

Hallo,

ich habe das jetzt mit AJAX gemacht.

Allerdings scheint SqlDependency nicht zu Funktionieren. Das OnChange Event von SqlDependency wird garnicht ausgelöst.

Habe zum Testen ob DataGridView die neusten Daten anzeigt ein Button zur Seite hinzugefügt. Im ClickEvent vom Button steht genau das selbe drinn wie im OnChangeEvent von SqlDependency. Wenn ich weiß das jetzt neue Daten in der DB sind Drück ich da drauf und die neuen Daten werden mit angezeigt. 😁

Aber es soll ja automatisch gehen aber SqlDependency funktioniert nicht 🙁


protected void Page_Load(object sender, EventArgs e)
    {
        SqlDependency.Start("...");

        if (Cache["Data"] == null)
        {
            using (SqlConnection conn = new SqlConnection("..."))
            {
                using (SqlCommand comm = new SqlCommand("SELECT * FROM DATA", conn))
                {
                    conn.Open();
                    SqlDependency dep = new SqlDependency(comm);
                    dep.OnChange += new OnChangeEventHandler(dep_OnChange);

                    DataTable dt = new DataTable("Data");
                    dt.Load(comm.ExecuteReader());

                    Cache["Data"] = dt;

                }
            }
        }
    }

Das OnChange Event wird nicht ausgelöst wenn neue Daten in die DB geschrieben werden. Liegt vermutlich daran das Page_Load nur einmal aufgerufen wird.
Aber in den anderen EreignissMethoden von Page (_Init, _Load, _DataBind, _PreRender, _Unload) macht es auch keinen Sinn 🤔

Vielen Dank für die Hilfe 👍

gruß mtaesler

30.06.2009 - 19:35 Uhr

Wenn ich ehrlich bin weiß ich nicht was du damit meinst? Soll ich das so implementieren?
(Die neuen Daten sollen angezeigt werden ohne das der User die Seite neu laden muss)

gruß mtaesler - Danke für deine Hilfe

30.06.2009 - 18:52 Uhr

Caching auf eine bestimmte Zeit?

Naja, ich hab noch nie mit SqlDependency gearbeitet und hab es mal übernommen, aber auch ohne scheint es nicht zu funktionieren. Ist auch mein erstes Projekt mit ASP.NET

gruß mtaesler

30.06.2009 - 16:02 Uhr

Datenbanksystem: MSSQL 2005 Express
.NET Version 2.0
Hallo,

Auf einem Server läuft eine Software die minütlich neue Daten in eine Datenbank schreibt.

Die ASP.NET-Webseite zeigt die Daten Grafisch an (Ne Art Diagramm)
Wenn nun neue Daten in die DB geschrieben werden sollen die Daten automatisch angezeigt werden.

Habe dazu dieses Beispiel Implementiert http://msdn.microsoft.com/de-de/library/9dz445ks.aspx

und einmal ohne Cache


protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = "Start";
        SqlDependency.Start("...");
        using(SqlConnection conn = new SqlConnection("..."))
        {
            using(SqlCommand comm = new SqlCommand("SELECT * FROM Data", conn))
            {
                SqlDependency dep = new SqlDependency(comm);

                conn.Open();

                dep.OnChange += new OnChangeEventHandler(dep_OnChange);

                GridView1.DataSource = comm.ExecuteReader();
                GridView1.DataBind();
            }
        }
    }

    void dep_OnChange(object sender, SqlNotificationEventArgs e)
    {
        Label1.Text = "NewData " + DateTime.Now.ToLongTimeString();
    }

Daten werden zwar in der DataGridView angezeigt aber nicht aktualisiert wenn neue Daten hinzukommen.

Bei der Forumsuche habe ich folgendes gefunden

...da ich mittlerweile rausgefunden habe, dass SQL Express den Notification Service garnicht unterstützt

Was gibts da nun für möglichkeiten?

gruß mtaesler

19.05.2009 - 20:33 Uhr

Hallo VielenDank - ich lass die Liste jetzt weg und nehme nur Dictionary (da war mein fehler 😄 )

vbprogger - das werde ich mir auch mal anschauen

danke - gruß mtaesler

19.05.2009 - 19:38 Uhr

Ich habe es jetzt nochmal versucht so zu erstellen:
List<Dictionary<string, Currenypair>>

aber da kann ich dann auch nicht den string als Index nehmen

Mit den Indexern - das versteh ich überhaupt nicht

Hab jetzt mal versucht in der CurrenypairKlasse den currencyString als Indexer zu deklarieren


public string this[string index]//<<<--- meckert rum das es int sein muss
        {
            get { return this.currency[index]; }
            set { this.currency[index] = value; }
        }

So richtig verstehe ich das mit den Indexern nicht - könnt ihr mir mal bitte in beispiel geben wie das bei mir aussehen müsste/oder grob erklären

Vielen Dank

19.05.2009 - 17:34 Uhr

Hallo@all,

ich habe seit ca einem Jahr mich mit der Softwareentwicklung nicht mehr beschäftigt und stehe jetzt vor einem "einfachen" Problem (hab vergessen wie ich es früher gemacht habe 😦 )

Also ich habe eine Klasse Currencypair


class Currencypair
    {
        private string currency;
        private double bid;
        private double ask;

        public Currencypair()
        {
        }
        public Currencypair(string currency)
        {
            this.currency = currency;
        }
        public string Currency
        {
            get { return this.currency; }
            set { this.currency = value; }
        }
        public double Bid
        {
            get { return this.bid; }
            set { this.bid = value; }
        }
        public double Ask
        {
            get { return this.ask; }
            set { this.ask = value; }
        }

    }

So jetzt noch eine Klasse CurrencypairData


class CurrencypairData
    {
        private List<Currencypair> listCurrencyPair;

        public CurrencypairData()
        {
            this.listCurrencyPair = new List<Currencypair>();
        }
        public void addCurrencypair(Currencypair pair)
        {
            this.listCurrencyPair.Add(pair);
        }

        public List<Currencypair> ListCurrencyPair
        {
            get { return this.listCurrencyPair; }
        }
    }

Jetzt zum eigentlichen Problem:


CurrencypairData data = new CurrencypairData();
data.addCurrencypair(new Currencypair("EURUSD"));
data.addCurrencypair(new Currencypair("USDJPY"));

data.ListCurrencyPair["EURUSD"].Bid = 1.3430; //<<<----------------------

Ich möchte also den Namen (string currency in der CurrencypairKlasse) als Index benutzen um an das richtige CurrencypairObjekt zu gelangen.

Ich weiß aber absolut nicht mehr wie es geht habe es schon mit List<Dictionary<string, Currencypair>> versucht aber das klappt auch nicht.

Vielen Dank für eure Hilfe

11.08.2008 - 14:59 Uhr

Hallo,
ich möchte in einer Vorhandenen Excel-datei bestimmte Zellen Überschreiben/Schreiben aber das Funktioniert leider nicht.


private List<string> elements = new List<string>();
private Application excelApp = new Application();
        private Workbook book;
        public static string file = @"C:\test\test.xlsx";
//...
/* elements wird dann in einer ListBox angezeigt und nun kann der Benutzer Werte aus der Liste Löschen/Bearbeiten/Hinzufügen(FUNKTIONIERT). Die Werte in der Liste sollen nun wieder in die erste Zeile geschrieben werden(Funktioniert Nicht). */
public void Load()
        {
            this.excelApp = new ApplicationClass();
            this.excelApp.Visible = false;
            book = this.excelApp.Workbooks.Open(file, 0, true, 5, "", "", true, XlPlatform.xlWindows, "",true, true, 0, false, true, 0);
            Sheets sheet = book.Worksheets;
            Worksheet ws = (Worksheet)sheet.get_Item(1);
            Range range;
            int i = 1;
            while(true)
            {
                range = (Range)ws.Cells[1, i];
                if (range.Value2 == null)
                    break;
                this.elements.Add(range.Text.ToString());
                i++;
            }
            book.Close(false, null, null);
            this.excelApp.Quit();
        }

public void Save()
        {
            this.excelApp = new ApplicationClass();
            this.excelApp.Visible = false;
            book = this.excelApp.Workbooks.Open(file, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, true, 0, false, true, 0);
            Sheets sheet = book.Worksheets;
            Worksheet ws = (Worksheet)sheet.get_Item(1);
           
            for(int i=0; i<this.elements.Count; i++)
            {
                ws.Cells[1, i] = this.elements[i];
            }
            book.Close(false, null, null);
            this.excelApp.Quit();
        }
/*Keine Fehlermeldung aber es passiert nichts(keine neuen Werte in der ExcelTabelle*/

Hab mal gesucht aber alle anderen Lösungen funktionieren auch nicht.
Excel Öffnen (OK), Schreiben (OK), Beenden (Fehler)
http://www.tutorials.de/forum/net-archiv/169782-excel-datei-oeffnen-bearbeiten-mit-c.html
http://entwickler-forum.de/showthread.php?t=2121

Was mache ich Falsch? 🙁

07.08.2008 - 11:11 Uhr

Hey das ist ja eine tolle Idee 👍
werde das so ähnlich mit übernehmen.

Vielen Dank

06.08.2008 - 15:59 Uhr

Verstehe das nicht so ganz wie du das meinst.
Die 2. Form ist dann ca. 30% Transparent und auf Vollbild gestellt. Sie wird natürlich erst geöffnet, wenn du deinen Screenshot machen möchtest.?

Mir ist noch was eingefallen:
Form1 TopMost(true) Vollbild Mit TransparencyKey komplett Tranparent
Form0 TopMost(false) Vollbild Opacity(50%)

Also auf Form1 die Buttons(Beenden, Konfiguration)
Auf Form0 Auswahlrechteck (MouseDown/Up/Move)
Bei MouseUp(Bereich wurde ausgewählt) benachrichtige ich Form1 mit Position und Größe des Rechtecks und Zeige dann die Buttons an(Speichern, Nochmal)
Bei Nochmal benachrichtige ich Form0 dass das gezeichnette Rechteck wieder entfernt werden soll und man kann eine neue Auswahl erstellen.

06.08.2008 - 12:40 Uhr

Hallo, erstmal vielen Dank für die Hilfe aber es sind neue Probleme aufgetaucht. Es soll ein Programm werden mit dem man einen Bereich vom Desktop als Bild speichern kann. Dazu habe ich eine Form(FormBorderStyle=None)(Opacity(50%)(Vollbild) nun kann man einen Bereich auswählen: http://www.sturmnet.org/blog/archives/2005/08/26/ Danach werden in der Mitte vom Rechteck 2 weiter Buttons angezeigt: (Bild) Speichern -> Bereich Speichern Nochmal -> Einen neuen Bereich auswählen

Bis jetzt funktioniert auch alles aber die Buttons sollen nicht transparent sein. Die Lösung von winSharop93 funktioniert aber dann habe ich Probleme mit dem Auswahlwerkzeug.

Das einzige was mir da einfällt ist beim Programmstart ein Screenshot vom gesamten Desktop zu machen und in einer PictureBox anzeigen und da kann man seinen Bereich den man Speichern will auswählen.

Kennt ihr eine bessere Lösung?

Vielen Dank

29.07.2008 - 20:18 Uhr

Hallo,
ich habe ein Halbtransparente Form(opacity[50%])
darauf möchte ich noch 2-3 Buttons darstellen die aber nicht Transparent sein sollen.
Wie kann ich das machen?
Finde im Forum nicht wirklich was dazu.

Vielen Dank

29.11.2007 - 22:03 Uhr

long frequency = 3579; // Ticks pro Millisekunde.
long ticks = 3420;
double milliseconds = ((double)ticks / (double)frequency);

29.11.2007 - 20:30 Uhr

Deine Lösung finde ich nicht so toll.
Du hast 2 Listen (Deutsch, Englisch) wenn du nun einen Wert aus der Liste Deutsch oder Englisch entfernst dann stimmt nichts mehr.
Erstell dir eine Klasse Vokabel


public class Vokabel
    {
        private string deutsch;
        private string englisch;

        public Vokabel() { }
        public Vokabel(string deutsch, string englisch)
        {
            this.deutsch = deutsch;
            this.englisch = englisch;
        }

        public string Deutsch
        {
            get { return this.deutsch; }
            set { this.deutsch = value; }
        }
        public string Englisch
        {
            get { return this.englisch; }
            set { this.englisch = value; }
        }
    }

Dann noch eine Klasse zur Verwaltung(Vokabeln aus DB Lesen, Löschen)


public class Data
    {
        private List<Vokabel> listVokabel;
        public Data()
        {
            this.listVokabel = new List<Vokabel>();
        }
        public void addVokabel(Vokabel vokabel)
        {
            this.listVokabel.Add(vokabel);
        }
        public List<Vokabel> getVokabel()
        {
            return this.listVokabel;
        }
        public Vokabel getVokabelRandom()
        {
            Random random = new Random();
            return this.listVokabel[random.Next(0, this.listVokabel.Count)];
        }
    }


Benutzen kannst du es dann so:


Data data = new Data();
data.addVokabel(new Vokabel("Hallo", "Hello"));
data.addVokabel(new Vokabel("Auto", "Car"));
Console.WriteLine(data.getVokabelRandom().Deutsch+" - "+data.getVokabelRandom().Englisch);

dann sollte sowas auch nicht mehr passieren.

//edit getVokabelRandom Funktion hinzugefügt

29.11.2007 - 14:02 Uhr

Ein sehr gutes Tutorial zum thema Microcontroller
http://www.mikrocontroller.net/articles/AVR-Tutorial
2: LED - Matrix (Anregungen)
http://www.mikrocontroller.net/articles/LED-Matrix

16.11.2007 - 18:08 Uhr

Jetzt funktioniert es.
Habe jetzt folgenden ConnectionString:
data source= DESKTOP001\SQLEXPRESS;Initial Catalog=MSDNAA;user id=sa;password=*****;integrated security=false;persist security info=false

Vielen Dank für eure Hilfe

16.11.2007 - 15:38 Uhr

Original von norman_timo
es gibt 2 verschiedene Anmeldebedingungen um Username und Passwort dem SQL Server zu übergeben.

Windows-Authentifizierung -> hier werden der aktuell angemeldete Benutzer verwendet
Integrated-Authenticate -> hier wird explizit Benutzername und Passwort übergeben
...
Grüße
Norman-Timo

Ja das weiß ich. Und ich habe Windows-Authentifizierung gewählt.

Original von norman_timo
Ich würde folgenden Connection-String nehmen (ja nach Verbindungsart):

>

Hilft mir leider nicht weiter, da ich denke das der fehler bei der Angabe des Data Source liegt ich aber nicht weiß was ich da angeben soll.

Vielen Dank

16.11.2007 - 15:06 Uhr

verwendetes Datenbanksystem: SQLServer 2005 Express
Hallo,
wir schreiben in der Schule ein Programm um MSDNAA-Lizenzen zu Verwalten.
Dabei verwende ich folgenden ConnectionString:
Data Source=.\SQLEXPRESS;Initial Catalog=MSDNAA;Integrated Security=True
(steht in der app.config - funktioniert)
Nun wollte ich zuhause etwas weitermachen habe mir SQLServer 2005 Express + Management Studio Express (selbe wie in der Schule)Installiert.
Aber nun erhalte ich mit dem selben ConnectionString folgende Fehlermeldung:
**
Fehler beim Herstellen einer Verbindung mit dem Server. Beim Herstellen einer
Verbindung mit SQL Server 2005 kann dieser Fehler dadurch verursacht werden, dass
unter den SQL Server-Standardeinstellungen Remoteverbindungen nicht zulässig sin
d. (provider: SQL-Netzwerkschnittstellen, error: 26 - Fehler beim Bestimmen des
angegebenen Servers/der angegebenen Instanz)**
(Remoteverbindungen mit diesem Server zulassen ist Aktiviert)
Mit dem SQL Management Studio kann ich mich Problemlos Verbinden(pic01.gif)
Auch mit dem folgenden ConnectionString funktioniert es nicht:
Data Source=DESKTOP001\SQLEXPRESS;Initial Catalog=MSDNAA;Integrated Security=True

Ich denke mal es liegt an Data Source - was muss ich den da nun Angeben?

Vielen Dank

11.09.2007 - 16:28 Uhr

Hallo,
ich habe eine Frage zum Design.
Ich habe eine Datenbank mit 2 Tabellen (subjects, vocables)
Also ich habe eine Klasse DataBase


public class DataBase
    {
        private SqlCeConnection sqlConnection;

        public DataBase()
        {
        }
        protected void Connect()
        {
            //Verbinden
            sqlConnection = new SqlCeConnection(Config.Instance.getDataSource);
            sqlConnection.Open();
        }
        protected void Disconnect()
        {
            //Verbindung Beenden
            sqlConnection.Close();
        }
        protected SqlCeConnection getConnection()
        {
            return sqlConnection;
        }
    }

Dann habe ich noch 2 Klassen die von DataBase erben. 1.Subjects //Subjects Löschen, Hinzufügen, Bearbeiten, Liste mit Subjects zurückgeben 2.Vocabulary //Vokabeln Hinzufügen, Anzahl zum Lernen, Liste mit Vokabeln zurückgeben

Source zu 1.Subjects


public class Subjects : DataBase
    {
        private SqlCeCommand sqlCommand;
        public Subjects()
        {
        }
        public void addSubject(string name)
        {
            try
            {
                this.Connect();
                this.sqlCommand = new SqlCeCommand();
                this.sqlCommand.Connection = this.getConnection();
                //...
                this.sqlCommand.ExecuteNonQuery();
                this.sqlCommand.Dispose();
                this.Disconnect();
            }
            catch (SqlCeException e)
            {
                throw new ArgumentException("Error(addSubject):" + e.Message);
            }
        }
        public void deleteSubject(int id)
        {
            try
            {
                this.Connect();
                this.sqlCommand = new SqlCeCommand();
                this.sqlCommand.Connection = this.getConnection();
                //...
                this.sqlCommand.ExecuteNonQuery();
                this.sqlCommand.Dispose();
                this.Disconnect();
            }
            catch (SqlCeException e)
            {
                throw new ArgumentException("Error(deleteSubject):" + e.Message);
            }
        }
        public void changeSubject(int id, string name)
        {
            try
            {
                this.Connect();
                this.sqlCommand = new SqlCeCommand();
                this.sqlCommand.Connection = this.getConnection();
                //...
                this.sqlCommand.ExecuteNonQuery();
                this.sqlCommand.Dispose();
                this.Disconnect();
            }
            catch (SqlCeException e)
            {
                throw new ArgumentException("Error(changeSubject):" + e.Message);
            }
        }
        public List<KeyValuePair<int, string>> getSubjects()
        {
            try
            {
                this.Connect();
                this.sqlCommand = new SqlCeCommand();
                this.sqlCommand.Connection = this.getConnection();
                //...
                this.sqlCommand.Dispose();
                this.Disconnect();
                return list;
            }
            catch (SqlCeException e)
            {
                throw new ArgumentException("Error(getSubjects):" + e.Message);
            }
        }
    }

Source zu 2.Vocabulary


class Vocabulary : DataBase
    {
        private SqlCeCommand sqlCommand;
        public Vocabulary()
        {
        }
        public void addVocable(string fid, string ask, string answer)
        {
            try
            {
                this.Connect();
                this.sqlCommand = new SqlCeCommand();
                this.sqlCommand.Connection = this.getConnection();
                //...
                this.sqlCommand.ExecuteNonQuery();
                this.sqlCommand.Dispose();
                this.Disconnect();
            }
            catch (SqlCeException e)
            {
                throw new ArgumentException("Error(addVocable):" + e.Message);
            }
        }
        public int getCountToLearn(int sid)
        {
            try
            {
                this.Connect();
                this.sqlCommand = new SqlCeCommand();
                this.sqlCommand.Connection = this.getConnection();
                //...
                return Convert.ToInt32(this.sqlCommand.ExecuteScalar());
            }
            catch (SqlCeException e)
            {
                throw new ArgumentException("Error(getCountToLearn):" + e.Message);
            }
        }
        public List<Vocables> getVocables(int id)
        {
            try
            {
                this.Connect();
                this.sqlCommand = new SqlCeCommand();
                this.sqlCommand.Connection = this.getConnection();
                //...
                this.sqlCommand.Dispose();
                this.Disconnect();
                return list;
            }
            catch (SqlCeException e)
            {
                throw new ArgumentException("Error(getSubjects):" + e.Message);
            }
        }
    }


Zum Anzeigen, Bearbeiten, Löschen u.s.w habe ich zurzeit 5 Forms.
Jede Form hat eine eigene Instanz von Subjects oder Vocabulary oder beides.

//1.mainForm
   private Subjects subject = new Subjects();
   private Vocabulary vocables = new Vocabulary();
//2.addSubjectForm
   private Subjects subject = new Subjects();
//3.changeSubjectForm
   private Subjects subject = new Subjects();
//4.deleteSubjectForm
   private Subjects subject = new Subjects();
//5.addVocableForm
   private Subjects subject = new Subjects();
   private Vocabulary vocables = new Vocabulary();

Ist meine Lösung so in Ordnung? Ich denke nicht oder?
Wie würdet ihr es machen?

Vielen Dank

24.08.2007 - 15:48 Uhr

Vielen Dank es funktioniert.

24.08.2007 - 13:47 Uhr

Beim Starten von SQL Server Management Studio kann ich den Servertyp nicht wählen:
pic0.gif
Dann habe ich folgende Anleitung gefunden:
http://msdn2.microsoft.com/de-de/library/ms181452.aspx
Aber unter Registrierte Server ist nur Datenbankmodul vorhanden:
pic1.gif

Was mache ich falsch?
Vielen Dank

17.08.2007 - 15:53 Uhr

Vielen Dank aber ich erhalte 2 Fehlermeldungen bei:


CDelegateLabel.SetLabelText(MainForm, MainForm.labelInfo, fileName+" wurde erfolgreich hochgeladen");

**
An object reference is required for the nonstatic field, method, or property 'FotoManager.MainForm.infoBox' (CS0120)
'FotoManager.MainForm' is a 'type' but is used like a 'variable' (CS0118 ) **

Was mache ich Falsch?
Vielen Dank

17.08.2007 - 15:20 Uhr

Hallo,
noch eine kleine Frage:
Wo rufe ich die Funktion/Klasse auf?
-MainForm:
Wie komme ich dann an die Informationen von FotoManager.uploadPictures
(z.B.: "Datei hallo.png erfolgreich hochgeladen!")
-FotoManager:
Wie Komme ich an Form frm und Label label?

Vielen Dank

17.08.2007 - 14:17 Uhr

Ich brauche nochmal eure Hilfe.
Also ich habe 2 Klassen
-MainForm //hier wird das fenster erstellt und auf ereignisse reagiert
-FotoManager //mit der klasse kann man Ordner mit Bildern hochladen
ich poste mal etwas code:
MainForm


namespace FotoManager
{
	partial class MainForm
	{
		//Zeug vom GUI Designer
		private void InitializeComponent()
		{
			//Fenster erstellen, Buttons und so Weiter
		}
		private BackgroundWorker bgWorker = new BackgroundWorker();
		private FotoManager fotomanager = new FotoManager(); //Meine FotoManager klasse
		public System.Windows.Forms.Label labelInfo;
		private System.Windows.Forms.Button selectButton;
		private System.Windows.Forms.ProgressBar statusBar;
		private System.Windows.Forms.Button uploadButton;
		protected System.Windows.Forms.FolderBrowserDialog Browser;
		
		void openFileBrowser(object sender, System.EventArgs e)//selectButton
		{
			this.Browser.ShowDialog();
		}
		private void DoWork(object sender, DoWorkEventArgs e)
		{
			//Hier werden die Bilder hochgeladen
			fotomanager.uploadPictures(this.Browser.SelectedPath, "server", "name", "passwort", (BackgroundWorker)sender);
		}
		private void WorkCompleted(object sender, RunWorkerCompletedEventArgs e)
		{
			this.labelInfo.Text = "\nBilder wurden Erfolgreich hochgeladen!";
		}
		private void ProgressChanged(object sender, ProgressChangedEventArgs e)
		{
			statusBar.Value = e.ProgressPercentage;
		}
		void uploadPictures(object sender, System.EventArgs e)//uploadButton
		{
			bgWorker.DoWork += new DoWorkEventHandler(this.DoWork);
			bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.WorkCompleted);
			bgWorker.ProgressChanged += new ProgressChangedEventHandler(this.ProgressChanged);
			bgWorker.RunWorkerAsync("Start Upload");
			bgWorker.WorkerReportsProgress = true;
		}
	}
}

So nun FotoManager - Stark gekürzt!


namespace FotoManager
{
	public class FotoManager
	{
		
		public void uploadPictures(string path, string server, string name, string passwort, System.ComponentModel.BackgroundWorker status)
		{

			foreach(string fileName in Directory.GetFiles(path))
			{
				uploadStatus += statusBarStep;
				//Verbindung herstellen
	            try
    	        {
                	//Datei Hochladen
///////////////////////////////////////////////////////////////////////
//Hier will ich in labelInfo z.B.: folgendes reinschreiben:
//labelInfo.Text = fileName+" wurde erfolgreich hochgeladen";
///////////////////////////////////////////////////////////////////////

                	status.ReportProgress(uploadStatus);
            	}
            	catch(Exception ex)
            	{
                	//Fehler
            	}
			}
		}

	}
}

Ich habe schon versucht die Beispiele im Tutorial oder die Beispiele in der FAQ zu Implementieren - Aber ich komme nicht zurecht.

Vielen Dank für Tipps, Ratschläge, Lösungen

17.08.2007 - 13:41 Uhr

Danke - Ich wahr wohl Blind 😁

17.08.2007 - 13:31 Uhr

In diesem Tutorial(Threads) auf Seite 8/9 Kapitel 5.1
[Artikel] Multi-Threaded Programmierung
steht folgende Zeile:
Item item = new Item();
Bei mir kommt da folgende Meldung:
The type or namespace name 'Item' could not be found (are you missing a using directive or an assembly reference?)

Was muss ich noch einbinden?

Vielen Dank

16.08.2007 - 16:42 Uhr

Hallo,
es funktioniert fantastisch. 👍 (BackgroundWorker)
Vielen Dank

16.08.2007 - 14:32 Uhr

Hallo, ich habe/wollte ein kleines tool Schreiben mit dem man Ordner mit Bildern auf einem Server speichern kann.
ich poste mal den Teil mit FtpWebRequest:


public void uploadPictures(string path, string server, string name, string passwort, System.Windows.Forms.ProgressBar statusBar)
		{
			int statusBarStep = 100/count+1; //count == Anzahl der Bilder
			char[] split = {'\\'};
			string[] test = path.Split(split);
			//System.Windows.Forms.MessageBox.Show(test[test.Length-1]);
			this.MakeDir(test[test.Length-1], server, name, passwort);
			uploadStatus += statusBarStep;
			statusBar.Value = uploadStatus;
			foreach(string fileName in Directory.GetFiles(path))
			{
				uploadStatus += statusBarStep;
				FileInfo fileInf = new FileInfo(fileName);
				string uri = "ftp://" + server + "/" + test[test.Length-1] + "/" + fileInf.Name;
            	FtpWebRequest reqFTP;
	            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
	            reqFTP.Credentials = new NetworkCredential(name, passwort);
	            reqFTP.KeepAlive = false;
	            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
	            reqFTP.UseBinary = true;
	            reqFTP.ContentLength = fileInf.Length;
	            int buffLength = 2048;
            	byte[] buff = new byte[buffLength];
            	int contentLen;
	            FileStream fs = fileInf.OpenRead();
	            try
    	        {
                	Stream strm = reqFTP.GetRequestStream();
                	contentLen = fs.Read(buff, 0, buffLength);
                	while (contentLen != 0)
                	{
                    	strm.Write(buff, 0, contentLen);
                    	contentLen = fs.Read(buff, 0, buffLength);
                	}
                	strm.Close();
                	fs.Close();
                	statusBar.Value = uploadStatus;
            	}
            	catch(Exception ex)
            	{
                	System.Windows.Forms.MessageBox.Show(ex.Message, "Upload Error");
            	}
			}
		}
		private void MakeDir(string dirName, string server, string name, string passwort)
		{
			FtpWebRequest reqFTP;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"+server+"/"+dirName));
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(name, passwort);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "Upload Error");
            }
		}

Das Programm "hängt sich dann auf" Aber der Ordner und die Bilder werden Hochgeladen. Aber mann kan das Fenster dann nicht mehr bewegen oder Minimieren.
Das stört mich.
Wie kann man das Problem lösen? mit Threads villeicht?

Vielen Dank für eure Hilfe