繁体   English   中英

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

[英]C# WPF Retrieve Image from SQL Server database, byte to 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:'对象引用未设置为对象的实例。

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构造函数中,如下设置Image的Source:

imgTest.Source = userLoginDetails.PictureID;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM