C# 无法从C中的Mysql数据库获得WPF datagrid中图像的多个结果

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

有了这段代码,我可以在WPF中从C中的Mysql数据库中获取一个图像。但我在数据库中有一个表,包含了所有国家的名称和名称 当我查询选择多个或所有国家时,会出现标志等错误 无法在此bi.BEGININT行多次设置初始化状态。 提前谢谢

    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请查看编辑后的答案,以了解创建位图图像的较简单方法。