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"
- Comment append des valeurs dans les colonnes restantes d'une ligne DataTable spécifique?
- Problème de design piloté par datatables – comptage des données
- Comment utiliser ASP.NET pour afficher la video à partir d'octets dans la database SQL?
- Requête de statistics en langage naturel pour le convertisseur de requête SQL
- arraylist à une table
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
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())