De widgets, met hun grootte en positie, worden in elk gebruikersprofiel opgeslagen in de kolom WIDGETS van de tabel USERS. De inhoud is een XML-weergave van een .net DataSet.
Om de widgets van gebruiker A toe te passen op gebruiker B, hoef je alleen maar een verzoek van dit type uit te voeren
declare @widgets varchar(MAX)
select @widgets = widgets from USERS where id='..A...'
update USERS set widgets = @widgets where id = '... B...'
Met deze query kan de XML-inhoud van een record in de tabel USERS gemakkelijk worden gelezen:
SELECT x.value('file[1]','VARCHAR(100)') AS [file],x.value('location[1]/X[1]','smallint') AS [location.X],x.value('location[1]/Y[1]','smallint') AS [location.Y],x.value('className[1]','VARCHAR(100)') AS className,x.value('size[1]/Width[1]','smallint') AS [size.Width],x.value('size[1]/Height[1]','int') AS [size.Height]
FROM @xml.nodes('/NewDataSet/Widgets') as T(x)
Deze andere query geeft de XML-inhoud weer voor alle records in de tabel USERS waar die inhoud bestaat:
select id,nom,x.value('file[1]','VARCHAR(100)') AS [file],x.value('location[1]/X[1]','smallint') AS [location.X],x.value('location[1]/Y[1]','smallint') AS [location.Y],x.value('className[1]','VARCHAR(100)') AS className,x.value('size[1]/Width[1]','smallint') AS [size.Width],x.value('size[1]/Height[1]','int') AS [size.Height]
FROM (select id,nom,CAST(widgets as xml) as xmlcol from USERS where widgets<>'') txml
cross apply txml.xmlcol.nodes('/NewDataSet/Widgets') as T(x)
In de onderstaande C#-code laten we zien hoe we de widgets van de actieve gebruiker kunnen wijzigen door de XML-inhoud van USERS.WIDGETS voor die gebruiker aan te passen.
string widgets = MercatorUi.Globals.CurrentUserRecord.WIDGETS;
DataTable dt;
if (string.IsNullOrEmpty(widgets))
{
dt = new DataTable("Widgets");
dt.Columns.Add("file", typeof(string));
dt.Columns.Add("location", typeof(System.Drawing.Point));
dt.Columns.Add("className", typeof(string));
dt.Columns.Add("size", typeof(System.Drawing.Size));
}
else
{
DataSet ds = Api.DataSetFromXmlString(widgets);
dt = ds.Tables[0];
}
// hier brengen we wijzigingen aan in de DataTable dt
string widgetsNew;
if (dt.Rows.Count == 0)
widgetsNew = "";
else
widgetsNew = Api.DataTableToXmlString(dt);
using (SqlCommand cmd = new SqlCommand("update USERS set widgets = @widgetsNew where id = @id"))
{
cmd.Parameters.AddWithValue("@widgetsNew", widgetsNew).SqlDbType = SqlDbType.VarChar;
cmd.Parameters.AddWithValue("@id", Globals.UserId).SqlDbType = SqlDbType.Char;
Api.SqlExec(MercatorUi.Globals.RepData, cmd);
}