如何使用 C# 和 SQL 将存储在数据库中的图像加载到图片框对象中

Posted

技术标签:

【中文标题】如何使用 C# 和 SQL 将存储在数据库中的图像加载到图片框对象中【英文标题】:How to load an image that is stored in a database into a picturebox object with C# and SQL 【发布时间】:2021-05-03 02:16:09 【问题描述】:

在以下窗体中双击数据网格对象中的一行时,相关信息将正确显示在辅助窗体中。

但是我不确定如何使图像也显示在学生表格内的图片框中。

这是目前为止的代码:

public bool IsUpdate  get; set; 

        private void StudentForm_Load(object sender, EventArgs e)
        
            //For Update Process
            if (this.IsUpdate == true)
            
                using (SqlConnection con = new SqlConnection(AppConnection.GetConnectionString()))
                
                    using (SqlCommand cmd = new SqlCommand("usp_Student_ReloadDataForUpdate", con))
                    
                        cmd.CommandType = CommandType.StoredProcedure;

                        cmd.Parameters.AddWithValue("@StudentName", this.StudentName);

                        if (con.State != ConnectionState.Open)
                            con.Open();

                        DataTable dtStudent = new DataTable();

                        SqlDataReader sdr = cmd.ExecuteReader();

                        dtStudent.Load(sdr);

                        DataRow row = dtStudent.Rows[0];

                        StudentNameTextBox.Text = row["StudentName"].ToString();
                        AgeTextBox.Text = row["Age"].ToString();
                        GenderTextBox.Text = row["Gender"].ToString();
                        DescriptionTextBox.Text = row["Description"].ToString();
                        //IdPictureBox.Image = row["Image"].???

                        SaveButton.Text = "Update Student Information";
                        DeleteButton.Enabled = true;
                    
                
            

以下是上述方法的存储过程:

CREATE PROCEDURE usp_Student_ReloadDataForUpdate
(
    @StudentName NVARCHAR(200)
)
AS
    BEGIN

        SELECT [StudentId]
              ,[StudentName]
              ,[Age]
              ,[Gender]
              ,[Description]
              ,[Image]
          FROM [dbo].[Students]
          WHERE StudentName = @StudentName
    END

这就是数据在数据库中的保存方式

        private void SaveButton_Click(object sender, EventArgs e)
        
            if(IsFormValid())
            
                //Do Update Process
                using (SqlConnection con = new SqlConnection(AppConnection.GetConnectionString())) //connect to database using AppConnection class and GetConnectionString method
                
                    using (SqlCommand cmd = new SqlCommand("usp_Student_InsertNewStudent", con))
                    
                        cmd.CommandType = CommandType.StoredProcedure;

                        cmd.Parameters.AddWithValue("@StudentName", StudentNameTextBox.Text.Trim());
                        cmd.Parameters.AddWithValue("@Age", AgeTextBox.Text.Trim());
                        cmd.Parameters.AddWithValue("@Gender", GenderTextBox.Text.Trim());
                        cmd.Parameters.AddWithValue("@Description", DescriptionTextBox.Text.Trim());
                        var image = IdPictureBox.Image;
                        using (var ms = new MemoryStream())
                        
                            image.Save(ms, image.RawFormat);
                            cmd.Parameters.Add("@Image", SqlDbType.VarBinary).Value = ms.ToArray();
                        
                        cmd.Parameters.AddWithValue("@CreatedBy", LoggedInUser.UserName);


                        if (con.State != ConnectionState.Open)
                            con.Open();

                        cmd.ExecuteNonQuery();

                        MessageBox.Show("Student is successfully updated in the database.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        ResetFormControl();
                    
                
            

【问题讨论】:

【参考方案1】:

存储的数据是一个字节[](Varbinary)。您应该将其转换为图像:

var pic = (byte[])row["Image"];
if (pic != null)

   using (MemoryStream ms = new MemoryStream(pic))
   
    IdPictureBox.Image = Image.FromStream(ms);
   

PS:我不是在评论你的其余代码,就像你不应该使用 AddWithValue 而是使用 Add。

【讨论】:

好的,感谢您的建议,我会相应地更新代码。

以上是关于如何使用 C# 和 SQL 将存储在数据库中的图像加载到图片框对象中的主要内容,如果未能解决你的问题,请参考以下文章

如何将来自用户的输入图像与 C# 中数据库中存储的图像进行比较 [关闭]

如何使用 C# 将数据库中的 base64 值转换为流

图像无法在 asp webapp (c#) 中解析

如何通过 C# ASP.net 从 SQL Server 中的文本框中存储日期

使用 Visual C# 将图像添加到 SQL 数据库

C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()