C#winform datagridivew 中 知道行号 如何获得一行全部数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#winform datagridivew 中 知道行号 如何获得一行全部数据相关的知识,希望对你有一定的参考价值。

datagridview.datasource.tables[0].rows[0].itemarry[0] 第一行第一个数据
datagridview.datasource.tables[0].rows[0].itemarry[1] 第一行第二个数据
datagridview.datasource.tables[0].rows[0].itemarry[2] 第一行第三个数据
datagridview.datasource.tables[0].rows[0].itemarry[3] 第一行第四个数据 后面以此类推
改变行就修改 rows[] 里面的数值
参考技术A datagridivew.rows[行号+1].Cells["列名称"].Value 参考技术B 还是一个单元格的取吧。

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

【中文标题】如何使用c#winform从mysql db中检索所有数据【英文标题】:how to retrieve all data from mysql db using c# winform 【发布时间】:2021-04-09 23:26:55 【问题描述】:

我正在尝试从 C# winform 中的 mysql 表中检索所有数据并从图像数据开始,但它只检索一个图像而不是另一个图像,我不知道如何访问我的所有数据以及如何显示所有他们! 我的意思是当它执行“select * from table_name”时,我如何访问所有这些数组值? 第二个问题是正如您在winforms中所知道的,我们应该有一个位置,然后将值放入其中,例如我们应该有一个 text_box 然后向其中插入文本但是当用户想要另一个文本时,应用程序必须创建一个新的 text_box 因为它不可能猜到好的,我认为用户只需要 6 个文本框,当然它就足够了。也许他或多或少需要我如何让应用程序创建 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);

【问题讨论】:

我看到你正在使用retrieve_cmd.ExecuteScalar()。标量查询只返回一个值。可以安全地假设SELECT photo_path FROM personal_info 是这样吗?看起来查询可以返回多行。 嗯……通常,您会从数据库中读取数据,它通常会返回 DataSetDataTable 以及其他数据收集对象。然后将数据显示给用户,这可以通过多种方式完成,你用多个文本框描述的当然是可行的,但是 UI “Grid” 或某种 UI “collection” 容器应该能够直接绑定到DataSetDataTable. List<T> 也是一个可能的数据收集对象。选择你自己的毒药。 谢谢 Thorsten Kettner,您对此有何看法?我的意思是我应该使用什么来代替 ExecuteScalar()? 【参考方案1】:

当然这与 WinForms 无关。我的建议是使用单独的类将数据库操作与您的视觉操作分开,例如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 并读取每行的项目更容易。如果您想自己解释这些项目,请考虑编写一个小型测试程序来查看流中的内容。

【讨论】:

以上是关于C#winform datagridivew 中 知道行号 如何获得一行全部数据的主要内容,如果未能解决你的问题,请参考以下文章

如何用来自datagridivew1 c#的信息填充datagridview2

C#winform中数据列表显示(急)

C#winform中调用wpf

在C#winform中如何遍历子窗体中所有的控件

C#winform中使用多个Combobox但不让他们有任何关联

在C#winform窗体中,放入一控件axAcroPDF1,