如何使用 c# winform 从 mysql 数据库中检索所有数据

how to retrieve all data from mysql db using c# winform

我正在尝试在 C# winform 中从 mysql table 检索所有数据并使用图像数据启动它,但它只检索一个图像而不是另一个图像,我不知道如何获取访问我的所有数据以及如何显示所有数据! 我的意思是当它执行“select * from table_name”时,我如何访问所有这些数组值? 第二个问题如您所知,在 winforms 中我们应该有一个位置,然后将值放入其中,例如我们应该有一个 text_box,然后向其中插入文本,但是当用户想要另一个文本时,应用程序必须创建一个新的 text_box 因为它不可能猜对了我认为用户只需要 6 个文本框当然它就足够了 not.maybe 他或多或少需要我如何让应用程序创建 text_box 或任何其他领域? 我的代码在这里:

                string create_query = "CREATE TABLE IF NOT EXISTS personal_info (name TEXT, last_name TEXT, position TEXT, personal_id TEXT, part TEXT, personal_internal_id TEXT, photo_path MEDIUMBLOB)";
                MySqlConnection create_conn = new MySqlConnection(myConnectionString);
                MySqlCommand create_command = new MySqlCommand(create_query, create_conn);
                MySqlDataReader create_reader;
                create_conn.Open();
                create_reader = create_command.ExecuteReader();
                create_conn.Close();

                MySqlConnection insert_conn = new MySqlConnection(myConnectionString);
                insert_conn.Open();
                FileStream fs;
                Byte[] bindata;
                MySqlParameter picpara;
                MySqlCommand cmd = new MySqlCommand("INSERT INTO personal_info (name, last_name, position, personal_id, part, personal_internal_id, photo_path) VALUES(?name, ?last_name, ?position, ?personal_id, ?part, ?personal_internal_id, ?photo_path)", insert_conn);

                MySqlParameter name_insert = cmd.Parameters.Add("?name", MySqlDbType.Text);
                name_insert.Value = name;

                MySqlParameter lastname_insert = cmd.Parameters.Add("?last_name", MySqlDbType.Text);
                lastname_insert.Value = last_name;

                MySqlParameter position_insert = cmd.Parameters.Add("?position", MySqlDbType.Text);
                position_insert.Value = position;

                MySqlParameter personal_id_insert = cmd.Parameters.Add("?personal_id", MySqlDbType.Text);
                personal_id_insert.Value = personal_id;

                MySqlParameter part_insert = cmd.Parameters.Add("?part", MySqlDbType.Text);
                part_insert.Value = part_name;

                MySqlParameter personal_internal_id_insert = cmd.Parameters.Add("?personal_internal_id", MySqlDbType.Text);
                personal_internal_id_insert.Value = international_id;
                
                picpara = cmd.Parameters.Add("?photo_path", MySqlDbType.MediumBlob);
                cmd.Prepare();

                fs = new FileStream(image_name, FileMode.Open, FileAccess.Read);
                bindata = new byte[Convert.ToInt32(fs.Length)];
                fs.Read(bindata, 0, Convert.ToInt32(fs.Length));
                fs.Close();

                picpara.Value = bindata;
                cmd.ExecuteNonQuery();
                insert_conn.Close();


                MySqlConnection retrieve_conn = new MySqlConnection(myConnectionString);
                retrieve_conn.Open();
                
                MemoryStream retrieve_ms = new MemoryStream();
                FileStream retrieve_fs;
                Byte[] retrieve_bindata;

                MySqlCommand retrieve_cmd = new MySqlCommand("SELECT photo_path FROM personal_info", retrieve_conn);
                retrieve_bindata = (byte[])(retrieve_cmd.ExecuteScalar());



                retrieve_ms.Write(retrieve_bindata, 0, retrieve_bindata.Length);
                testpic.Image = new Bitmap(retrieve_ms);

                retrieve_fs = new FileStream(name, FileMode.Create, FileAccess.Write);
                retrieve_ms.WriteTo(retrieve_fs);

当然这与WinForms无关。我的建议是使用单独的 class 将数据库操作与视觉操作分开,例如 class Repository.

用户对存储库的全部了解是您可​​以在其中存储特定项目,您可以稍后获取这些项目,即使在程序重新启动后也是如此。

您的问题是因为您使用了不正确的方法来执行您的查询:

一个小步骤示例,您在其中使用参数查询多个列:

int customerId = ...
const string sqlText = "Select Id, Name, BirthDay from Customers"
    + " Where (Id = @CustomerId);";

string dbConnectionString = ...
using (var dbConnection = new MySqlConnection(dbConnectionString))
{
    using (var dbCommand = dbConnection.CreateCommand())
    {
         dbCommand.CommandText = sqlText;
         // if your dbCommand has parameters:
         dbCommand.Parameters.AddWithValue("@CustomerId", customerId);

         // execute the query:
         using (var dbReader = dbCommand.ExecuteReader())
         {
              // while there are elements, fetch the data and process them
              while (dbReader.Read())
              {
                  // there is a next item. The first fetched value is in (0)
                  // the 2nd one is in (1) and so forth
                  var fetchedCustomerData = new CustomerData
                  {
                      Id = dbReader.GetInt32(0),
                      Name = dbReader.GetString(1),
                      BirthDay = dbReader.GetDateTime(2),
                  };
                  ProcessFetchedCustomer(fetchedCustomerData);
              }
          }
     }
}

如果您希望每个提取的行只有一个字节:

byte b = dbReader.GetByte(0);

如果您不想逐行读取数据,请考虑使用 GetBytesGetStream。 在这种情况下,您必须自己解释获取的项目。 我从未尝试过这些方法,使用 DbReader 并读取每行的项目通常更容易。如果您想自己解释这些项目,请考虑编写一个小测试程序来查看流中的内容。