Seguint amb la sèrie de la clsDades aquesta és la funció que s'encarrega d'obtenir de la BBDD una pàgina de registres, ordenats d'una forma determinada i filtrats si cal. Fa servir la SP QUERY per fer-ho, en realitat la SP és la que fa tota la feina, la clsDades només té la invocació a aquesta SP. Així que ha de fer servir la variable ParamsQUERY per informar-ne els paràmetres, a més a més hi ha uns paràmetres fixes que són:
- SortColumn: Columna per la que s'ordena (haurà de coincidir amb alguna de les que té la SP). En el literal de la columna també està informat el sentit, ascendent o descendent.
- PageSize: Mida de la pàgina, en número de registres, 5, 10, 20...
- PageNum: Número de la pàgina que es vol, la 1, 2, 3...
A més a més d'aquests paràmetres d'entrada la SP té un valor important de sortida que cal recollir, el número total de registres un cop filtrat (sense paginar). Es podria fer amb un COUNT però seria fer el filtre dues vegades, dins de la SP ja es calcula i llavors només es fa un cop. Aquest valor és important per calcular el número total de pàgines donat un filtre a una taula. En la funció és el paràmetre NumTotRegs, que està declarat de sortida. Com sempre el codi:
public DataTable QUERY(Dictionary<string, string> Params, out int NumTotRegs)
{
SqlDataReader Reader = null;
DataTable Result = new DataTable();
SqlCommand SqlComm = new SqlCommand();
SqlParameter SqlParam;
bool LocalConn;
SqlConnection Conn = null;
if (SQLConn == null)
{
LocalConn = true;
Conn = new SqlConnection(CadConnBBDD);
Conn.Open();
}
else
{
LocalConn = false;
Conn = SQLConn;
}
SqlComm.Connection = Conn;
SqlComm.CommandTimeout = 120;
if (SQLTrans != null) SqlComm.Transaction = SQLTrans;
foreach (clsCamp Camp in ParamsQUERY)
{
SqlParam = CreaParametre(Camp, false);
if (Params.Keys.Contains(Camp.NomCamp))
{
if (string.IsNullOrEmpty(Params[Camp.NomCamp])) SqlParam.Value = DBNull.Value;
else SqlParam.Value = Params[Camp.NomCamp];
}
else SqlParam.Value = DBNull.Value;
SqlComm.Parameters.Add(SqlParam);
}
SqlComm.CommandType = CommandType.StoredProcedure;
SqlParameter pSortColumn = new SqlParameter("pSortColumn", SqlDbType.NVarChar, 50);
pSortColumn.Direction = ParameterDirection.Input;
pSortColumn.Value = Params["SortColumn"];
SqlComm.Parameters.Add(pSortColumn);
SqlParameter pPageSize = new SqlParameter("pPageSize", SqlDbType.Int);
pPageSize.Direction = ParameterDirection.Input;
pPageSize.Value = Params["PageSize"];
SqlComm.Parameters.Add(pPageSize);
SqlParameter pPageNum = new SqlParameter("pPageNum", SqlDbType.Int);
pPageNum.Direction = ParameterDirection.Input;
pPageNum.Value = Params["PageNum"];
SqlComm.Parameters.Add(pPageNum);
SqlComm.CommandText = spQUERY;
Reader = SqlComm.ExecuteReader();
Result.Load(Reader);
Reader.Close();
if (Result.Rows.Count > 0)
{
NumTotRegs = int.Parse(Result.Rows[0]["NumRegs"].ToString());
}
else
{
NumTotRegs = 0;
}
if (LocalConn)
{
Conn.Close();
Conn.Dispose();
Conn = null;
}
return Result;
}
|