【问题标题】:How to Run a DELETE query after SELECT in c#如何在 C# 中 SELECT 后运行 DELETE 查询
【发布时间】:2015-07-21 14:12:05
【问题描述】:

我有这个代码。第一个代码从通知表中选择电子邮件,然后创建它们的列表,然后我循环并发送电子邮件。

但是,现在我被卡住了,因为我需要从通知表中删除刚刚使用的 notify_id。有人可以帮我解决这个问题。

 using (SqlCommand cmd =
                new SqlCommand("SELECT email FROM notify WHERE jump_id = @jump_id", con))
                {
                    cmd.Parameters.AddWithValue("@jump_id", jumpid.Text);

                    SqlDataReader rd = cmd.ExecuteReader(); 

                    List<String> user = new List<String>(); 

                    while (rd.Read()) 
                    {
                        userAddre.Add((String)rd.GetValue(0));

                    }
    if (userAddre.Count > 0) //if exists
                    {
    //do something
    }

            using (SqlCommand cmd =
                new SqlCommand("DELETE FROM notify WHERE notify_if = ", con))
            {
                cmd.Parameters.AddWithValue(????);
                cmd.ExecuteNonQuery();
            }

【问题讨论】:

  • 您是否尝试过在第一个查询中获取 notify_if 并将其传递给第二个查询?
  • 语法与您在上面的SELECT 语句中使用的语法相同。您只需要同时获取notify_idemail 并存储在一个变量中并传递给DELETE 查询。
  • 另外,SqlCommand using 作用域的嵌套可能会在此处产生错误。
  • “正确”的方法(在许多数据库中)是将 DELETE 与适当的 JOIN/WHERE 子句结合起来,而不是使用两个语句。它还将隐含地避免立即缺少交易的问题。
  • @user2864740 嗨,我该怎么做

标签: c# sql winforms sql-delete


【解决方案1】:
 List<String> user = new List<String>(); 

 List<int> notifyId = new List<int>();

        using (SqlConnection conn = new SqlConnection())
           {
           try
             {
            conn.ConnectionString = "data source=servername;User ID=username;Password=oasswordn;initial catalog=database;integrated security=False;MultipleActiveResultSets=True;App=EntityFramework";
            conn.Open();

          SqlCommand cmd = new SqlCommand("SELECT id,email FROM test", conn);
          SqlDataReader rd = cmd.ExecuteReader(); 
        while (rd.Read()) 
           {
                        notifyId.Add(Convert.ToInt16(rd.GetValue(0)));
                        user.Add(rd.GetValue(1).ToString());

                    }
        if(user.Count > 0)
            {
                for (int i = 0; i < user.Count; i++)
                MessageBox.Show(user[i].ToString());
            }
         rd.Close();

         cmd = new SqlCommand("DELETE FROM test WHERE id =@id ", conn);
        for (int i = 0; i < notifyId.Count; i++)
           {
               cmd.Parameters.Clear();//clear the parameter on each loop
               cmd.Parameters.AddWithValue("@id", notifyId[i]);
                cmd.ExecuteNonQuery();
            }
           conn.Close();
          }
              catch(Exception e1)
                {

                 }
     }

此代码在我的环境中运行

【讨论】:

  • @iwuhdiwuhfwuiqhf 希望现在一切顺利
【解决方案2】:

也许这会对你有所帮助

查看当您从第一个查询中选择电子邮件时,同时选择或检索 notify_if 并将其存储在任何变量中并将其传递给第二个查询 i.t 到您的删除查询。

using (SqlCommand cmd =
        new SqlCommand("SELECT email, notify_if FROM notify WHERE jump_id = @jump_id", con))
        {
            cmd.Parameters.AddWithValue("@jump_id", jumpid.Text);

            SqlDataReader rd = cmd.ExecuteReader(); 

            List<String> user = new List<String>(); 
           // here declaration for your id
            List<int> notifyId = new List<int>();

            while (rd.Read()) 
            {
                userAddre.Add((String)rd.GetValue(0));
                notifyId.Add((int)rd.GetValue(1))

            }
            if (userAddre.Count > 0) //if exists
            {
     //do something
     }

    using (SqlCommand cmd =
        new SqlCommand("DELETE FROM notify WHERE notify_if =@id ", con))
      {
          // suming that you want delete multiple Notifyid
        for (int i = 0; i < notifyId.Count; i++) 
        {
             cmd.Parameters.Clear();//clear the parameter on each loop
             cmd.Parameters.AddWithValue("@id",notifyId[i]);
        }
             cmd.ExecuteNonQuery();
    }

【讨论】:

  • 当您的选择查询成功执行时,它将被添加到列表中
  • 检查你是否成功地从第一个查询中获得结果......你从哪里获得@jump_id 值?
  • 它不会让我构建,Error The name 'notifyId' does not exist in the current context
  • @Sachu 我有,但在我开始构建它之前它没有找到 notify_id,我做错了什么
  • 尝试在第一个“使用” List user = new List(); 之前声明两个 List notifyId = new List();两者都在第一次使用之前声明
【解决方案3】:

目前您的 SELECT statemnt 仅返回电子邮件,您应该这样:

using (SqlCommand cmd =
            new SqlCommand("SELECT email, notify_if FROM notify WHERE jump_id = @jump_id", con))
            {
                cmd.Parameters.AddWithValue("@jump_id", jumpid.Text);

                SqlDataReader rd = cmd.ExecuteReader(); 

                List<String> user = new List<String>(); 
                List<int> ids = new List<int>();

                while (rd.Read()) 
                {
                    userAddre.Add((String)rd.GetValue(0));
                    ids.Add((int)rd.GetValue(1))

                }
if (userAddre.Count > 0) //if exists
                {
//do something
}

        using (SqlCommand cmd =
            new SqlCommand("DELETE FROM notify WHERE notify_if = ", con))
        {
//Here add some elements from ids list.
            cmd.Parameters.AddWithValue(????);
            cmd.ExecuteNonQuery();
        }

我不知道它返回多少行,所以很难给出确切的解决方案。

请注意,可以使用 key 参数在单独的方法中设置 delete,并为 ids 列表中的每个 id 触发。

【讨论】:

  • 你必须创建方法: DeleteRow(int param) { using (SqlCommand cmd = new SqlCommand("DELETE FROM notify WHERE notify_if = @id", con)) { cmd.Parameters.AddWithValue(" @id", 参数); cmd.ExecuteNonQuery();如果列出 callet ids(我在您的代码中添加的内容),只需为每个元素启动此 DeleteRow 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2021-06-26
相关资源
最近更新 更多