webForumDet fria alternativet

hur få in parameters i dal

.NET

6 svar · 664 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

det känns som om jag snöat in mig! så det är bäst att fråga expertisen! :)

jag vill få in ett antal sqlparametrar i mitt dal och har nu så här:

        private ArrayList _parameters = null;

        public DataTable GetTable(string selectCommand)
        {
            SqlConnection connection = new SqlConnection(_ConnectionString);
            SqlCommand command = new SqlCommand(selectCommand, connection);
            command.CommandType = CommandType.StoredProcedure;

            SqlDataAdapter dataAdapter = null;
            DataTable dataTable = null;

            if(_parameters != null)
                foreach (SqlParameter p in _parameters)
                    command.Parameters.Add(p);

            //fyller datatable osv...

            return dataTable;
        }

        public void AddInParameter(string ParamName, SqlDbType DbType, object Value)
        {
            if (_parameters == null)
                _parameters = new ArrayList();

            SqlParameter param = new SqlParameter(ParamName, DbType);
            param.Direction = ParameterDirection.Input;
            param.Value = Value;
            _parameters.Add(param);
        }
            DataManager dm = new DataManager();
            dm.AddInParameter("@para1", System.Data.SqlDbType.NVarChar, foo);
            dm.AddInParameter("@para2", System.Data.SqlDbType.NVarChar, bar);
            DataTable dt = dm.GetTable("[spnamnet]");

det som känns fel är att jag samlar parametrarna i en otypad arraylist (jag har inte ens vågat testköra om koden funkar!) :l
så, hur skulle ni gjort? :)

Medlem sedan maj 20012 812 inlägg
#2

Jag hade haft en lista med IDbParameter istället.

List<IDbParameter> ParameterList = new List<IDbParameter>()

Då är din lista typsäker, samt att om du vill ändra från Sql till MySql så slipper du tänka på din lista eftersom den tar emot Interfacet och inte själva typen. Nu vet jag inte om den heter IDbParameter eller IParameter eller IDataParameter, men du hittar den säkert.

- M

Medlem sedan feb. 200093 inlägg
#3

Hur går det för dig doggelito? Har du fått til l det? Jag är lite nyfiken på lösningen nämligen :)

Medlem sedan juni 20003 076 inlägg
#4

Tjaba!
Jag har inte haft tid att testa tidigare men jag tvivlade aldrig på att Gladhs kod inte skulle funka, och visst gör den det! Tack Gladh! :bire

Coercri, så här blev det:
DAL

public class DataManager
    {
        private List<IDataParameter> _parameterList;

        public void AddInParameter(string ParamName, SqlDbType DbType, object Value)
        {
            if (_parameterList == null)
                _parameterList = new List<IDataParameter>();

            SqlParameter param = new SqlParameter(ParamName, DbType);
            param.Direction = ParameterDirection.Input;
            param.Value = Value;
            _parameterList.Add(param);
        }

        public DataTable GetTable(string selectCommand)
        {
            SqlConnection connection = new SqlConnection(_ConnectionString);
            SqlCommand command = new SqlCommand(selectCommand, connection);
            command.CommandType = CommandType.StoredProcedure;

            SqlDataAdapter dataAdapter = null;
            DataTable dataTable = null;

            
            if(_parameterList != null)
                foreach (SqlParameter p in _parameterList)
                    command.Parameters.Add(p);

            //fyll table osv......
        }
    }

Sen testade jag att bara binda en repeater, koden ska naturligtvis ligga i Affärslagret vid produktion.
BLL

        DataManager dm = new DataManager();

        dm.AddInParameter("@parameter1", SqlDbType.NVarChar, "test");
        dm.AddInParameter("@parameter2", SqlDbType.NVarChar, "test2");
        dm.AddInParameter("@parameter3", SqlDbType.Int, 0);

        DataTable source = dm.GetTable("storedprocedure_namn");

        Repeater1.DataSource = source;
        Repeater1.DataBind();

Det jag kan tycka vara lite förvirrande med detta är att IDataParametern tillåter en sqlparameter som värde.
Jag får nog ta och läsa på lite om gränssnitt över julen! :)

Medlem sedan jan. 20022 440 inlägg
#5

Hmm, jag är fortfarande ute och svävar i det blå när när det gäller det här. Jag har ungefär samma.

Jag kör ju med en IList för att binda datan till mina objekt. iDataParameter är ju typoberoende om jag förstått det rätt. Dvs du kan stoppa in vilken jäkla parameter som helst i den funktionen. Så länge din GetTable använder sig av SqlParameter så är det lugnt. Det jag hade gjort om jag var du vore att kolla vilken typ av parameter det är den ska lägga till något i stil med följande så att din kod blir ännu mer återanvändningsbar

public void AddInParameter(string ParamName, SqlDbType DbType, object Value)
{
	if (_parameterList == null)
		_parameterList = new List<IDataParameter>();
	{
		if (DbType.Equals(typeof(SqlDbType)))
		{
			SqlParameter param = new SqlParameter(ParamName, DbType);
			param.Direction = ParameterDirection.Input;
			param.Value = Value;
			_parameterList.Add(param);
		}
	}
}

Vet inte om det blir det bästa och det är otestat men om du gör på det viset från början kommer du lätt kunna byta ut datakällor i framtiden.

Medlem sedan juni 20003 076 inlägg
#6

Mm, det har du helt rätt i! :)
Jag måste också bygga om min GetTable-metod, för nu är den låst på sqlserver.

Man skulle kanske ha ett huvud-DAL och sedan ärva ner det i ett sql-DAL (om det är sql man använder) eller i ett oracle-DAL osv. för att slippa hundra if-satser? Eller? :stud

Medlem sedan jan. 20022 440 inlägg
#7

doggelito skrev:

Man skulle kanske ha ett huvud-DAL och sedan ärva ner det i ett sql-DAL (om det är sql man använder) eller i ett oracle-DAL osv. för att slippa hundra if-satser? Eller? :stud

Errm jo det förstås! Det blir ju inte så snyggt med en massa if-satser.

279 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
156 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)