使用参数执行查询

我想从C#执行.sql脚本。 基本上,脚本会在一些不同的表中插入一行。

关键是我在C#代码中有值,我需要传递给.sql查询。 这些值将在程序执行期间收集。

这是我想从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 

这些值会不时变化,即它们是用C#代码捕获的,需要通过。

任何人都可以帮我这样做..我正在学习C#和SQL。 非常感谢。

你可以在这里打开自己的SQL注入攻击 ,所以最好的做法是使用参数:

 using (SqlConnection dbConn = new SqlConnection(connectionString)) { 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(); } 

对于ADO.Net的初学者来说这是一篇很好的文章

编辑 – 就像一些额外的信息,我已经添加了一个事务 ,所以如果SQL命令失败,它将回滚。

  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.ConnectionString)) { 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); } 

对于存储过程,在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]) 

此外,您可以使用文本框或其他输入类型控件来设置值。 您可以根据需要更改dataType,例如uniqueidentifierint等。如果将一个或多个值设置为identify,例如。 AccountID,从查询中删除它们。

坦率地说,ADO.NET很难正确地完成这样的事情。 像Dapper这样的工具可以让这更容易

 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 }); 

这将有效,高效,安全地为您处理所有参数化。

有类似的API用于执行查询和填充对象。

您将需要System.Data.SqlCommand类。

将固定值更改为命名参数。 例如:

INSERT INTO [TABLE](Column1)值(@ Value1)// @ Value1是命名参数

例:

 var connection = new SqlConnection("connectionstring"); 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(); 

SqlCommand参考: http : //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx