Messaggio vuoto all’avvio di SQL Server Management Studio Express

31 marzo 2009

Salve a tutti,

proprio oggi mi è capitato che dopo l’installazione di SQL Server Management Studio Express presso un cliente, quando sono andato a lanciarlo mi è comaprsa una message box vuota come questa:

MessageBox Vuota

ed anche ad ogni successivo avvio.

La soluzione è semplice, anche se non molto ben documentata da Microsoft.

1. Aprire installazione applicazioni dal pannello di controllo.
2. Cliccare su Microsoft .NET Framework 2.0.
3. Cliccare su Ripristina, e poi Avanti.
4. Quando il ripristino è completato, riavviare il computer, se viene richiesto.

Di solito questa anomalia accade se vengono installati degli aggiornamenti del .NET Framework 1.1 dopo che è stato installato il Framework 2.0.

 

Alla prossima

Errore ReportViewer

30 marzo 2009

Salve a tutti,

lavorando con il controllo ReportViewer di Microsoft in ambiente Windows Forms, ho riscontrato che c’è qualche problema nell’elaborazione dei report quando l’applicazione viene distibuita.

L’errore che viene fuori è questo:

An error occurred during local report processing.
The definition of the report ‘Main Report’ is invalid.  An unexpected error occurred in Report Processing. Could not load file or assembly ‘Microsoft.ReportViewer.ProcessingObjectModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ or one of its dependencies.
The system cannot find the file specified

Questo succede perché non viene trovato l’Assembly Microsoft.ReportViewer.ProcessingObjectModel.dll.

La soluzione è alquanto semplice…bastia copiare tale file nella cartella dell’applicazione e il gioco è fatto.

Per eseguire la copia occorre lavorare da una console e seguire questi semplici passaggi:

Andare nella cartella C:\WINDOWS\assembly\GAC_MSIL\Microsoft.ReportViewer.ProcessingObjectModel\8.0.0.0__b03f5f7f41d40a3a

Copiare il file Microsoft.ReportViewer.ProcessingObjectModel.dll nella cartella dell’applicazione.

Provare il funzionamento del report!

 

Ciao a tutti!!

UPDATE e DELETE fuori dal comune

28 marzo 2009

Ciao a tutti,

parliamo un attimo degli aggiornamenti e delle cancellazioni nelle tabelle!

Sembra del tutto normale scrivere 

DELETE FROM [Tabella] WHERE [Campo] = [Valore]

oppure

UPDATE [Tabella] SET [Campo] = [Valore] WHERE [Campo] = [Valore]

ma se dovessimo cancellare o aggiornare i dati di una tabella in base ai valori di un’altra come facciamo?

Potremmo scrivere delle query con 7 SELECT nidificate e 7 condizioni di esistenza, ma oltre a diventare matti per scriverle e stare attenti a non distruggere i dati, il DB impiegherebbe un sacco di tempo ad eseguirle…beh…ci viene in aiuto l’istruzione MERGE.

Con questa istruzione infatti possiamo aggiornare, inserire o cancellare i dati in una tabella facendola “matchare” (passatemi il termine) con un’altra, oppure con una SELECT ad hoc per restituire solo i dati che effettivamente ci servono.

Passiamo alla pratica.

Creiamo una tabella di prova

CREATE TABLE test1 AS
SELECT object_id, status
FROM   all_objects
WHERE  1=2;

Possiamo inserire dati se non esistono nella tabella (WHEN NOT MATCHED)

MERGE INTO test1 a
USING all_objects b
  ON (a.object_id = b.object_id)
WHEN NOT MATCHED THEN
  INSERT (object_id, status)
  VALUES (b.object_id, b.status);

Possiamo aggiornare SOLO i dati che già esistono nella tabella (WHEN MATCHED)

MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
  UPDATE SET a.status = b.status;

Possiamo inserire ed aggiornare i dati con una sola query

MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
  UPDATE SET a.status = b.status
WHEN NOT MATCHED THEN
  INSERT (object_id, status)
  VALUES (b.object_id, b.status);

Potremmo anche condizione le INSERT e gli UPDATE (WHERE)

MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
  UPDATE SET a.status = b.status
  WHERE  b.status != 'VALID'
WHEN NOT MATCHED THEN
  INSERT (object_id, status)
  VALUES (b.object_id, b.status)
  WHERE  b.status != 'VALID';

Ovviamente si può utilizzare anche il comando DELETE

MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
  UPDATE SET a.status = b.status
  WHERE  b.status != 'VALID'
DELETE WHERE (b.status = 'VALID');

Se poi non volessimo utilizzare la MERGE potremmo fare anche così per UPDATE o DELETE in più di una tabella

DELETE FROM (SELECT 'x' FROM dept d, emp e
             WHERE d.deptno = e.deptno
             AND loc = 'CHICAGO');

oppure

UPDATE (SELECT e.sal, d.deptno
        FROM emp e, dept d
        WHERE d.deptno = e.deptno
        AND   loc = 'CHICAGO') x
SET x.sal = x.sal + 1

Alla prossima

ORACLE: valori stringa

25 marzo 2009

Salve, non ho scoperto certo l’America, ma almeno, per chi come me se lo chiede, e non ha mai trovato risposta (probabilmente perchè non l’ha cercata) potrebbe essere un consiglio utile.

 Nel database Oracle esistono vari tipi di dati per identificare le stringhe: CHAR, VARCHAR e VARCHAR2.

Bene…ma qual’è la differenza?

Partiamo intanto col dire che il tipo di dati VARCHAR è stato sostituito dal tipo VARCHAR2, anche se in effetti è ancora possibile dichiarare dei campi di tipo VARCHAR, ma è totalmente inutile.

Il tipo CHAR, immagazzina i dati nel database rispettando la lunghezza del campo…in parole povere…se dichiaro un campo di tipo CHAR(10), il valore al suo interno sarà sempre lungo 10 caratteri anche se scrivo solo 2 caratteri.

Esempio:
create table tbtest (
  char_field char(10)
);

create table riuscito/a.

insert into tbtest values ('CIAO'); 1 righe inseriteselect char_field, length(char_field) from tbtest;

CHAR_FIELD LENGTH(CHAR_FIELD)
———- ———————-
CIAO       10

Il tipo VARCHAR2, immagazzina i dati nel database in maniera variabile…in parole povere…se dichiaro un campo di tipo VARCHAR2(10), il valore al suo interno sarà lungo al massimo 10 caratteri.

Esempio:
create table tbtest (
  char_field varchar2(10)
);

create table riuscito/a.

insert into tbtest values ('CIAO'); 1 righe inseriteselect char_field, length(char_field) from tbtest;

CHAR_FIELD LENGTH(CHAR_FIELD)
———- ———————-
CIAO       4

Ecco tutto.

 Alla prossima.

Comprimere messaggi OUTLOOK EXPRESS

12 febbraio 2009

Salve, mi è capitato che Outlook Express, ogni volta che lo avviavo, mi presentava un messaggino che diceva di comprimere i messaggi per risparmiare spazio sul disco…anche se io non utilizzo OUTLOOK!!!

Ho pensato che visto che non è usato avrebbe fatto in un lampo a comprimere il “nulla”…ovviamente c’ha messo 10 minuti!!!!

Questo messaggio compare ogni 100 avvii dell’applicazione, anche se secondo me non l’ho avviata 100 volte, ma va beh, e non c’è modo di farlo scomparire in maniera “ortodossa” se non comprimendo i dati.

In questo caso ci viene in aiuto il registo di sistema.

Basta modificare un valore nella chiave

HKEY_CURRENT _USER\Identities\{GUID}\Software\Mitcrosoft\Outlook Express\5.0

Il {GUID} è un numero astruso che identifica l’utente, personalmente ne ho solo uno.

Una volta aperta la chiave, modificare il valore Compact Check Count e inserire 0.

Il gioco è fatto!!!

Alla prossima!!

Statistiche tabelle

15 dicembre 2008

Per avere la statistica aggiornata delle tabelle in un DB Oracle è sufficiente lanciare il comando

analyze table <nome_della_tabella> compute statistics;

Un trucchetto per analizzare tutte le tabelle di uno schema potrebbe essere questo:

SELECT ‘analyze table ‘ || table_name || ‘ compute statistics;’ FROM user_tables;

Alla fine copiare l’output dello script ed eseguirlo come query.

Volendo si possono anche analizzare tutte le tabelle del server sostituendo user_tables con sys.all_tables.

Riavviare Windows XP in una sessione terminal

26 novembre 2008

Salve, se utilizzate Windows XP Professional con terminal server, vi sarete accorti che una volta loggati in una sessione terminal scompare dal menu start il comando “Chiudi Sessione”, e quindi non è possibile né riavviare il computer né tantomeno spegnerlo.

Per ovviare al problema del riavvio non server far altro che aprire il Task Manager (CTRL - ALT - END, Start -> Esegui -> taskmgr), cliccare sul menu “Chiudi sessione” e quindi su “Riavvia il sistema”.

Per lo spegnimento ancora ci sto studiando!

Ciao a tutti.

Accedere ad una condivisione SAMBA

10 novembre 2008

Ciao a tutti,

in Windows VISTA avevo un problema con l’accesso ad una condivisione SAMBA (v. 2.2.6) esposta da un sistema UNIX che in pratica non mi convalidava i dati di autenticazione.

Se però configuravo Samba in modo da non richiedere le credenziali di accesso, tutto era a posto.

Ho “sgooglato” un po’ ed ho travo un paio di cosette che mi hanno fatto risolvere il problema.

1- Fino alla versione 2.2.8 di Samba NON c’è compatibilità con Vista

2- Bisogna comunque cambiare delle security policy  in Vista.

Per chi ha Windows Vista Home Premium come me, non c’è modo di cambiare queste policy, se non manualmente nel registro di sistema, invece per chi ha installata una versione dalla Business in su c’è un utility lanciabile col comando esegui che si chiama secpol.msc

Spiego solo il metodo “ruspante” cambiando le chiavi nel registro:

- aprire il  registro

- accedere alla chiave [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]

- Aggiornare il valore di LmCompatibilityLevel a 1

e tutto funziona normalmente.

Alla prossima

ClickOnce Deployment su Apache

6 novembre 2008

Ciao a tutti.

Volevo proporre un metodo per far funzionare bene (almeno spero!!!) il deploy di applicazioni ClickOnce su Apache in sistemi Linux.

Inserire queste righe nel file /etc/apache2/apache2.conf:

AddType application/x-ms-application application
AddType application/x-ms-manifest    manifest
AddType application/x-ms-stream      deploy

e il gioco è fatto!!!

Alla prossima

SqlMembershipProvider

3 novembre 2008

Salve a tutti, una decina di giorni fa “armeggiavo” con la gestione utenti di ASP.NET, i mitici controlli per l’autenticazione all’interno di una webapp o di un website, e mi si è venuto a creare un piccolo problema:

In pratica, quando andavo a “deployare” il sito un server web esterno al mio (Aruba.it) avevo problemi di autenticazione perché l’applicazione non riusciva a trovare delle procedure necessarie per il riconoscimento degli utenti all’interno del Database SQL Server al quale si appoggia…il problema era qualcosa del tipo Could not find procedure “dbo.aspnet_CheckSchemaVersion”.

Dopo un po’ di “googling” ho trovato che il problema è dovuto al fatto che il provider per la gestione degli utenti, SqlMembershipProvider appunto, “entra” nelle procedure e nelle tabelle del Database con lo schema di default di SQL Server, ovvero dbo, e perciò, essendo il sito appoggiato in un Database nel quale non si può disporre, per ovvi motivi di sicurezza, dei diritti di accesso allo schema dbo, la webapp va in crash.

Lo workaround era di scaricarsi il sorgente del provider, questo è il link, e modificare le chiamate alle stored procedures togliendo il prefisso dbo e aggiungendo il proprio schema di riferimento.

Allora ho pensato che fosse stato possibile anche fare una cosa un pochettino più personalizzata…mi sono armato di coraggio ;-) ed ho provato a buttare giù qualcosa.

E’ venuto fuori che nel mio provider personalizzato, ho aggiunto un attributo specificabile nella dichiarazione del provider stesso all’interno del file web.config dove deve essere scpecificato l’utente del database che poi viene assunto anche come schema di default per l’accesso a tutti gli oggetti all’interno di SQL Server…et voilà.

Ora non ci dovrebbero più essere problemi di accesso con il SqlMembershipProvider.

Questo è il link al download.

Ciao a tutti.