【发布时间】: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()?
标签: c# mysql list winforms blob