Je veux exécuter un script .sql
partir de C #. Fondamentalement, le script insère une ligne dans plusieurs tables différentes.
Le fait est que j’ai des valeurs en code C # que je dois transmettre à la requête .sql
. Ces valeurs seront collectées lors de l’exécution du programme.
Voici la requête que je veux exécuter à partir du code C #:
INSERT INTO [DB].[dbo].[User] ([Id] ,[AccountId] ,[FirstName] ,[LastName] ,[JobTitle] ,[PhoneNumber] ) VALUES ('00A640BD-1A0D-499D-9155-BA2B626D7B68' ,'DCBA241B-2B06-48D7-9AC1-6E277FBB1C2A' ,'Mark' ,'Wahlberg' ,'Actor' ,'9889898989']) GO
Les valeurs varieront de temps en temps, c’est-à-dire qu’elles sont capturées en code C # et doivent être transmises.
Est-ce que quelqu’un peut m’aider s’il vous plaît à faire cela? Merci beaucoup.
Vous pouvez vous ouvrir ici aux attaques par injection SQL . La meilleure pratique consiste donc à utiliser les parameters suivants:
using (SqlConnection dbConn = new SqlConnection(connectionSsortingng)) { dbConn.Open(); using (SqlTransaction dbTrans = dbConn.BeginTransaction()) { try { using (SqlCommand dbCommand = new SqlCommand("insert into [DB].[dbo].[User] ( [Id], [AccountId], [FirstName], [LastName], [JobTitle], [PhoneNumber] ) values ( @id, @accountid, @firstname, @lastname, @jobtitle, @phonenumber );", dbConn)) { dbCommand.Transaction = dbTrans; dbCommand.Parameters.Add("id", SqlType.VarChar).Value = id; dbCommand.Parameters.Add("accountid", SqlType.VarChar).Value = accountId; dbCommand.Parameters.Add("firstname", SqlType.VarChar).Value = firstName; dbCommand.Parameters.Add("lastname", SqlType.VarChar).Value = lastName; dbCommand.Parameters.Add("jobtitle", SqlType.VarChar).Value = jobTitle; dbCommand.Parameters.Add("phonenumber", SqlType.VarChar).Value = phoneNumber; dbCommand.ExecuteNonQuery(); } dbTrans.Commit(); } catch (SqlException) { dbTrans.Rollback(); throw; // bubble up the exception and preserve the stack trace } } dbConn.Close(); }
Ceci est un bon article pour les débutants avec ADO.Net
EDITER – À titre d’information supplémentaire, j’y ai ajouté une transaction . Par conséquent, si la commande SQL échoue, elle sera annulée.
using SqlCommand cmd= conn.CreateCommand()) { cmd.CommandText = @"INSERT INTO TABLE (COLUMNS) VALUES (@Id, @account etc... cmdUser.Parameters.Add(new SqlParameter("@User", SqlDbType.UniqueIdentifier) { Value = UserTypeID }); cmdUser.Parameters.Add(new SqlParameter("@Id", SqlDbType.UniqueIdentifier) { Value = ApprovalTypeID }); cmdUser.Parameters.Add(new SqlParameter("@AccountId", SqlDbType.UniqueIdentifier) { Value = UserID }); cmdUser.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar, 100) { Value = Name }); cmdUser.Parameters.Add(new SqlParameter("@JobTitle", SqlDbType.NVarChar, 100) { Value = Surname }); cmdUser.Parameters.Add(new SqlParameter("@PhoneNumber", SqlDbType.Bit) { Value = Active }); cmdUser.ExecuteNonQuery(); }
try { using (SqlConnection cn = new SqlConnection(this.ConnectionSsortingng)) { SqlCommand cmd = new SqlCommand("Insert_User", cn); cmd.CommandType = CommandType.StoredProcedure; if (cn.State != ConnectionState.Open) cn.Open(); cmd.Parameters.Add("Id", SqlDbType.NVarChar).Value = "00A640BD-1A0D-499D-9155-BA2B626D7B68"; cmd.Parameters.Add("AccountId", SqlDbType.NVarChar).Value = "DCBA241B-2B06-48D7-9AC1-6E277FBB1C2A"; cmd.Parameters.Add("FirstName", SqlDbType.NVarChar).Value = "Mark"; cmd.Parameters.Add("LastName", SqlDbType.NVarChar).Value = "Wahlberg"; cmd.Parameters.Add("JobTitle", SqlDbType.NVarChar).Value = "Actor"; cmd.Parameters.Add("PhoneNumber", SqlDbType.NVarChar).Value = "9889898989"; return cmd.ExecuteNonQuery(); } } catch (Exception ex) { throw new Exception(ex.Message); }
et pour les procédures stockées, en sql:
create procedure [Insert_User] ( @id as nvarchar(100), @accid as nvarchar(100), @fname as nvarchar(100), @lname as nvarchar(100), @jobtitle as nvarchar(100), @phone as nvarchar(100) ) INSERT INTO [DB].[dbo].[User] ([Id] ,[AccountId] ,[FirstName] ,[LastName] ,[JobTitle] ,[PhoneNumber] ) VALUES (@id ,@accid ,@fname ,@lname ,@jobtitle ,@phone])
De plus, vous pouvez utiliser des zones de texte ou d’autres contrôles de type d’entrée pour définir des valeurs. Vous pouvez modifier à votre guise uniqueidentifier
, tel que uniqueidentifier
, int
, etc. Si une ou plusieurs valeurs sont définies comme identifire, par exemple. AccountID, supprimez-les de la requête.
Franchement, ADO.NET rend difficile la réalisation de tâches de ce type. Des outils comme Dapper existent pour rendre cela plus facile :
dbConn.Execute( @"insert into [DB].[dbo].[User] ( [Id], [AccountId], [FirstName], [LastName], [JobTitle], [PhoneNumber] ) values ( @id, @accountId, @firstName, @lastName, @jobTitle, @phoneNumber )", new { id, accountId, firstName, lastName, jobTitle, phoneNumber });
Ceci gérera tous les paramétrages pour vous , efficacement, efficacement et en toute sécurité.
Des API similaires permettent d’exécuter des requêtes et de renseigner des objects.
Vous aurez besoin de la classe System.Data.SqlCommand
.
Modifiez les valeurs fixes en parameters nommés. Par exemple:
INSERT INTO [TABLE] (Colonne1) valeurs (@ Valeur1) // la @ Valeur1 est le paramètre nommé
Exemple:
var connection = new SqlConnection("connectionssortingng"); var command = connection.CreateCommand(); command.CommandText = "insert...."; // sql command with named parameters // set the named parameter values command.Parameters["@Value1"] = "Mark wa..."; // execute command.ExecuteNonQuery();
Référence SqlCommand: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx