Avatar billede Slettet bruger
14. december 2003 - 01:37 Der er 18 kommentarer og
1 løsning

DB-forbindelse

Hej
Jeg sidder og leger lidt med et CMS-lignende system. Jeg har før arbjdet lidt med det i ASP. Men er lige begyndet et kigge lidt på ASP.NET

I ASP havde jeg en fil, der includerede DB-forbindelsen, som jeg includede i toppen af de sider, hvor jeg skulle bruge forbindelsen.

Gøres det på samme måde i .NET, eller er der en smartere måde at gøre det på?

På forhånd tak.
Avatar billede burningice Nybegynder
14. december 2003 - 03:02 #1
du laver en klasse til det, som indeholder de funktioner du skal bruge... ExecuteSQL, GetReader, ExecuteScalar og hvad man ellers skal bruge af forskellige ting... når du så skal bruge en forbindelse til din db opretter du en instans af din klasse og bruger de metoder du nu engang skal bruge.

Eksempel:

DataStore ds = new DataStore();
ds.Sql = "SELECT * FROM tabel";

IDataReader reader = ds.GetReader();

// gør et eller andet

reader.Close();
Avatar billede jakobg Nybegynder
06. januar 2004 - 14:35 #2
Du kan også markere dine metoder som "shared", som behøver du ikke en ny instans af klassen, for at anvende metoden/funktionen. Det er nok det tætteste man kommer på includes fra ASP.Old.

4 Guys From Rolla har lige haft en glimrende artikel om emnet:
http://aspnet.4guysfromrolla.com/articles/122403-1.aspx
Avatar billede Slettet bruger
12. januar 2004 - 14:02 #3
Hej igen
Jeg har brug for lidt mere uddybende forklaring. Jeg har læst artiklen fra 4 Guys From Rolla, men jeg forstår det ikke helt.
Jeg er med på at man laver en shared fucktion, men hvor skal den placeres og hvormeget kan man skrive i denne funktion? Kan man f.eks. importere namespace i denne funktion også?
Håber I har tid til at hjælpe - på forhånd tak.
Avatar billede jakobg Nybegynder
12. januar 2004 - 14:21 #4
Den skal såmen ikke placeres noget bestemt sted, så snart den er en del af dit projekt, kan du referere til den.

Hvis du laver en klasse som denne:

Public Class MyConstants
    Public Shared Function MyConnetion() As String
        Return "Hello World!"
    End Function
End Class

så kan du efterfølgende i din code-behind lave følgende:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim strCon As String
        strCon = MyConstants.MyConnetion
End Sub
Avatar billede Slettet bruger
12. januar 2004 - 14:41 #5
Det fatter jeg ikke. Kan jeg f.eks. bare lave en fil, der ligger i roden som hedder dbconn.aspx med følgende indhold:

Public Class ConstClass
    Public Shared Function DBConnection()
        <%@Import Namespace="System.Data.OleDB"%>
        Dim DbConn As OleDbConnection
        Dim DbCmd As OleDbCommand
        DbConn = New OleDbConnection( "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=c:\inetpub\wwwroot\database\cms.mdb" )

    End Function
End Class

Og så kører det?
Avatar billede jakobg Nybegynder
12. januar 2004 - 14:50 #6
Nej, du er helt ved siden af: Du tilføjer en class til dit projekt, de ender altid på .vb og indeholder ikke andet end VB code.

Hvis du vil ha' dét eksempel op og køre, som du selv har skitseret, bliver din kode formentlig noget i retningen af følgende:

Public Class ConstClass
    Public Shared Function DBConnection() As OleDb.OleDbConnection
        Dim DbConn As New System.Data.OleDb.OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=c:\inetpub\wwwroot\database\cms.mdb")
        Return DbConn
    End Function
End Class

når du i din aspx.vb side så skal bruge en connection, skriver du følgende:

Dim cnnConn As OleDb.OleDbConnection = ConstClass.DBConnection

Dog er jeg ikke helt sikker på, om du kan bruge Shared functions på den måde, ellers må du bare lave en ny instans af ConstClass først.

Giver det mere mening?
Avatar billede Slettet bruger
12. januar 2004 - 15:01 #7
Jeg er stadig i tviv om hvordan jeg tilføjer en class til mit projekt, da jeg lige pt. ikke har et udviklingsmiljø og derfor bruger notepad.
Avatar billede jakobg Nybegynder
12. januar 2004 - 15:06 #8
Ahh, Notepad... :)

Du tilføjer en class ved blot at oprette en ny fil, MyClass.vb, et vilkårligt sted i din applikation. Mere er der såmen ikke i det.

Det kan anbefales på det allervarmeste at anvende Visual Studio .NET (ja, den er pishamrende dyr, men alligevel), det er et uovertruffent værktøj. Ellers kan du overveje Web Matrix (http://asp.net/webmatrix/) hvis finanserne ikke tillader de store udskejelser.
Microsoft kører iøvrigt også ofte kampagner, hvor man kan prøve VS.NET af i en begrænset periode for 0 kroner...
Avatar billede Slettet bruger
12. januar 2004 - 15:22 #9
Ja - Notepad :-)
Tak, jeg vender liget tilbage.
Avatar billede Slettet bruger
19. januar 2004 - 00:08 #10
Hej igen
Jeg håber I kan huske hvad der sker - selv om der går lidt tid i mellem jeg får tid til at lege med det her.
Jeg har nu prøvet på forskellig vis, men kan ikke få det til at virke. Koden herunder virker. Jeg ønsker dog at få så meget som muligt defineret i en class (som jeg ikke helt fatter), som jeg så kan kalder uanset hvor jeg er i projektet. Spørgsmålet er hvormeget kan jeg smide i den fil og hvordan jeg så kalder den fil/class for at få åbnet DB-forbindelsen.
Håber I stadig har tålmodighed - på forhånd tak.

<%

Dim DbConn As OleDbConnection
Dim DbCmd As OleDbCommand
Dim DbRead As OleDbDataReader

DbConn = New OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=c:\inetpub\wwwroot\database\testdb.mdb")
DbConn.Open()
DbCmd = New OleDbCommand( "SELECT title FROM design", DbConn )
DbRead = DbCmd.ExecuteReader()
While DbRead.Read()
  Response.Write( "<li>" )
  Response.Write( DbRead( "title" ) )
End While
DbRead.Close()
DbConn.Close()

%>
Avatar billede burningice Nybegynder
19. januar 2004 - 10:21 #11
dette kan måske give dig lidt inspirattion ?!

using System;
using System.Data;

namespace MPAConsult.ToolBox.Data
{
    /// <summary>
    /// Summary description for IDataStore.
    /// </summary>
    public interface IDataStore
    {
        string Sql
        {
            get;
            set;
        }

        void Close();
        void Open();

        void ExecuteNonQuery();
        void ExecuteNonQuery(bool keepOpen);
               
        object ExecuteScalar();

        IDbCommand GetCommand();
        IDataReader GetReader();
    }
}


using System;
using System.Configuration;
using System.Data;
using System.Data.OleDb;

namespace MPAConsult.ToolBox.Data
{
    /// <summary>
    /// Summary description for DataStore.
    /// </summary>
    public class OleDbDataStore : MPAConsult.ToolBox.Data.IDataStore
    {
        private OleDbConnection conn;
        private string sql;

        public OleDbDataStore()
        {
            string connStr = ConfigurationSettings.AppSettings["db"];
            conn = new OleDbConnection(connStr);
        }

        public string Sql
        {
            get
            {
                return sql;
            }

            set
            {
                sql = value;
            }
        }

        protected void CheckSql()
        {
            if (Sql == null)
            {
                throw new NullReferenceException("Need to supply SQL-query before executing commands");
            }
        }

        public void Close()
        {
            if (conn.State == ConnectionState.Open)
            {
                try
                {
                    conn.Close();
                }
                catch (OleDbException exc)
                {
                    throw new DataStoreException(exc.Message, exc);
                }
            }
        }

        public void Open()
        {
            if (conn.State == ConnectionState.Closed)
            {
                try
                {
                    conn.Open();
                }
                catch (OleDbException exc)
                {
                    throw new DataStoreException(exc.Message, exc);
                }
            }
        }

        public void ExecuteNonQuery()
        {
            ExecuteNonQuery(false);
        }

        public void ExecuteNonQuery(bool keepOpen)
        {
            CheckSql();

            IDbCommand command = GetCommand();
           
            Open();

            try
            {
                command.ExecuteNonQuery();
            }
            catch (OleDbException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
            finally
            {
                if (!keepOpen)
                {
                    Close();
                }
            }
        }

        public object ExecuteScalar()
        {
            IDbCommand command = GetCommand();
            object o;

            Open();
           
            try
            {
                o = command.ExecuteScalar();
            }
            catch (OleDbException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
            finally
            {
                Close();
            }
           
            return o;
        }

        public IDbCommand GetCommand()
        {
            OleDbCommand command = new OleDbCommand();
            command.Connection = conn;

            if (Sql != null)
            {
                command.CommandText = Sql;
            }

            return command;
        }

        public IDataReader GetReader()
        {
            IDbCommand command = GetCommand();
            IDataReader reader;

            Open();
           
            try
            {
                reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (OleDbException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
           
            return reader;
        }
    }
}

bruges ved at skrive følgende et vilkårligt sted i dit projekt:

IDataStore ds = new OleDbDataStore();
ds.Sql = "SELECT title FROM design"

IDataReader dr = ds.GetReader();

while (dr.Read()) {
  Response.Write( "<li>" )M
  Response.Write( dr( "title" ) );
}

dr.Close();
Avatar billede Slettet bruger
19. januar 2004 - 11:10 #12
Tak - men jeg forstår det overhovedt ikke??
Avatar billede burningice Nybegynder
27. januar 2004 - 08:09 #13
well... kan være der er nogen grundlægge du skal have på plads så
Avatar billede dumbledore Nybegynder
02. februar 2004 - 20:51 #14
Cyberfessor; det nytter slet ik, at du tydeligt kan se han er ny til sproget, og fyrer en 2 siders lang kode ind på boardet...

Anthonsen; det du mener er vel; at i asp.old gjorde man ofte sådan at man lavede en header.asp og der lå ens database connection, så man i andre filer bare kunne inkludere den og så skrive
<%db("titel")%> og så kom den...f.eks.

Det man skal i asp.net er at man INDEN body laver sin asp.net kode, og så henter man så sen kode nede i HTML'en når den skal indsættes der.

Det de mener, i rent tekst er, at du kan lave en class fil, en simpel class.vb fil som du lægger ved siden af dine andre dokumenter, .vb betyder at der KUN står VB script's i selve filen, f.eks. en database connection... den fil kan du så inkludere som i asp.old og så hente det du vil hente fra selve databasen længere nede i sidens kode... f.eks.:

------------------------------ dette er koden som skal stå i din class.vb fil ::

using System;
using System.Data;

namespace MPAConsult.ToolBox.Data
{
    /// <summary>
    /// Summary description for IDataStore.
    /// </summary>
    public interface IDataStore
    {
        string Sql
        {
            get;
            set;
        }

        void Close();
        void Open();

        void ExecuteNonQuery();
        void ExecuteNonQuery(bool keepOpen);
               
        object ExecuteScalar();

        IDbCommand GetCommand();
        IDataReader GetReader();
    }
}


using System;
using System.Configuration;
using System.Data;
using System.Data.OleDb;

namespace MPAConsult.ToolBox.Data
{
    /// <summary>
    /// Summary description for DataStore.
    /// </summary>
    public class OleDbDataStore : MPAConsult.ToolBox.Data.IDataStore
    {
        private OleDbConnection conn;
        private string sql;

        public OleDbDataStore()
        {
            string connStr = ConfigurationSettings.AppSettings["db"];
            conn = new OleDbConnection(connStr);
        }

        public string Sql
        {
            get
            {
                return sql;
            }

            set
            {
                sql = value;
            }
        }

        protected void CheckSql()
        {
            if (Sql == null)
            {
                throw new NullReferenceException("Need to supply SQL-query before executing commands");
            }
        }

        public void Close()
        {
            if (conn.State == ConnectionState.Open)
            {
                try
                {
                    conn.Close();
                }
                catch (OleDbException exc)
                {
                    throw new DataStoreException(exc.Message, exc);
                }
            }
        }

        public void Open()
        {
            if (conn.State == ConnectionState.Closed)
            {
                try
                {
                    conn.Open();
                }
                catch (OleDbException exc)
                {
                    throw new DataStoreException(exc.Message, exc);
                }
            }
        }

        public void ExecuteNonQuery()
        {
            ExecuteNonQuery(false);
        }

        public void ExecuteNonQuery(bool keepOpen)
        {
            CheckSql();

            IDbCommand command = GetCommand();
           
            Open();

            try
            {
                command.ExecuteNonQuery();
            }
            catch (OleDbException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
            finally
            {
                if (!keepOpen)
                {
                    Close();
                }
            }
        }

        public object ExecuteScalar()
        {
            IDbCommand command = GetCommand();
            object o;

            Open();
           
            try
            {
                o = command.ExecuteScalar();
            }
            catch (OleDbException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
            finally
            {
                Close();
            }
           
            return o;
        }

        public IDbCommand GetCommand()
        {
            OleDbCommand command = new OleDbCommand();
            command.Connection = conn;

            if (Sql != null)
            {
                command.CommandText = Sql;
            }

            return command;
        }

        public IDataReader GetReader()
        {
            IDbCommand command = GetCommand();
            IDataReader reader;

            Open();
           
            try
            {
                reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (OleDbException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
           
            return reader;
        }
    }
}

----------------------------- Dette kan du sætte ind i en anden fil, der hvor du vil hente koderne (altså DB åbningen) :: Husk at havde inkluderet filen class.vb ...

IDataStore ds = new OleDbDataStore();
ds.Sql = "SELECT title FROM design"

IDataReader dr = ds.GetReader();

while (dr.Read()) {
  Response.Write( "<li>" )M
  Response.Write( dr( "title" ) );
}

dr.Close();

-------------------------------------------------------------

Hvis det er, så sig til, så bruger vi et andet eksempel end Cyberfessors lange kode :P
Avatar billede burningice Nybegynder
03. februar 2004 - 11:20 #15
han kan jo bare tage det og kompilere det out-of-the-box... og nej, jeg tror ikke han skal begynde at paste ovenstående kode ind i en .vb fil.. det bliver kompileren nok ikk eså glad for.
Avatar billede Slettet bruger
03. februar 2004 - 22:57 #16
Tak - jeg roder lige lidt mere med det og vender tilbage.
Avatar billede Slettet bruger
03. februar 2004 - 23:34 #17
Hej igen
Joo - jeg er da godt nok meget ny :-) Nu har jeg prøvet at lave en "dbconn.vb" fil, men når jeg prøver at complie den, får jeg følgende fejl:
c:\inetpub\wwwroot\dbconn.vb(6) : error BC30183: Keyword is not valid as an identifier.

    Public Share Function DBConnection (As OleDbConnection) (her er der bølgestregunder "As")
c:\inetpub\wwwroot\dbconn.vb(8) : error BC30002: Type 'system.Data.eleDB' is not defined.
    Dim DbConn As New system.data.oleDB(provider.....) (her er der bølgestreg under det sidste af database source stien)

Min .vb fil ser ud som følger:

Imports system

Namespace dbconnection

Public Class dbConn
    Public Shared Function DBConnection (As OleDbConnection)
       
        Dim DbConn As New System.Data.oleDB("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=c:\inetpub\wwwroot\database\cms.mdb")
        Return DbConn
   
    End Function
End Class

End Namespace

Håber i stadig har tålmodighed - jeg er i hvert fald lidt oppe og kører :-)
Avatar billede burningice Nybegynder
05. februar 2004 - 12:17 #18
husk at importere System.Data.OleDb også
Avatar billede Slettet bruger
06. februar 2004 - 09:29 #19
Det hjælper ikke
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester