C# 无法从C中的Mysql数据库获得WPF datagrid中图像的多个结果
有了这段代码,我可以在WPF中从C中的Mysql数据库中获取一个图像。但我在数据库中有一个表,包含了所有国家的名称和名称 当我查询选择多个或所有国家时,会出现标志等错误 无法在此bi.BEGININT行多次设置初始化状态。 提前谢谢C# 无法从C中的Mysql数据库获得WPF datagrid中图像的多个结果,c#,mysql,database,wpf,datagrid,C#,Mysql,Database,Wpf,Datagrid,有了这段代码,我可以在WPF中从C中的Mysql数据库中获取一个图像。但我在数据库中有一个表,包含了所有国家的名称和名称 当我查询选择多个或所有国家时,会出现标志等错误 无法在此bi.BEGININT行多次设置初始化状态。 提前谢谢 string co = null; string na = null; string le = null; string gn = null; string A = "pak"; BitmapImage bi = ne
string co = null;
string na = null;
string le = null;
string gn = null;
string A = "pak";
BitmapImage bi = new BitmapImage();
try
{
MySqlCommand cmd = new MySqlCommand("Select Code,Name,LifeExpectancy,GNP,flg from country where Name REGEXP '" + A + "'", connection);
MySqlDataReader dataReader = cmd.ExecuteReader();
while (dataReader.Read())
{
co = dataReader["Code"].ToString();
na = dataReader["Name"].ToString();
le = dataReader["LifeExpectancy"].ToString();
gn = dataReader["GNP"].ToString();
Byte[] bindata = (Byte[])dataReader["flg"];
MemoryStream strm = new MemoryStream();
strm.Write(bindata, 0, bindata.Length);
strm.Position = 0;
System.Drawing.Image img = System.Drawing.Image.FromStream(strm);
bi.BeginInit();
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Seek(0, SeekOrigin.Begin);
bi.StreamSource = ms;
bi.EndInit();
dt.Rows.Add(co, na, le, gn, bi);
dataGridCustomers.ItemsSource = dt.DefaultView;
}
}
catch (MySqlException ex)
{
MessageBox.Show(ex.ToString());
}
原因是您正在循环之外创建BitmapImage。因此,一旦进入循环,它就会一直尝试在同一个映像上设置初始化状态。正如您的错误所述,您不能这样做。您需要做的是在每次迭代中创建一个新的BitmapImage。这可以通过移动生产线来实现
BitmapImage bi = new BitmapImage();
到循环的内部。除非有特定的原因,否则您将在您所在的位置初始化它
string co = null;
string na = null;
string le = null;
string gn = null;
string A = "pak";
try
{
MySqlCommand cmd = new MySqlCommand("Select Code,Name,LifeExpectancy,GNP,flg from country where Name REGEXP '" + A + "'", connection);
MySqlDataReader dataReader = cmd.ExecuteReader();
while (dataReader.Read())
{
BitmapImage bi = new BitmapImage();
co = dataReader["Code"].ToString();
na = dataReader["Name"].ToString();
le = dataReader["LifeExpectancy"].ToString();
gn = dataReader["GNP"].ToString();
Byte[] bindata = (Byte[])dataReader["flg"];
MemoryStream strm = new MemoryStream();
strm.Write(bindata, 0, bindata.Length);
strm.Position = 0;
System.Drawing.Image img = System.Drawing.Image.FromStream(strm);
bi.BeginInit();
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Seek(0, SeekOrigin.Begin);
bi.StreamSource = ms;
bi.EndInit();
dt.Rows.Add(co, na, le, gn, bi);
dataGridCustomers.ItemsSource = dt.DefaultView;
}
}
catch (MySqlException ex)
{
MessageBox.Show(ex.ToString());
}
编辑:在上面的代码中,System.Drawing.Image是完全冗余的。您应该直接从字节数组创建BitmapImage,如下所示:
var bindata = (byte[])dataReader["flg"];
var bi = new BitmapImage();
using (var stream = new MemoryStream(bindata))
{
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = stream;
bi.EndInit();
}
我在while循环外初始化了它,并尝试缓存,但错误是一样的;当它已经初始化时,您正在尝试初始化它。在循环中为每次迭代创建BitMapImage的新实例,如我的回答中所述,以消除此问题。现在我已在循环中移动了这一行,现在错误是,这一行的参数无效img=System.Drawing.Image.FromStreamstrm;那么这里的问题已经回答了。新的错误将需要一个新的问题,尽管我确信它已经存在了。您收到的数据是否有效?放置断点并确认它是您希望从数据库返回的内容。@DailyLifeVideos请查看编辑后的答案,以了解创建位图图像的较简单方法。