C# WPF 从 SQL Server 数据库中检索图像,字节到图像

标签 c# sql sql-server wpf image

所以我有这些代码可以获取用户信息。

注意:注释行是我已经尝试过的内容。

代码:

    public UserInfo GetUserCredentials(string usernameParameter, string passwordParameter)
    {
        UserInfo getInfo = new UserInfo();

        try
        {
            accessToDatabase.OpeningDatabase();
            String query = "SELECT * FROM Users where Username=@Username AND Password=@Password";
            SqlCommand sqlCmd = accessToDatabase.Command(query);

            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.Parameters.AddWithValue("@Username", usernameParameter);
            sqlCmd.Parameters.AddWithValue("@Password", passwordParameter);
            SqlDataReader oReader = sqlCmd.ExecuteReader();

            byte[] pictureIdByte;
            Image pictureIdImg = null;

            while (oReader.Read())
            {
                getInfo.Username = oReader["Username"].ToString();
                getInfo.Password = oReader["Password"].ToString();
                getInfo.Role = oReader["Role"].ToString();
                getInfo.Firstname = oReader["Firstname"].ToString();
                getInfo.Lastname = oReader["Lastname"].ToString();
                getInfo.Status = Convert.ToInt32(oReader["Status"]);
                getInfo.Gender = oReader["Gender"].ToString();
                getInfo.Birthday = oReader["Birthday"].ToString();
                getInfo.Email = oReader["Email"].ToString();
                getInfo.Address = oReader["Address"].ToString();
                getInfo.City = oReader["City"].ToString();
                getInfo.Country = oReader["Country"].ToString();
                getInfo.Mobilenumber = oReader["Mobile"].ToString();

                pictureIdByte = (byte[])(oReader["PictureID"]);

                if (pictureIdByte == null)
                {
                    getInfo.PictureID = pictureIdImg;
                }
                else
                {
                    //MemoryStream stream = new MemoryStream(pictureIdByte);
                    //getInfo.PictureID.Source = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);

                    //var pictureIdVar = new BitmapImage();
                    //using (var memStream = new MemoryStream(pictureIdByte))
                    //{
                    //    memStream.Position = 0;
                    //    pictureIdVar.BeginInit();
                    //    pictureIdVar.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                    //    pictureIdVar.CacheOption = BitmapCacheOption.OnLoad;
                    //    pictureIdVar.UriSource = null;
                    //    pictureIdVar.StreamSource = memStream;
                    //    pictureIdVar.EndInit();
                    //}
                    //pictureIdVar.Freeze();
                    //getInfo.PictureID.Source = pictureIdVar;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            accessToDatabase.ClosingDataBase();
        }
        return getInfo;
    }

我有这个主窗口,其中有一个图像,我从 xaml 设计中拖放了它。并使用后面的代码,我尝试像这样设置源但是每当我尝试登录时它都会给我一个错误:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

MyThesisProject.Model.UserInfo.PictureID.get 返回 null。

这是主窗口 xaml 的隐藏代码:

public partial class MainWindow : Window
{
    public MainWindow(UserInfo userLoginDetails)
    {
        InitializeComponent();
        imgTest.Source = userLoginDetails.PictureID.Source;
    }
}

我不知道我哪里错了,我尝试使用注释行,但仍然是 null 的相同错误。

最佳答案

您的 UserInfo 类中不应有 Image 元素。

PictureID 属性的类型更改为 ImageSource

public class UserInfo
{
    ...
    public ImageSource PictureID { get; set; } 
    ...
}

并像这样设置它的值:

if (pictureIdByte != null)
{
    using (var stream = new MemoryStream(pictureIdByte))
    {
        getInfo.PictureID = BitmapFrame.Create(stream,
                                BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }
}

在您的 MainWindow 构造函数中,像这样设置图像的源:

imgTest.Source = userLoginDetails.PictureID;

关于C# WPF 从 SQL Server 数据库中检索图像,字节到图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48843128/

相关文章:

c# - EF Core 中是否存在等效于 Database.CompatibleWithModel(bool)

mysql - 在 MySQL 中更改日期时间值

c# - 尝试使用 sql 查询 INSERT INTO 在我的表中插入一行

mysql - Rails 应用程序的最佳表关系

Python pyodbc.row 列出

mysql - 使用 'like' 查找 sql 中的整个单词

c# - 如何在Azure表中允许不同的数据格式?

c# - WinForms MDI 子窗体

c# - MS在c#/.net中将MDB Access 到Sqlite

sql - 如何在 Excel 外部数据请求中使用参数?