1 0 Tag Archives: Tips & Tricks
post icon

TSQL – How to find missing or deleted table identity autoincrement values

In qualità di database designer, spesso creo la chiave primaria come identity autoincrement sulle tabelle del database ed alcune volte mi è capitato di dover trovare gli ID che sono stati cancellati, per cui interrompono la sequenza dell’identity autoincrement su campo chiave.
Per fare questo si può semplicemente creare una sequenza che va da 1 (oppure 0 in base al RESEED impostato) al MAX ID presente sulla tabella e, successivamente, mettere in LEFT JOIN questa sequenza con la tabella originaria.

Di seguito lo snippet per recuperare gli ID di un campo identity autoincrement che interrompono la sequenza di valori:

DECLARE @START_ID INT,  @MAXID INT

SET @START_ID = 1
SET @MAXID = (SELECT MAX(ID) FROM [TABLENAME_TO_CHECK])

DECLARE @SEQUENCE_TABLE TABLE (ID BIGINT)

--CREATE TABLE WITH ID FROM [@START_ID] TO [MAX TABLE ID]
WHILE @START_ID < @MAXID
	BEGIN
		INSERT INTO @SEQUENCE_TABLE VALUES(@START_ID)

		SET @START_ID = @START_ID + 1
	END

SELECT S.ID AS [MISSING ID] 
FROM @SEQUENCE_TABLE S 
		LEFT JOIN [TABLENAME_TO_CHECK] AS T ON  S.ID = T.ID
WHERE T.ID IS NULL
post icon

TFS find in files version history with Visual Studio 2010 and 2012

Recentemente ho avuto la necessità di cercare all’interno di tutte le versioni di file di un progetto TFS 2010 mediante Visual Studio 2010.

Cercando su Google ho trovato un’estensione sia di Visual Studio 2010 che 2012, sviluppata da Mattias Sköld, che consente di raggiungere l’obiettivo.

Vediamo in dettaglio come cercare all’interno di tutte le versioni di file su TFS 2010 con Visual Studio 2010.

Una volta installata l’estensione TFS Administrators Toolkit for VS 2010 raggiungiamo la funzionalità con tasto destro sulla root Collection di TFS dalla finestra Team Explorer come illustrato in Figura 1.

Figura 1

Figura 1

Al click su Find in Files si aprirà il seguente popup:

Figura 2

Figura 2

Come è possibile notare in Figura 2 la funzionalità consente di:

1) Selezionare il Team Project
2) Filtrare per tipo estensione file
3) Cercare o meno nella history dei file
4) Specificare il termine di ricerca (keywords) con le opzioni case sensitive ed espressioni regolari

post icon

TSQL – Passing a list to a Stored Procedure

 

Per diverse esigenze, spesso mi è capitato di dover inviare una lista di valori ad una Stored Procedure.
Per raggiungere questo obiettivo è possibile escogitare un workaround mediante la funzione TSQL nodes(XQuery) sui tipi di dato XML.

Vediamo due esempi per comprendere al meglio la soluzione proposta.

Esempio 1: Come inviare ad una Stored Procedure una lista di ID.

1 – Costruisco un XML che contiene la lista degli ID, come di seguito:

 
<MyIDList>
  <ID>1</ID>
  <ID>2</ID>
</MyIDList>

In C# posso costruire l’XML nel modo seguente:

XmlDocument xmlDoc = new XmlDocument();
XmlElement xElem;
		
//add root node
XmlElement xRoot = xmlDoc.CreateElement("MyIDList");
xmlDoc.AppendChild(xRoot);
		
//Add ID 1
xElem = xmlDoc.CreateElement("ID");
xElem.InnerText = "1";
xRoot.AppendChild(xElem);
//Add ID 2
xElem = xmlDoc.CreateElement("ID");
xElem.InnerText = "2";
xRoot.AppendChild(xElem);

2 – Invio alla Stored Procedure l’XML costruito.

In C# creo un DbParam come di seguito:

//@MyIDListXML
DbParameter dbParam = dbCommand.CreateParameter();
dbParam.ParameterName = "@MyIDListXML";
dbParam.DbType = DbType.Xml;
dbParam.Value = xmlDoc.InnerXml;  //Nota passo l'InnerXml
dbCommand.Parameters.Add(dbParam);		

3 – Recupero dal parametro @MyIDListXML la lista di ID in formato relazionale per poter effettuare qualsiasi tipo di operazione (JOIN, WHERE, etc.)

SELECT T.Item.value('.' , 'BIGINT') AS ID
FROM @MyIDListXML.nodes('//MyIDList/ID') AS T(Item)

Il risultato sarà una tabella con due valori, come mostrato in figura:

Esempio 2: Come inviare una tabella ad una Stored Procedure.

1 – Costruisco un XML che rappresenta la tabella da inviare:

 
<MyList>
	<item attributo1="value11" attributo2="value12" />
	<item attributo1="value21" attributo2="value22" />
</MyList>

In C# posso contruire l’XML nel modo seguente:

 
XmlDocument xmlDoc = new XmlDocument();
XmlElement xElem;

//add root node
XmlElement xRoot = xmlDoc.CreateElement("MyList");
xmlDoc.AppendChild(xRoot);

//add item 1
xElem = xmlDoc.CreateElement("item");
xElem.SetAttribute("attributo1", "value11");
xElem.SetAttribute("attributo2", "value12");
xRoot.AppendChild(xElem);

//add item 2
xElem = xmlDoc.CreateElement("item");
xElem.SetAttribute("attributo1", "value21");
xElem.SetAttribute("attributo2", "value22");
xRoot.AppendChild(xElem);

2 – Invio alla Stored Procedure l’XML costruito.

In C# creo un DbParameter come di seguito:

 
//@MyListXML
DbParameter dbParam = dbCommand.CreateParameter();
dbParam.ParameterName = "@MyListXML";
dbParam.DbType = DbType.Xml;
dbParam.Value = xmlDoc.InnerXml;  //Nota passo l'InnerXml
dbCommand.Parameters.Add(dbParam);		

3 – Recupero dal parametro @MyListXML la lista di ID in formato relazionale per poter effettuare qualsiasi tipo di operazione (JOIN, WHERE, etc.)

 
SELECT T.Item.value('@attributo1' , 'varchar(10)') AS Attributo1,
	T.Item.value('@attributo2' , 'varchar(10)') AS Attributo2
FROM @MyListXML.nodes('//MyList/item') AS T(Item)

Il risultato sarà una tabella con i valori come mostrato in figura:

E’ possibile inviare qualsiasi struttura XML e lavorare lato SQL Engine con la funzione nodes(XQuery).

26 aprile 2013 @ 15:43
post icon

Sharepoint 2010 List Event Receiver SPContext.Current is null

Quando si sviluppa un Event Receiver su una generica lista Sharepoint non è possibile ottenere l’istanza di SPWeb dal contesto corrente mediante l’istruzione seguente:

SPWeb web = SPContext.Current.Web;

poichè viene eseguito in un contesto differente, e dunque SPContext.Current = null.

Per ovviare a questo problema è sufficiente far riferimento al parametro SPItemEventProperties ricevuto, e quindi ottenendo un’istanza di SPWeb come di seguito:

using (SPWeb web = properties.OpenWeb())
{
  // do stuff
}
post icon

Microsoft Visio 2007-2010 has stopped working

 

Lavorando su Microsoft Visio 2010 mi è capitato spesso di ricevere il seguente errore: Microsoft Visio 2007-2010 has stopped working..

Ho dovuto cercare su vari forum prima che riuscissi a trovare una soluzione, così ho deciso di scrivere un post a vantaggio di tutti gli utenti della Rete.
Il problema si verificava con Visio 2010, mo ho avuto modo di vedere che si verificava anche con Visio 2007, è che si interrompeva continuamente segnalando il seguente errore:
“Microsoft Visio has stopped working; A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available”
Questo problema si verifica a causa del fallimento dell’Add-in “Send to Bluetooth” sia in Microsoft Visio 2007 che in  Microsoft Visio 2010 sul sistema operativo Windows Vista e Windows 7.
Soluzione:
C’è bisogno di disabilitare l’Add-in “Send to Bluetooth” e per fare ciò bisogna avviare Microsoft Visio con permessi di Amministratore.
Una volta fatto ciò seguire i seguenti passaggi:
– Posizionarsi nella cartella di installazione di Visio (presumibilmente C:\Program Files (x86)\Microsoft Office\Office14 per Visio 2010)
– Click con tasto destro Visio.exe, e selezionare “Run as Administrator”.
– Una volta avviato visio come Amministratore andare in Options (o Tools nella versione Visio 2007) > Add-ins.
– In basso al popup di Add-in, selezionare COM Add-ins nel menu a tendina, quindi click su GO.
– Deselezionare il checkbox “Send to Bluetooth”.
– Fare click su OK, e riavviare Visio.
A questo punto non si dovrebbe presentare nuovamente il problema.