【问题标题】:Executing query with parameters使用参数执行查询
【发布时间】:2012-08-10 15:53:07
【问题描述】:

我想从 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。非常感谢。

【问题讨论】:

  • 我认为您应该先尝试一些tutorials,然后在这里提出特定问题。我很难相信你在谷歌上没有得到任何答案。
  • 当然.. 感谢您的链接.. 新手在截止日期前。因此使用stackoverflow来拯救我的一天......
  • 如果演员的名字是 O'Hara 怎么办?

标签: c# .net sql


【解决方案1】:

您可以在此处打开自己的SQL injection attacks,因此最佳做法是使用参数:

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

这是beginners with ADO.Net的好文章

编辑 - 作为一些额外的信息,我添加了一个transaction 到它,所以如果 SQL 命令失败,它将回滚。

【讨论】:

  • 不错的答案。请注意,您可以考虑对前两个参数使用 SqlDbType.UniqueIdentifier 或 GUID
  • @dash 是的,你当然可以,ADO.Net 有很多内容(远远超过你可以在 stackoverflow 中回答的内容),所以我只是总结了基础知识。
  • 同上!我就是这样做的!
  • dbConn.Close(); 不是必需的,连接由using 块关闭
  • @Simo 不确定您的意图是什么......这当然是确保预期类型是您正在使用的数据库平台固有的唯一选择。
【解决方案2】:
    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();
}

【讨论】:

    【解决方案3】:
            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])
    

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

    【讨论】:

      【解决方案4】:

      坦率地说,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 用于执行查询和填充对象。

      【讨论】:

      • 该功能对防止无效数据有用吗?比如转义一些保留符号等
      • @anatol 你能澄清一下你在说哪个“那个功能”吗?参数?是的,绝对
      • 太棒了!我的意思是参数,是的
      • @anatol 然后:是的
      【解决方案5】:

      您需要 System.Data.SqlCommand 类。

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

      INSERT INTO [TABLE] (Column1) values (@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

      【讨论】:

      • command.Parameters["@Value1"] = "Mark wa...";给出错误:无法将字符串转换为参数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多