Avatar billede martinbk Nybegynder
13. oktober 2005 - 09:30 Der er 3 kommentarer og
1 løsning

Transaktioner over flere SqlCommand objecter

Hejsa jeg har lavet følgende klasse til håndtering af mine database kald

public class DbHandler
    {
        private static string ip;
        private static string port;
        private static string iniCatalog;
        private static string userLogin;
        private static string userPassword;

        public DbHandler(string dbName, string login, string password, string ip, string port)
        {
            DbHandler.ip = ip;
            DbHandler.port = port;
            DbHandler.userLogin = login;
            DbHandler.userPassword = password;
            DbHandler.iniCatalog = dbName;
        }

        private static SqlConnection NewConnection()
        {
            return new SqlConnection("workstation id="+ip+";packet size=4096;integrated security=SSPI;data source="+ip+";initial catalog="+iniCatalog+"; user id="+userLogin+"; password="+ userPassword +";");
        }

        public DataSet doQuery(string sql)
        {
            DataSet ds = null;
            SqlCommand cmd = null;
            try
            {
                cmd = new SqlCommand();
                cmd.Connection = NewConnection();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                ds = new DataSet("set");
                IDbDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = cmd;
                adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                adapter.Fill(ds);
                if(ds.HasErrors)
                {
                    ds.RejectChanges();
                }
                else
                {
                    ds.AcceptChanges();
                }
                if(adapter is IDisposable)
                {
                    ((IDisposable) adapter).Dispose();
                }
            }
            catch (SqlException)
            {
                throw new DataBaseException();
            }
            finally
            {
                cmd.Connection.Close();
            }
            return ds;
        }

        public int doNonQuery(string sql)
        {
            int affectedRows = 0;
            SqlCommand cmd = null;
            try
            {
                cmd = new SqlCommand();
                cmd.Connection = NewConnection();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                cmd.Connection.Open();
                affectedRows = cmd.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                throw new DataBaseException();
            }
            finally
            {
                cmd.Connection.Close();
            }
            return affectedRows;
        }

        public object doScalar(string sql)
        {
            object output = null;
            SqlCommand cmd = null;
            try
            {
                cmd = new SqlCommand();
                cmd.Connection = NewConnection();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql;
                cmd.Connection.Open();
                output = cmd.ExecuteScalar();
            }
            catch (SqlException)
            {
                throw new DataBaseException();
            }
            finally
            {
                cmd.Connection.Close();
            }
            return output;
        }
}

nu vil jeg som overskriften siger gerne knytte transaktioner til, så jeg kan lave f.eks. en beginTransaction metode, hvorefter jeg så kan kalde n doQuery, doNonQuery etc. hvorefter jeg kan kalde enten commit eller rollback, mit problem er jeg ikke helt kan overskue hvordan jeg får knytten flere af mine metoder ind i en transaction på den samme connection

håber nogen sidder med den gyldne løsning :)
Avatar billede erikjacobsen Ekspert
13. oktober 2005 - 09:44 #1
Du skal nok lave din connection i din constructor, og bruge denne til doQuery og doNonQuery, uden at lukke den.
Avatar billede etif Nybegynder
02. november 2005 - 13:33 #2
Udover at holde din connection åben til du er færdig skal du også tilknyttet et transactions object til de involverede kommandoer:

1) Lav et transactionsobject
2) Tildel det værdi med begintransaction
3) Tilknyt objectet til de involdverede kommandoer

F.eks
System.Data.SqlClient.SqlTransaction myTrans = null;
myTrans = myConn.BeginTransaction();
cmd.Transaction = myTrans;

myConn er din connection som selvfølgelig ikke må lukkes før du er færdig med transactionen.

Håber at dettte vil hjælpe dig.
Avatar billede martinbk Nybegynder
04. januar 2008 - 01:09 #3
etif selvom dette er et gammelt spørgsmål fik jeg bakset en løsning sammen på baggrund af dine forslag, vil du ligge et svar ?
Avatar billede etif Nybegynder
07. januar 2008 - 09:13 #4
Glad for at det hjalp.
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