4 votes

c# et SMO - Obtenir une sortie de message telle que "Table already exists" pour la journalisation

J'utilise les objets de gestion SQL pour me connecter au serveur SQL. Pour l'instant, ils contiennent de simples commandes "create table" pour mon exemple.

J'ai exécuté ce code deux fois dans le but de provoquer une erreur pour "table already exists".

Cependant, les événements ci-dessous ne sont pas déclenchés.

Quelqu'un a-t-il une idée de la manière dont je peux obtenir ce message dans mon code, à part en changeant le type d'exécution pour qu'il s'arrête sur les erreurs provoquant des exceptions (ce que je ne veux pas faire, je veux continuer) ?

Mon code :

public void executeSomeSQL() {
    FileInfo file = new FileInfo(@"\c:\sqlcommands.sql");
    string script = file.OpenText().ReadToEnd();
    SqlConnection conn = new SqlConnection(sqlConnectionString);
    conn.InfoMessage +=new SqlInfoMessageEventHandler(conn_InfoMessage);
    Server server = new Server(new ServerConnection(conn));
    server.ConnectionContext.InfoMessage += new SqlInfoMessageEventHandler(ConnectionContext_InfoMessage);
    server.ConnectionContext.ExecuteNonQuery(script,ExecutionTypes.ContinueOnError);                
    MessageBox.Show("All Done");
}

Événements:-

public void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e) {
    textBox3.Text += "1:"+DateTime.Now.ToString();
}

public void ConnectionContext_InfoMessage(object sender, SqlInfoMessageEventArgs e) {
    textBox3.Text += "2:" + DateTime.Now.ToString();
}

3voto

C-Pound Guru Points 6805

Selon MSDN :

L'événement InfoMessage se produit lorsqu'un message dont la gravité est inférieure ou égale à 10 est renvoyé par le serveur SQL. Les messages dont le degré de gravité est compris entre 11 et 20 soulèvent une erreur et les messages qui ont une gravité supérieure à 20 provoquent la fermeture de la connexion.

La gravité de l'erreur pour un CreateTable sur une table qui existe déjà est de 16, ce qui permet de contourner l'événement InfoMessage.

Vous pourriez vouloir envelopper votre TSQL dans un bloc Try...Catch et utiliser RAISEERROR. Un bloc TRY...CATCH capture toutes les erreurs d'exécution dont la gravité est supérieure à 10 et qui ne mettent pas fin à la connexion à la base de données.

Vous pouvez aussi ajouter un contrôle dans votre TSQL pour vérifier l'existence de la table et effectuer une impression qui sera transmise à votre événement InfoMessage.

1voto

Andry Points 21

Je ne suis pas programmeur (DBA), donc je ne suis pas sûr. Je suppose que les éléments suivants peuvent être utiles

conn.FireInfoMessageEventOnUserErrors = true ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X