Avatar billede simsen Mester
07. maj 2011 - 00:33 Der er 4 kommentarer og
1 løsning

Omgå CLR spørgsmål ifm. connection til ms sql database

Hej,

Da jeg startede ud med at tilgå sql database, fik jeg i tidernes morgen fejl at clr ikke var enabled....Dette gjorde jeg så - ingen ko på isen der....Og nej, jeg tænkte ikke en tanke om hvorfor, hvordan og hvorledes....

Jeg har aldrig haft problemet de steder, jeg har arbejdet (der har den højst sansynligt været enabled)

Nu er jeg kommet i den sitation, at jeg har lavet et fint program, som skal køre på UnoEuro.com.....og de er ikke til at hugge og stikke i.

Rigtig gættet - nu får jeg fejlen igen....Nu må jeg så ændre min kode, så det ikke er nødvendigt med at enable clr....men jeg har ingen anelse om, hvad jeg skal kigge efter.

Nogen der kan sige mig, hvor det går galt i min kode og hvad jeg skal rette det til?

Min DBUtility:

namespace AnsiBase.DAL
{
    /// <summary>
    /// DBUtility is a class that takes the common data classes and allows you
    /// to execute commands, add parameters, and return datasets and datatables.
    /// </summary>
    ///
    public class DBUtility
    {
        #region " Private Members "

        private string _connectionstring = "";
        private SqlConnection _connection;
        private SqlCommand _command;
        private int _commandTimeout = 30;

        #endregion

        public DBUtility()
        {
            try
            {
                _connectionstring = System.Configuration.ConfigurationManager.ConnectionStrings["AnsiDB"].ToString();

                _connection = new SqlConnection(_connectionstring);
                _command = new SqlCommand();
                _command.CommandTimeout = _commandTimeout;
                _command.Connection = _connection;
            }
            catch(Exception ex)
            {
                throw new Exception("Error initializing data class. " + Environment.NewLine + ex.Message);
            }
        }       

        # region " Methods "

        /// <summary>
        /// Clean up Connection and Command object
        /// </summary>
        private void Dispose()
        {
            try
            {
                //Clean up Connection Object
                if (_connection != null)
                {
                    if (_connection.State != ConnectionState.Closed)
                    {
                        _connection.Close();
                    }
                    _connection.Dispose();
                }

                //Clean up Command Object
                if (_command != null)
                {
                    _command.Dispose();
                }
            }
            catch(Exception ex)
            {
                throw new Exception("Error disposing data class." + Environment.NewLine + ex.Message);
            }
        }       

        #region " Parameters "

        /// <summary>
        /// Creates a parameter and adds it to the command object
        /// </summary>
        /// <param name="name">The parameter name</param>
        /// <param name="value">The paremeter value</param>
        public void AddParameter(string name, object value)
        {
            try
            {
                SqlParameter parm = new SqlParameter();

                parm.ParameterName = name;
                parm.Value = value;

                _command.Parameters.Add(parm);
            }
            catch(Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// Creates a parameter and adds it to the command object
        /// </summary>
        /// <param name="name">The parameter name</param>
        /// <param name="value">The paremeter type</param>
        /// <param name="size">The paremeter size</param>
        public void AddParameter(string name, SqlDbType type, object value)
        {
            try
            {
                SqlParameter parm = new SqlParameter();

                parm.ParameterName = name;               
                parm.Value = value;
                parm.SqlDbType = type;

                _command.Parameters.Add(parm);
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// Set the value of parameter
        /// </summary>
        /// <param value="value">The parameter value</param>
        public void SetParameterValue(string name, object value)
        {
            try
            {
                _command.Parameters[name].Value = value;
            }
            catch(Exception)
            {
                throw;
            }
        }
       

        #endregion

        #region " Transactions "

        /// <summary>
        /// Starts a transaction for the command object
        /// </summary>
        private void BeginTransaction()
        {
            if (_connection.State == System.Data.ConnectionState.Closed)
            {
                _connection.Open();
            }
            _command.Transaction = _connection.BeginTransaction();
        }

        /// <summary>
        /// Commits a transaction for the command object
        /// </summary>
        private void CommitTransaction()
        {
            _command.Transaction.Commit();
            _connection.Close();
        }

        /// <summary>
        /// Rolls back the transaction for the command object
        /// </summary>
        private void RollbackTransaction()
        {
            _command.Transaction.Rollback();
            _connection.Close();
        }

        #endregion

        #region " Execute database functions "

        /// <summary>
        /// Executes a statement that does not return a result set, such as an INSERT, UPDATE, DELETE, or a data definition statement
        /// </summary>
        /// <param name="query">The query as StoredProcedure</param>
        public void ExecuteNonQuery(string query, CommandType commandtype)
        {
            _command.CommandText = query;
            _command.CommandTimeout = _commandTimeout;
            _command.CommandType = commandtype;

            try
            {
                if (_connection.State == System.Data.ConnectionState.Closed)
                {
                    _connection.Open();
                }

                _command.Connection = _connection;

                BeginTransaction();

                _command.ExecuteNonQuery();

                CommitTransaction();
            }
            catch (Exception)
            {
                RollbackTransaction();
                throw;
            }
            finally
            {               
                _command.Parameters.Clear();

                if (_connection.State == System.Data.ConnectionState.Open)
                {
                    Dispose();
                }
            }
        }

        /// <summary>
        /// Executes a statement that returns a single value.
        /// If this method is called on a query that returns multiple rows and columns, only the first column of the first row is returned.
        /// </summary>
        /// <param name="query">The query as StoredProcedure</param>
        /// <returns>An integer value</returns>
        public int ExecuteScaler(string query, CommandType commandtype)
        {
            object identity = 0;
           
            try
            {
                _command.CommandText = query;
                _command.CommandTimeout = _commandTimeout;
                _command.CommandType = commandtype;

                if (_connection.State == System.Data.ConnectionState.Closed)
                {
                    _connection.Open();
                }

                _command.Connection = _connection;

                BeginTransaction();

                identity = _command.ExecuteScalar();

                CommitTransaction();
            }
            catch (Exception)
            {
                RollbackTransaction();
                throw;
            }
            finally
            {               
                _command.Parameters.Clear();

                if (_connection.State == System.Data.ConnectionState.Open)
                {
                    Dispose();
                }
            }

            return Convert.ToInt32(identity);
        }

        /// <summary>
        /// Executes a SQL statement that returns a result set.
        /// </summary>
        /// <param name="query">The query, either SQL or Procedures</param>
        /// <returns>A datareader object</returns>
        public SqlDataReader ExecuteReader(string query)
        {
            //command.CommandText = query;
            //command.CommandType = commandtype;
            SqlDataReader reader = null;
            try
            {
                if (_connection.State == System.Data.ConnectionState.Closed)
                {
                    _connection.Open();
                }

                SqlCommand myCommand = new SqlCommand(query, _connection);
                reader = myCommand.ExecuteReader();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                _command.Parameters.Clear();

                if (_connection.State == System.Data.ConnectionState.Open)
                {
                    Dispose();
                }
            }

            return reader;
        }

        /// <summary>
        /// Generates a dataset
        /// </summary>
        /// <param name="query">The query, either SQL or Procedures</param>
        /// <param name="commandtype">The command type, text, storedprocedure, or tabledirect</param>
        /// <param name="connectionstate">The connection state</param>
        /// <returns>A dataset containing data from the database</returns>
        public DataSet GetDataSet(string query, CommandType commandtype)
        {
            _command.CommandText = query;
            _command.CommandTimeout = _commandTimeout;
            _command.CommandType = commandtype;

            SqlDataAdapter adpt = new SqlDataAdapter(_command);

            DataSet ds = new DataSet();


            try
            {
                if (_connection.State == System.Data.ConnectionState.Closed)
                {
                    _connection.Open();
                }

                adpt.Fill(ds);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                _command.Parameters.Clear();

                if (_connection.State == System.Data.ConnectionState.Open)
                {
                    Dispose();
                }
            }

            return ds;
        }

        /// <summary>
        /// Generates a datatable
        /// </summary>
        /// <param name="query">The query, either SQL or Procedures</param>
        /// <param name="commandtype">The command type, text, storedprocedure, or tabledirect</param>
        /// <param name="connectionstate">The connection state</param>
        /// <returns>A dataset containing data from the database</returns>
        public DataTable GetDataTable(string query, CommandType commandtype)
        {
            _command.CommandText = query;
            _command.CommandTimeout = _commandTimeout;
            _command.CommandType = commandtype;

            SqlDataAdapter adpt = new SqlDataAdapter(_command);

            DataSet ds = new DataSet();

            try
            {
                if (_connection.State == System.Data.ConnectionState.Closed)
                {
                    _connection.Open();
                }

                adpt.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _command.Parameters.Clear();

                if (_connection.State == System.Data.ConnectionState.Open)
                {
                    Dispose();
                }
            }

            return ds.Tables[0];
        }

        #endregion

        #endregion

        #region enums

        /// <summary>
        /// A list of data providers
        /// </summary>
        public enum Providers
        {
            SqlServer,
            OleDB,
            ODBC,
            Oracle,
            MySQL
        }

        #endregion
    }
}

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

Min klasse, hvor jeg laver kaldet:

namespace Anja.Libriary
{
    public class Test
    {
        #region " Enums, Members, Properties "

        DBUtility DAL = new DBUtility();

        //public string bugName { get; set; }

        #endregion

        #region " Data Access Get "

        public DataTable GetTest()
        {
            //DAL.AddParameter("bugId", bugId);

            DataTable getData = DAL.GetDataTable("XXTestSelectUsersXX", CommandType.StoredProcedure);
            return getData;
        }

        #endregion
    }
}

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

Her bruger jeg så kode:

protected void Page_Load(object sender, EventArgs e)
    {
        Anja.Libriary.Test test = new Anja.Libriary.Test();
        DataTable getData = test.GetTest();

        ddlTest.DataSource = getData.DefaultView;
        ddlTest.DataBind();
    }

mvh
simsen :-)
Avatar billede Syska Mester
07. maj 2011 - 00:53 #1
Kommer den ikke med hvad linje det fejler på. Det ville gøre det hele meget nemmere at finde ud af hvad der præcist sker og måske hvorfor.

CLR enabled på en SQL server burde ikke være nødvendigt i 99% tilfælde. Det mener jeg har noget med custom .NET kode at gøre.

Hvis man læser her, så synes jeg ikke det giver mening at din kode kræver at du har det enabled. http://msdn.microsoft.com/en-us/library/ms254498.aspx

Der er ikke 3 parts libs eller noget ?

Eneste der er lidt mærkeligt er din transaction måske ... ved ikke om det måske kan være den.
Avatar billede simsen Mester
07. maj 2011 - 14:03 #2
Hejsa buzzzzz

Undskyld - det er min fejl, jeg ikke har fået med hvad linje den fejler i *flov*

Det er linje 380 og helt nøjagtig er det i det her tilfælde (jeg har jo lavet en testside - hvor jeg kun henter en table ud) i metoden GetDataTable i DBUtility:

public DataTable GetDataTable(string query, CommandType commandtype)
        {
            _command.CommandText = query;
            _command.CommandTimeout = _commandTimeout;
            _command.CommandType = commandtype;

            SqlDataAdapter adpt = new SqlDataAdapter(_command);

            DataSet ds = new DataSet();

            try
            {
                if (_connection.State == System.Data.ConnectionState.Closed)
                {
                    _connection.Open();
                }

                adpt.Fill(ds);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _command.Parameters.Clear();

                if (_connection.State == System.Data.ConnectionState.Open)
                {
                    Dispose();
                }
            }

            return ds.Tables[0];
        }

Og jo, jeg har også 3. parts libs i min side - men ingen jeg bruger på test siden....Og ikke mindst så er det her problem, et jeg har været vant til fra start, hvor jeg med sikkerhed ved, der ikke har været 3. parts libs med.

Nu noget sikkert meget dumt. Men jeg har altid troet jeg skulle enable clr fordi jeg i mine solutions includerede Storedprocedures (altså klassen) og brugte klassen til at kreere mine stored procedures istedet for at lave dem i SQL Manageren.

Disse er jo altså inkluderet stadig selvom jeg på den her test side ikke gør brug af dem - men trækker en stored procedure, jeg har lavet i SQL Mangeren. Kan det være dem, der giver fejlen, fordi de er includet i bin og dermed kører med systemet?
Avatar billede arne_v Ekspert
07. maj 2011 - 16:16 #3
CLR enablet goer at man kan skrive SP og UDF i C#/VB.NET (udover T-SQL).

CLR behoever ikke vaere enablet for at kalde en SP eller UDF skrevet i T-SQL.
Avatar billede simsen Mester
11. maj 2011 - 12:37 #4
buzzz

Jeg var så ikke helt ved siden af....at jeg havde clr enablet pga. mine storedprocedures.....Hvis jeg nu lidt oftere oprettede nye sites, ville jeg nok også kunne huske, at der ligefrem står  SQL CLR Database Projekt, når jeg opretter et DB projekt....

Og jo, jeg ved godt, der findes en nyere tilgang til det samme, men har ikke kigget nok på det endnu.... Det skal nok komme :-)

Men løsningen var at ændre mine stored procedures til normale af slagsen og fjerne SQL CLR DB projekterne fra solution.

Smid et svar og tak for dit svar - det ledte mig i den rigtige retning.....

Og så til det mega "sjove" - efter at have gjort ovennævnte, fik jeg mail fra web-hotellet......at de havde enablet CLR *griner*
Avatar billede Syska Mester
11. maj 2011 - 15:53 #5
Hahah ... great.

Måske de har fået flere mails omrking det, siden de har enabled det nu.

Men godt at det kom til at virke.
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