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
是这样吗?看起来查询可以返回多行。
嗯……通常,您会从数据库中读取数据,它通常会返回 DataSet
或 DataTable
以及其他数据收集对象。然后将数据显示给用户,这可以通过多种方式完成,你用多个文本框描述的当然是可行的,但是 UI “Grid” 或某种 UI “collection” 容器应该能够直接绑定到DataSet
或 DataTable.
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);
如果您不想按行读取数据,请考虑使用GetBytes
或GetStream
。
在这种情况下,您必须自己解释获取的项目。
我从未尝试过这些方法,通常使用 DbReader 并读取每行的项目更容易。如果您想自己解释这些项目,请考虑编写一个小型测试程序来查看流中的内容。
【讨论】:
以上是关于C#winform datagridivew 中 知道行号 如何获得一行全部数据的主要内容,如果未能解决你的问题,请参考以下文章
如何用来自datagridivew1 c#的信息填充datagridview2