C#MySQL选择进入Var - >记忆力增加

时间:2014-03-18 14:35:46

标签: c# mysql

我是C#的新手并试图从MySQL数据库中读取一个值。

我得到的是一个号码。 我将它存储到一个int变量中并检查特定的数字以激活kuando busylight的功能。

整个事情是循环的(尝试while(true){}和goto方法)。

它到目前为止工作,但我的内存使用量正在增加。从〜6 MiB ... 30MiB开始,等等。

不知何故,它将数据保存到进程中,但我没有找到如何清除已用内存。

正如所说的非常非常新的,也许我的代码太糟糕了,无法正常工作以及现在清除未使用数据的问题。告诉我:D

非常感谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using Plenom.Components.Busylight.Sdk;
using System.Threading;

namespace TANSS4BLL
{
    class Program
    {
        static void Main()
        {
                var controller = new BusylightUcController();
                int resultStatus;
                while (true)
                {
                 string sqlDataBaseSelect = "SELECT typID FROM az_manager where maID = 4328 ORDER BY datum DESC LIMIT 1";
                 string ConnectionString = "Server=localhost; Database=tanss; Uid=root; Pwd=password"; 
                 using (MySqlConnection connDataBase = new MySqlConnection(ConnectionString))
                 {
                        connDataBase.Open();
                        MySqlCommand cmd = new MySqlCommand(sqlDataBaseSelect, connDataBase);
                        resultStatus = (int)cmd.ExecuteScalar();

                        if (resultStatus == 1)
                        {
                            //Console.WriteLine("Debugtext1");                              
                            controller.Light(BusylightColor.Green);

                        }
                        else if (resultStatus == 2)
                        {
                            //Console.WriteLine("Debugtext2");

                            controller.Light(BusylightColor.Red);
                        }
                        else if (resultStatus == 3)
                        {
                            //Console.WriteLine("Debugtext3");

                            controller.Light(BusylightColor.Red);
                        }
                        else if (resultStatus == 9)
                        {
                            //Console.WriteLine("Debugtext4");

                            controller.Light(BusylightColor.Red);
                        }
                        connDataBase.Close();   
                }
                //Console.WriteLine(resultStatus);
                Thread.Sleep(1000);
                //Console.Clear();

             }
        }             
    }
}

3 个答案:

答案 0 :(得分:0)

您无需处理它,垃圾收集器将自动处理它。但是尽量避免在循环中重新连接到数据库。如果你需要这样做 - 把MySqlCommand放在循环中,而不是MySqlConnection。

垃圾收集器自动清除未使用的资源。您可以手动运行Garbage collector,但操作非常昂贵,所以不要把它放在(true)循环中。有关GC的信息,请访问:http://msdn.microsoft.com/en-us/library/s5zscb2d(v=vs.85).aspx

答案 1 :(得分:0)

我看到你正在做的事情之一就是你没有处理MySqlCommand对象,它会不断构建和占用资源。无论是通过using语句还是在其上调用dispose方法,都需要正确处理该对象。如果你继续轮询数据库,我会启动你在for循环之外的mysql连接。我还会在其中添加一些try catch逻辑来捕获数据库连接错误。以下是我对此的攻击方式,

            var controller = new BusylightUcController();
            int resultStatus;
            string sqlDataBaseSelect = "SELECT typID FROM az_manager where maID = 4328 ORDER BY datum DESC LIMIT 1";
            string ConnectionString = "Server=localhost; Database=tanss; Uid=root; Pwd=password"; 
            using (MySqlConnection connDataBase = new MySqlConnection(ConnectionString))
            {
                    connDataBase.Open();
                    try
                    {
                        while (true)
                        {
                            using(MySqlCommand cmd = new MySqlCommand(sqlDataBaseSelect, connDataBase))
                            {
                                resultStatus = (int)cmd.ExecuteScalar();
                                switch(resultStatus)
                                {
                                    case 1: 
                                        //Console.WriteLine("Debugtext1");                              
                                        controller.Light(BusylightColor.Green);
                                        break;
                                    case 2: 
                                        //Console.WriteLine("Debugtext2");
                                        controller.Light(BusylightColor.Red);
                                        break;
                                    case 3: 
                                        //Console.WriteLine("Debugtext3");
                                        controller.Light(BusylightColor.Red);
                                        break;
                                    case 9:
                                        //Console.WriteLine("Debugtext4");
                                        controller.Light(BusylightColor.Red);
                                        break;
                                    default:
                                        // handle when its not any of your results.
                                        break;
                                }
                            }
                            //Console.WriteLine(resultStatus);
                            Thread.Sleep(1000);
                            //Console.Clear();
                        }
                    }catch(Exception ex)
                    {
                        //HandleException
                    }finally
                    {
                        connDataBase.Close(); 
                    }    
            }

答案 2 :(得分:0)

您正在使用while(true)循环创建与数据库的多个连接。

string ConnectionString = "Server=localhost; Database=tanss; Uid=root; Pwd=password";

这一行很容易移出while循环,你可以帮助解决你的问题。

此外,如果这变成生产代码,则需要在使用数据库时设置参数。参数是我们如何避免sql注入。

Avoiding SQL Injection

希望这可以帮助你!

相关问题