Avatar billede dr_chaos Nybegynder
09. juni 2005 - 17:57 Der er 6 kommentarer og
1 løsning

Er der noget som skal ændres i denne fil

Jeg har en fil jeg bruger til at afvikle stored procedures med.
Filen er en jeg har fra en bog.
Den er lavet i c# og er lavet til Framework 1.0 eller 1.1.
Min situation er at jeg nu skal til at arbejde med framework 2.0 og derfor vil jeg gerne høre om der er nogen steder i min fil at det vil være værd at opdatere eller ændre koden. Det jeg tænker på er om der er nogen af de enkelte funktioner som med fordel kan ændres eller opdateres.
Hvis du har et foreslag til en anden klasse jeg kan benytte til samme formål så må du meget gerne poste den.


Kildekode:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DbObject
{
    /// <summary>
    /// DbObject is the class from which all classes in the Data Services
    /// Tier inherit. The core functionality of establishing a connection
    /// with the database and executing simple stored procedures is also
    /// provided by this base class.
    /// </summary>
    public class DbObject
    {
        protected SqlConnection Connection;
        private string connectionString;

        /// <summary>
        /// A parameterized constructor, it allows us to take a connection
        /// string as a constructor argument, automatically instantiating
        /// a new connection.
        /// </summary>
        /// <param name="newConnectionString">Connection String to the associated database</param>
        public DbObject( string ConnectionString )
        {
            connectionString = ConfigurationSettings.AppSettings["ConnectionString"];
            Connection = new SqlConnection( connectionString );
        }

        /// <summary>
        /// Protected property that exposes the connection string
        /// to inheriting classes. Read-Only.
        /// </summary>
        protected string ConnectionString
        {
            get
            {
                return connectionString;
            }
        }

        /// <summary>
        /// Private routine allowed only by this base class, it automates the task
        /// of building a SqlCommand object designed to obtain a return value from
        /// the stored procedure.
        /// </summary>
        /// <param name="storedProcName">Name of the stored procedure in the DB, eg. sp_DoTask</param>
        /// <param name="parameters">Array of IDataParameter objects containing parameters to the stored proc</param>
        /// <returns>Newly instantiated SqlCommand instance</returns>
        private SqlCommand BuildIntCommand(string storedProcName, IDataParameter[] parameters)
        {
            SqlCommand command = BuildQueryCommand( storedProcName, parameters );           

            command.Parameters.Add( new SqlParameter ( "ReturnValue",
                SqlDbType.Int,
                4, /* Size */
                ParameterDirection.ReturnValue,
                false, /* is nullable */
                0, /* byte precision */
                0, /* byte scale */
                string.Empty,
                DataRowVersion.Default,
                null ));

            return command;
        }


        /// <summary>
        /// Builds a SqlCommand designed to return a SqlDataReader, and not
        /// an actual integer value.
        /// </summary>
        /// <param name="storedProcName">Name of the stored procedure</param>
        /// <param name="parameters">Array of IDataParameter objects</param>
        /// <returns></returns>
        private SqlCommand BuildQueryCommand(string storedProcName, IDataParameter[] parameters)
        {
            SqlCommand command = new SqlCommand( storedProcName, Connection );
            command.CommandType = CommandType.StoredProcedure;

            foreach (SqlParameter parameter in parameters)
            {
                command.Parameters.Add( parameter );
            }

            return command;

        }

        /// <summary>
        /// Runs a stored procedure, can only be called by those classes deriving
        /// from this base. It returns an integer indicating the return value of the
        /// stored procedure, and also returns the value of the RowsAffected aspect
        /// of the stored procedure that is returned by the ExecuteNonQuery method.
        /// </summary>
        /// <param name="storedProcName">Name of the stored procedure</param>
        /// <param name="parameters">Array of IDataParameter objects</param>
        /// <param name="rowsAffected">Number of rows affected by the stored procedure.</param>
        /// <returns>An integer indicating return value of the stored procedure</returns>
        protected int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected )
        {
            int result;

            Connection.Open();
            SqlCommand command = BuildIntCommand( storedProcName, parameters );
            rowsAffected = command.ExecuteNonQuery();
            result = (int)command.Parameters["ReturnValue"].Value;
            Connection.Close();
            return result;
        }

        /// <summary>
        /// Will run a stored procedure, can only be called by those classes deriving
        /// from this base. It returns a SqlDataReader containing the result of the stored
        /// procedure.
        /// </summary>
        /// <param name="storedProcName">Name of the stored procedure</param>
        /// <param name="parameters">Array of parameters to be passed to the procedure</param>
        /// <returns>A newly instantiated SqlDataReader object</returns>
        protected SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters )
        {
            SqlDataReader returnReader;

            Connection.Open();
            SqlCommand command = BuildQueryCommand( storedProcName, parameters );
            command.CommandType = CommandType.StoredProcedure;

            returnReader = command.ExecuteReader();
            //Connection.Close();
            return returnReader;
        }

        /// <summary>
        /// Creates a DataSet by running the stored procedure and placing the results
        /// of the query/proc into the given tablename.
        /// </summary>
        /// <param name="storedProcName"></param>
        /// <param name="parameters"></param>
        /// <param name="tableName"></param>
        /// <returns></returns>
        protected DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName )
        {
            DataSet dataSet = new DataSet();
            Connection.Open();
            SqlDataAdapter sqlDA = new SqlDataAdapter();
            sqlDA.SelectCommand = BuildQueryCommand( storedProcName, parameters );
            sqlDA.Fill( dataSet, tableName );
            Connection.Close();

            return dataSet;
        }

        /// <summary>
        /// Takes an -existing- dataset and fills the given table name with the results
        /// of the stored procedure.
        /// </summary>
        /// <param name="storedProcName"></param>
        /// <param name="parameters"></param>
        /// <param name="dataSet"></param>
        /// <param name="tableName"></param>
        /// <returns></returns>
        protected void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataSet, string tableName )
        {
            Connection.Open();
            SqlDataAdapter sqlDA = new SqlDataAdapter();
            sqlDA.SelectCommand = BuildIntCommand( storedProcName, parameters );
            sqlDA.Fill( dataSet, tableName );
            Connection.Close();           
        }


    }
}
Avatar billede arne_v Ekspert
09. juni 2005 - 22:11 #1
2.0 ligger lidt mere op til at man undgår de database specifikke klasser

men med stored procedures så er det nok ikke så relevant
Avatar billede dr_chaos Nybegynder
10. juni 2005 - 10:31 #2
så du vil mene at jeg sagtens kan fortsætte med at bruge dbobject klassen her ?
Jeg kører kun med SP.
Avatar billede arne_v Ekspert
10. juni 2005 - 10:33 #3
der er ikke noget som springer i øjnene på mig

det kan gøres på andre måder, men ....
Avatar billede dr_chaos Nybegynder
10. juni 2005 - 11:08 #4
Kan det gøres på en smartere måde ?
Avatar billede arne_v Ekspert
10. juni 2005 - 17:02 #5
måske ikke smartere - bare anderledes

når du gemmer connection kunne du jo også gemme data adapter

man kan bruge data reader fremfor data adapter og data set

man kunne sætte en lock ind for at undgå multithreaded problemer

den slags
Avatar billede dr_chaos Nybegynder
11. juni 2005 - 17:50 #6
ok det vil jeg kigge på.
smid et svar.
Avatar billede arne_v Ekspert
11. juni 2005 - 17:56 #7
ok
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