Comment exécuter des transactions SQL en utilisant C # (Using TSql110Parser)

J'ai créé une application ASP.Net C # pour exécuter les requêtes SQL Server (MSSQL). L'application lit toutes les requêtes d'input de l'user dans la textbox fournie et en utilisant le TSql110Parser, elle se décomposera en instructions SQL individuelles.

Il fonctionne bien dans presque tous les cas, sauf lorsque les instructions SQL sont comme ci-dessous

DECLARE @user VARCHAR(50) SET @user = 'ABC' PRINT @user SELECT * FROM user_table WHERE username = @user 

L'exécution s'arrête à la ligne 2 et l'erreur du server SQL indique que

Doit déclarer la variable scalaire "@user"

même si c'est défini dans la première ligne.

Ensuite, j'ai compris la façon ci-dessous de courir. Ajout d'instructions BEGIN et END.

  BEGIN DECLARE @user VARCHAR(50) SET @user = 'ABC' PRINT @user SELECT * FROM user_table WHERE username = @user END 

Mais encore, il y a une limitation que nous ne serons pas en mesure de renvoyer les résultats de la requête SELECT.

L'extrait de code C # est ci-dessous

  protected void btnQuery_Click(object sender, EventArgs e) { if (qry.Length > 0) { using (sqlCon = new SqlConnection()) { dbConnSsortingng = dbConnSsortingng + "database=" + ddlDBNames.SelectedValue + ";"; sqlCon.ConnectionSsortingng = dbConnSsortingng; sqlCon.Open(); cmd = new SqlCommand(); cmd.Connection = sqlCon; IList<ParseError> Errors; var parser = new TSql110Parser(false); var script = parser.Parse(new SsortingngReader(qry), out Errors) as TSqlScript; if (Errors.Count > 0) { lblErrorMessage.Text = "***** Error: No statements executed *****"; } else { foreach (var ts in script.Batches) { foreach (var st in ts.Statements) { q = qry.Subssortingng(st.StartOffset, st.FragmentLength); ExecStatement(st, q); } } } } } } protected void ExecStatement(TSqlStatement statement, ssortingng qry) { cmd.CommandText = qry; if (statement is SelectStatement) { SqlDataReader dr = cmd.ExecuteReader(); //code to populate the tabular result } else { cmd.ExecuteNonQuery(); //code to show the non query execution result } } 

Est-il possible que je peux exécuter les requêtes SQL avec une connection persistante au server DB afin que la déclaration dans la première ligne sera en mesure d'utiliser à travers les requêtes?

La capture d'écran de l'application ci-dessous

Capture d'écran WEB

Utilisez CONTEXT_INFO. C'est la variable globale spécifique à la connection.

Son utilisation n'est pas simple puisqu'il s'agit juste d'une valeur de 128 bits. Pour le définir, exécutez le code suivant (N = l'int que vous voulez stocker connectionwise)

 DECLARE @BinVar binary(128); SET @BinVar = cast(N as binary(128)); set context_info @BinVar 

Vous pouvez get le N dans les requêtes suivantes en appelant la fonction context_info (). Vous devriez le convertir avec quelque chose comme ça.

 convert(int, context_info())