Winforms 在VisualC++中检查mysql连接是否打开

Winforms 在VisualC++中检查mysql连接是否打开,winforms,mysqlconnection,mysql,visual-c++-2013,Winforms,Mysqlconnection,Mysql,Visual C++ 2013,对不起,如果你觉得无聊的话。我在几个搜索引擎上搜索过,但没有得到任何结果。无论如何,我在一个数据库是mysql的应用程序中工作。现在我已经创建了一个数据库包装器类,希望检查连接是否已经打开。你能帮我吗 String^ constring = L"datasource=localhost;port=3306;username=root;password=pass;database=eps;"; String^ my_query = L"selec

对不起,如果你觉得无聊的话。我在几个搜索引擎上搜索过,但没有得到任何结果。无论如何,我在一个数据库是mysql的应用程序中工作。现在我已经创建了一个数据库包装器类,希望检查连接是否已经打开。你能帮我吗

             String^ constring = L"datasource=localhost;port=3306;username=root;password=pass;database=eps;";
             String^ my_query = L"select id from eps_users where usr = '" + this->user_name->Text + "' and psw = md5('" + this->pass_word->Text + "');";
             MySqlConnection^ conDatabase = gcnew MySqlConnection(constring);
             MySqlCommand^ cmd = gcnew MySqlCommand(my_query, conDatabase);
             MySqlDataReader^ myreader;
             try
             {
                 conDatabase->Open();
                 myreader = cmd->ExecuteReader();
                 int count = 0;
                 while (myreader->Read())
                 {
                     count = count + 1;

             }
             if (count == 1){
                 MessageBox::Show("Username And Password is correct.", "Success", MessageBoxButtons::OK,
                     MessageBoxIcon::Information);
                 this->Hide();
                 Form2^ f2 = gcnew Form2(constring);
                 f2->ShowDialog();
             }
             else{
                 MessageBox::Show("Username And Password is not correct.", "Error", MessageBoxButtons::OK,
                     MessageBoxIcon::Error);
                 // <del>
                 this->Hide();
                 Form2^ f2 = gcnew Form2(constring);
                 f2->ShowDialog();
                 // </del>
             }
         }
         catch (Exception^ ex)
         {
             MessageBox::Show(ex->Message);
         }
         conDatabase->Close();

我需要检查conDatabase->hasbeennopened{conDatabase->Open;}

MySqlConnection类型是否实现了一个名为连接池的功能,该功能依赖于垃圾收集器来帮助回收到数据库的连接,因此,关于连接对象的最佳实践是为对数据库的大多数调用创建一个全新的对象,以便垃圾收集器可以正确地回收旧的对象。过程如下:

if( conDatabase->State == ConnectionState::Open)
String^ my_query = L"select id from eps_users where usr = @userID;";
MySqlCommand^ cmd = gcnew MySqlCommand(my_query, conDatabase);
cmd->Parameters->AddWithValue(L"@userID", this->user_name->Text);
创建新连接 打开连接 将连接用于一个查询/事务 处理连接 所有四个步骤都位于一个try/catch/finally块中。另外,dispose步骤需要在finally块中执行!因为您通常从一个全新的连接对象开始,所以通常不需要首先检查它是否打开:您知道它已关闭。您也不需要在调用Open后检查状态:该方法将阻塞直到完成,如果失败,则抛出异常

然而,如果你真的是在其中一个难得的!在最好将连接保留较长时间的情况下,您可以如下所示检查状态:

if( conDatabase->State == ConnectionState::Open)
String^ my_query = L"select id from eps_users where usr = @userID;";
MySqlCommand^ cmd = gcnew MySqlCommand(my_query, conDatabase);
cmd->Parameters->AddWithValue(L"@userID", this->user_name->Text);
现在,我想谈谈代码中的另一个问题。问题归结为:如果我在您的用户名文本框中输入以下内容,您认为会发生什么情况:

';DROP Table eps_users;--
此代码易受sql注入攻击。这简直是乞求被黑客攻击。请建议我删除漏洞?另外:md5不是一种安全的密码散列方式。关于如何避免注射的更多细节将在基本答案发布后编辑到我的答案中。哦。好我还在等。对不起,老板。错误2错误C2065:“打开”:未声明的标识请确保ConnectionState枚举可用:uou可能需要添加命名空间System.Data。但是在你这么做之前,确保你理解了帖子的第一部分,上面说你不应该这么做。非常感谢你,乔尔。没关系。事实上,我已经理解了你所说的关于打开连接的话。所以我决定在conDatabase->Close之前使用它;我在PHP MySql中工作过。我使用了addslashestring;作用在C++中我不能使用它吗?我不需要声明@ USERID吗?