Costruire una console di gestione con ASP.NET per i catalogi full text

2 pagine in totale: <<Indietro 1 [2]

Ricavare informazioni sui cataloghi

Se abbiamo un database di grosse dimensioni, avviando il Popolamento dell'indice, la risposta del server è immediata che ci informa se l'esito ha avuto successo, anche se può durare anche qualche minuto.

Come possiamo sapere in che stato è il popolamento oppure ricavare le dimensioni del catalogo o altre informazioni?

A questi quesiti ci viene in aiuto la sp FULLTEXTCATALOGPROPERTY la quale ci fornisce molte informazioni. Accetta due Parametri, il primo è il nome del catalogo di cui vogliamo sapere le informazioni, il Secondo l'informazione richiesta. Restituisce un solo valore di tipo int.

FULLTEXTCATALOGPROPERTY( catalog_name , property )

Proprietà

Descrizione

PopulateStatus

0 = inattivo
1 = popolamento completo in corso
2 = in pausa
3 = rallentato
4 = in fase di recupero
5 = in fase di arresto
6 = popolamento incrementale in corso
7 = creazione dell'indice in corso
8 = disco pieno, sospeso
9 = rilevamento delle modifiche in corso

ItemCount

Numero delle voci indicizzate incluse nel catalogo full-text.

IndexSize

Dimensione dell'indice full-text in megabyte.

UniqueKeyCount

Numero di parole univoche (chiavi) che costituiscono l'indice full-text del catalogo. Corrisponde al numero approssimato delle parole significative archiviate nel catalogo full-text.

LogSize

Dimensioni in byte del set completo dei log degli errori associati a un catalogo full-text del servizio Microsoft® Search.

PopulateCompletionAge

Differenza espressa in secondi tra il completamento dell'ultimo popolamento di indici full-text e la data 01/01/1990 00:00:00.

Vediamo come usare tale questa stored procedure, sempre con un Web Service:

Creiamo una classe alla quale memorizziamo le informazioni richieste:

#Region "Classe per recuperare le informazioni dal catalogo Full Text"
  <Serializable()> _
  Public Class CatalogProperty
  Enum Status
    inattivo = 0  'Idle
    PopulationInProgress = 1 ' Full population in progress
    in_Pausa = 2 ' Paused
    In_Rallentato = 3 ' Throttled
    In_Recupero = 4 ' Recovering
    In_Arresto = 5  ' Shutdown
    IncrementaleInCorso = 6 ' Incremental population in progress
    CreazioneIndice = 7 ' Building index
    DiskIsFullPaused = 8 ' Disk is full. Paused.
    RilevamentoModifiche = 9 ' Change tracking
  End Enum
  Private _PopulateStatus As Status
  Public Property PopulateStatus() As Status
    Get
     Return _PopulateStatus
    End Get
    Set(ByVal Value As Status)
     _PopulateStatus = Value
    End Set
  End Property
  Private _ItemCount As System.Int32
  Public Property ItemCount() As Int32
    Get
     Return _ItemCount
    End Get
    Set(ByVal Value As Int32)
     _ItemCount = Value
    End Set
  End Property
' continua - vedi allegato
'Un oggetto Enum da passare come argomento alla chiamata del Web Service per capire qualle azione è stata richiesta.
  <Serializable()> _
  Enum Operazione
  PopulateStatus = 1
  ItemCount = 2
  IndexSize = 3
  UniqueKeyCount = 4
  LogSize = 5
  PopulateCompletionAge = 6
  FullInfoStatus = 7
  End Enum

Il metodo del Web Service accetta due argomenti: il nome del catalogo da cui vogliamo le informazioni e l'azione da compiere, che è una delle 6 descritte.

Ho usato la reflection per rendere il codice più compatto, ma nessuno vi impedisce di esplicitare ogni singola operazione per impostare in valore di CatalogProperty.

  <WebMethod(Description:="Ritornano le informazioni dal Catalogo Full Text")> _
  Public Function InfoCatalagoFullText(ByVal Catalog_Descrizione As String, ByVal Action As Operazione) As CatalogProperty
    Dim Cnn As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("SqlConnectionString"))
    Dim SqlInfo As String = "SELECT fulltextcatalogproperty(@Cat_Desc, @Action)"
    Dim Proprieta As New CatalogProperty()
    Try
     If Action = Operazione.FullInfoStatus Then
     Dim i As System.Int16
     Dim myType As Type = Proprieta.GetType
     Dim myPropertyInfo As PropertyInfo() = myType.GetProperties((BindingFlags.Public Or BindingFlags.Instance))
     For i = 0 To myType.GetProperties.Length - 1
       Dim Cmd As New SqlCommand(SqlInfo, Cnn)
       Dim NomeProprieta As String = myPropertyInfo(i).Name
       Cmd.Parameters.Add("@Action", SqlDbType.NVarChar).Value = NomeProprieta
       Cmd.Parameters.Add("@Cat_Desc", SqlDbType.NVarChar).Value = Catalog_Descrizione
       Cnn.Open()
       Dim Result As System.Int32 = CType(Cmd.ExecuteScalar, System.Int32)
       Cmd.Dispose()
       Cnn.Close()
       If NomeProprieta = "PopulateStatus" Then
     myPropertyInfo(i).SetValue(Proprieta, CType(Result, CatalogProperty.Status), Nothing)
       Else
       myPropertyInfo(i).SetValue(Proprieta, Result, Nothing)
       End If
     Next
     Else
     Dim Cmd As New SqlCommand(SqlInfo, Cnn)
    Cmd.Parameters.Add("@Cat_Desc", SqlDbType.NVarChar).Value = Catalog_Descrizione
    Cmd.Parameters.Add("@Action", SqlDbType.NVarChar).Value = Action.ToString("g")
     Cnn.Open()
     Dim Result As System.Int32 = CType(Cmd.ExecuteScalar, System.Int32)
     Cmd.Dispose()
     Cnn.Close()
     Dim Prop As PropertyInfo = Proprieta.GetType.GetProperty(Action.ToString("g"), BindingFlags.Public Or BindingFlags.Instance)
     If Action.ToString("g") = "PopulateStatus" Then
       Prop.SetValue(Proprieta, CType(Result, CatalogProperty.Status), Nothing)
     Else
       Prop.SetValue(Proprieta, Result, Nothing)
     End If
     End If
     Return Proprieta
    Catch e As SqlException
     Console.WriteLine("Errore: {0}", e.Message)
     Console.WriteLine("Causato da {0}.", e.Source)
     Console.WriteLine("Nessun record scritto nel database.")
     Throw New ApplicationException( _
           "Errore nella richiesta di informazioni al Catalogo")
    Catch e As Exception
     Throw New ApplicationException( _
       "Errore nella richiesta di informazioni al Catalogo")
     Console.WriteLine("Error: {0}", e.Message)
     Console.WriteLine("Error reported by {0}.", e.Source)
     Console.WriteLine("Errore nella richiesta di informazioni al Catalogo.")
    Finally
     Cnn.Close()
    End Try
  End Function

Il client

Allegato al progetto c'è un client, che punta al web service appena creato, per permettere l'amministrazione remota dei cataloghi.
E' sufficiente aprire la soluzione con VS.NET per poter procedere alla modifica.

Immagine

Immagine

Conclusioni

Sfruttando il progetto allegato è possibile dunque creare una serie di web service di servizio, che, se adeguatamente protetti, possono permettervi di interagire con i cataloghi full-text anche da remoto, con la piena libertà che l'accesso ad Enterprise Manager potrebbe garantirvi.

Approfondimenti

2 pagine in totale: <<Indietro 1 [2]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC