C++ Mysql 发送到数据库时变量值发生变化

C++ Mysql variable value changes when sent to database

我有一个程序,用户可以在其中的文本框中输入姓名,并根据存储在 MySQL 数据库 'player_name' 列中的行获得建议的自动完成选项 table 名为 'players'。当用户对文本框中的名称感到满意时,他会按下按钮 "Choose" 作为对他选择的确认。现在我想在文本框中获取名称并以相同的形式显示有关所选玩家的其他信息(存储在另一列中的信息)。

这是我的代码:

//AutoComplete Textbox

 void AutoCompleteTextbox()
 {
     PlayerNameField->AutoCompleteMode = AutoCompleteMode::SuggestAppend;
     PlayerNameField->AutoCompleteSource = AutoCompleteSource::CustomSource;
     AutoCompleteStringCollection ^PlayerSearchName = gcnew AutoCompleteStringCollection();
     String^ PlayerSearchAgeGroup;

     String^ constring = L"datasource=***.**.***.***;port=3306;username=AdminUser;password=****";
     MySqlConnection^ conDataBase = gcnew MySqlConnection(constring);
     MySqlCommand^ cmdDataBase = gcnew MySqlCommand ("select * from mfs_manager_database.players;", conDataBase);
     MySqlDataReader^ myReader;


     try
     {
         conDataBase->Open();
         myReader = cmdDataBase->ExecuteReader();


         while (myReader->Read())
         {

             searchName = myReader->GetString("player_name");
             PlayerID = myReader->GetString("player_id");
             String^ searchAgeGroup = myReader->GetString("player_age_group");
             PlayerSearchName->Add(searchName +" "+ searchAgeGroup);


        }

     }
     catch (Exception^ ex)
     {
         MessageBox::Show(ex->Message);
     }

     PlayerNameField->AutoCompleteCustomSource = PlayerSearchName;
 }
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
         //Disabling Player Name Field

         PlayerNameField->Enabled = false;

         //Getting Player Details for display from database


         String^ constring = L"datasource=***.**.***.***;port=3306;username=AdminUser;password=****";
         MySqlConnection^ conDataBase = gcnew MySqlConnection(constring);
         MySqlCommand^ cmdDataBase = gcnew MySqlCommand("SELECT * FROM mfs_manager_database.players WHERE player_id = '"+PlayerID+"';", conDataBase);
         MySqlDataReader^ myReader;


         try
         {
             conDataBase->Open();
             myReader = cmdDataBase->ExecuteReader();


             while (myReader->Read())
             {
                 String^ getName = myReader->GetString("player_name"); 
                 NameLabel->Text = getName;

             }

         }
         catch (Exception^ ex)
         {
             MessageBox::Show(ex->Message);
         }

一切正常,除了我按下 "Choose" 按钮,我得到了数据库中最后一个条目的 ID,而不是所选玩家的 ID。

这是我尝试过的:

-我声明了 PlayerID 并在 GetString 之前给它赋值 '2',结果相同。

String^ PlayerID = "2";    
PlayerID = myReader->GetString("player_id");

-我在 GetString 后给 PlayerID 赋值为“2”,我得到了占用 ID“2”的玩家名称(如预期)

PlayerID = myReader->GetString("player_id");
PlayerID = "2";

-我还检查了 GetString 行是否正常工作,我将 'player_id' 添加到自动完成建议中,它显示了正确的 ID。

PlayerSearchName->Add(searchName +" "+ searchAgeGroup + PlayerID);

所有组件似乎都可以一个接一个地工作,但不能一起工作,我看不出原因。任何帮助将不胜感激。

您正在获取最后一个玩家,因为在构造函数中您将 PlayerID 设置为数据库中的最后一个玩家。在您的按钮单击处理程序中,您永远不会更新该值,因此当您 运行 对数据库的查询时,您总是拉回您设置的最后一个 PlayerID 的记录。

执行完此代码块后 PlayerID 是数据库中的最后一个 ID:

while (myReader->Read())
{
     searchName = myReader->GetString("player_name");
     PlayerID = myReader->GetString("player_id");
     String^ searchAgeGroup = myReader->GetString("player_age_group");
     PlayerSearchName->Add(searchName +" "+ searchAgeGroup);
}

您需要做的是使用已在文本框中选择的 "Player name" 并在单击按钮时使用它来搜索数据库。

编辑
根据您的评论,您可以通过以下方式完成此操作。更改构建自动完成列表的循环,使您放入列表中的字符串如下所示。

String^ searchName = myReader->GetString("player_name");
String^ playerID = myReader->GetString("player_id");
String^ searchAgeGroup = myReader->GetString("player_age_group");
PlayerSearchName->Add(searchName +" "+ searchAgeGroup + "<" + searchName + ">");  // Note - it might be better to use String::Format here instead of concatenation

然后当您要查找名称时,只需将 ID 从文本框字符串中拉出即可。

String^ name = autoCompleteBox->Text;
int index = name->LastIndexOf("<");
String^ id = name->Substring(index+1, name->Length - index);  // Double check this, I may be "off by one", I have not tested it

现在您应该从字符串中获得 ID 并可以使用它进行搜索。

您可能还想考虑使用下拉控件而不是自动完成。然后,您可以将 ID 作为每个项目条目的 Tag 添加到控件中。 That way, when a name is chosen, you can just grab the selected item and pull the ID directly from the Tag field.

         while (myReader->Read())
     {

         searchName = myReader->GetString("player_name");
         PlayerID = myReader->GetString("player_id");
         String^ searchAgeGroup = myReader->GetString("player_age_group");
         PlayerSearchName->Add(searchName +" "+ searchAgeGroup);


    }

在上面的循环中,您一直将玩家 ID 分配给 PlayerID 变量,因此它的值将是数据库中最后一个条目的值。我没有在任何地方看到将播放器 ID 添加到列表中的代码,我不知道您的代码应该从哪里知道选择了哪个播放器。