【问题标题】:SQL Command datareader while loop not workingSQL 命令数据读取器 while 循环不起作用
【发布时间】:2015-11-04 16:45:58
【问题描述】:

我有一个关于 SQL 命令的问题。我似乎无法让 while 循环在“while(dr.read())”下运行。下面是我在 C# Windows 窗体中的示例代码。 谢谢。

                cmd = connection.CreateCommand();
                cmd.CommandText = "SELECT * FROM network";
                MySqlDataReader dr;
                dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    string datasource = dr[1].ToString();
                    string datadestination = dr[2].ToString();
                    if (source == datasource && destination == datadestination)
                    {
                        int newcounter;
                        newcounter = Convert.ToInt32(dr[4]) + 1;
                        cmd.CommandText = "UPDATE network set counter = @nnnewcounter";
                        cmd.Parameters.AddWithValue("@nnnewcounter", newcounter);
                    }
                    else
                    {
                        cmd.CommandText = "INSERT INTO network(source,destination,length,counter) VALUES (@sssource,@dddestination,@lllength,@cccounter)";
                        cmd.Parameters.AddWithValue("@sssource", source);
                        cmd.Parameters.AddWithValue("@dddestination", destination);
                        cmd.Parameters.AddWithValue("@lllength", length);
                        cmd.Parameters.AddWithValue("@cccounter", 1);
                    }
                }

【问题讨论】:

  • 错误?尝试放置断点?退出循环?
  • 你有没有遇到异常,f.e.您必须打开连接吗?
  • 不是错误也不是异常,只是数据库中没有插入数据
  • 查找错误的最佳方法是放置断点..
  • 我不知道如何使用断点sry

标签: c# sql winforms while-loop


【解决方案1】:

你有一些问题首先你重复使用相同的命令并使用不同的参数,此时你应该清除它们。也不清楚您是否正在为数据读取器打开连接。因此,我会将插入和更新移到 SQLDataReader 之外,因为它会使代码更易于阅读。

using (SqlConnection connection = new SqlConnection(ConnString))
{
    using (SqlCommand cmd = connection.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM network";
        cmd.Connection.Open();

        using (MySqlDataReader dr = cmd.ExecuteReader())
        {
             if (dr .HasRows)
             {
                  while (dr.Read())
                  {
                    string datasource = dr[1].ToString();
                    string datadestination = dr[2].ToString();
                    if (source == datasource && destination == datadestination)
                    {
                        int newcounter;
                        newcounter = Convert.ToInt32(dr[4]) + 1;
                        Updateddos_network(newcounter);
                    }
                    else
                    {
                        Savedoss_network(source,destination, length, 1);
                    }
            }
            else
            {
               //No rows found
            }
        }
    }
 }

然后在您可以拥有的同一类中的方法之外。

            private void Updateddos_network(int newcounter)
            {
                using (SqlConnection connection = new SqlConnection(ConnString))
                {
                   using (SqlCommand cmd = connection.CreateCommand())
                   {
                     cmd.CommandText = "UPDATE ddos_network set counter = @nnnewcounter";
                     cmd.Parameters.AddWithValue("@nnnewcounter", newcounter);
                     cmd.Connection.Open();
                     cmd.ExecuteNonQuery();
                  }
                }
            }


            private void Insertddos_network(string source, string destination, int length, int counter)
            {
                using (SqlConnection connection = new SqlConnection(ConnString))
                {
                   using (SqlCommand cmd = connection.CreateCommand())
                   {
                     cmd.CommandText = "INSERT INTO ddos_network(source,destination,length,counter) VALUES (@sssource,@dddestination,@lllength,@cccounter)";
                     cmd.Parameters.AddWithValue("@sssource", source);
                     cmd.Parameters.AddWithValue("@dddestination", destination);
                     cmd.Parameters.AddWithValue("@lllength", length);
                     cmd.Parameters.AddWithValue("@cccounter", counter);
                     cmd.Connection.Open();
                     cmd.ExecuteNonQuery();
                  }
                }
            }

如果您要进一步重构您的代码,您可以为您的 ddos​​_network 对象设置一个 Save 方法,然后该方法可用于根据当前对象是否具有 Id 来确定您的对象是否正在更新或插入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2017-08-08
    • 2017-08-01
    • 2015-03-09
    相关资源
    最近更新 更多