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