C#/SQL:从 DataGridView 到 Picturebox 的 Varbinary(max) 列

Posted

技术标签:

【中文标题】C#/SQL:从 DataGridView 到 Picturebox 的 Varbinary(max) 列【英文标题】:C#/SQL: Varbinary(max) column to DataGridView to Picturebox 【发布时间】:2021-08-09 23:38:15 【问题描述】:

我现在完全糊涂了。善良的女士们,善良的先生们;请帮忙!

这就是我正在做的事情:

我有一个 WinForms 应用程序连接到一个带有 varbinary(max) 列用于存储图片的 SQL 数据库。 在我的父表单 (form1) 中,我有一个 DataGridView (dgv1)。双击任意一行会弹出一个新表单 (form2),我可以在其中编辑行数据,其中还有一个 PictureBox (pb1)。

如果我添加图片,然后返回并刷新 DataGridView,并尝试打开同一行,它会给我这个错误消息:

如果我进入数据库并将 varbinary(max) 列的值设置回 NULL(来自 ),并尝试再次打开同一行,它会正常工作。

让我给你看我的代码:

// this runs when I double click a row in dgv1

ChildForm myChildForm = new ChildForm();
myChildForm.txt1.Text = dgv1.CurrentRow.Cells[0].Value.ToString();
myChildForm.txt2.Text = dgv1.CurrentRow.Cells[1].Value.ToString();
myChildForm.txt3.Text = dgv1.CurrentRow.Cells[2].Value.ToString();

if (DBNull.Value != dgv1.CurrentRow.Cells[3].Value) 
    MemoryStream mStream = new MemoryStream((byte[])dgv1.CurrentRow.Cells[3].Value);
    myChildForm.pb1.Image = Image.FromStream(mStream);

myChildForm.ShowDialog();
// this is on a button, and how I send the edited info from *form2* to the database

byte[] imageData;

    using (SqlConnection sqlCon = new SqlConnection(connectionString))
    using (SqlCommand sqlCmd = new SqlCommand())
    using (MemoryStream mStream = new MemoryStream()) 

        sqlCon.Open();
        sqlCmd.Connection = sqlCon;
        sqlCmd.Parameters.AddWithValue("@Parameter1", txt1.Text.ToString());
        sqlCmd.Parameters.AddWithValue("@Parameter2", txt2.Text.ToString());
        sqlCmd.Parameters.AddWithValue("@Parameter2", txt2.Text.ToString());

        imageData = mStream.ToArray();
        sqlCmd.Parameters.AddWithValue("@Parameter3", SqlDbType.VarBinary).Value = imageData;
        pb1.Image.Save(mStream, ImageFormat.Jpeg);

        SqlCmd.ExecuteNonQuery();

如果有人能给我任何关于我做错了什么的提示,我将不胜感激!谢谢!

【问题讨论】:

你为什么要插入一个空数组? 【参考方案1】:

嗯,首先imageData 将是一个空的byte[],因为您在将图像数据写入流之前从 MemoryStream 进行复制。

imageData = mStream.ToArray();
sqlCmd.Parameters.AddWithValue("@Parameter3", SqlDbType.VarBinary).Value = imageData;
pb1.Image.Save(mStream, ImageFormat.Jpeg);

至少,在将数据复制到 byte[] 之前将数据写入 MemoryStream 并正确创建 SqlParameter。

pb1.Image.Save(mStream, ImageFormat.Jpeg);
imageData = mStream.ToArray();
var pImg = sqlCmd.Parameters.Add("@Parameter3",SqlDbType.VarBinary, -1);
pImg.Value = imageData;

【讨论】:

感谢 Microsoft 的 David Browne 爵士。成功了! 你知道吗sqlCmd.Parameters.Add("@Parameter3", SqlDbType.VarBinary, -1).Value = imageData; 是的。只要您不需要设置方向或其他属性。原始 ADO.NET 应该是冗长的。否则使用 Dapper 或 EF。

以上是关于C#/SQL:从 DataGridView 到 Picturebox 的 Varbinary(max) 列的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 sql 查询加载到 datagridview?

使用 sql 语句从第二个 datagridview 填充 DataGridView

c#datagridview删除选中行,并删除SQL数据库中对应行

c#winform datagridview控件怎么在上面直接修改并且更新到sql数据库

C# Visual Studio - 将 SQL 表数据输出到 Datagridview

C# 怎么把从数据库查询出来的东西累加到dataGridView里面去