即使图像没有改变,如何更新数据库记录

2024-04-03

我使用 localDB 作为我的数据库。

我有一个员工表,员工图像存储在另一个表中

这是我用于创建和更新的存储过程:

    IF NOT EXISTS (SELECT * 
                   FROM   dbo.Employee 
                   WHERE  employee_id=@employee_id)   
    BEGIN TRY
        BEGIN TRAN
            INSERT INTO dbo.Employee 
            (employee_name,
             city,
             department,
             gender
            )  
            OUTPUT inserted.employee_id 
            INTO   @employee_id_PK (employee_id) 
            VALUES 
            (@employee_name,
             @city,
             @department,
             @gender
            )  
            
            SELECT @FK_Employee_Image_To_Employee_Table = employee_id 
            FROM   @employee_id_PK 
            INSERT INTO dbo.Employee_Image
            (user_image,
             file_extension,
             employee_id
            )
            VALUES
            (@user_image,
             @file_extension,
             @FK_Employee_Image_To_Employee_Table
            )
        COMMIT TRAN 
    END TRY

    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRAN --RollBack in case of Error
        RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
    END CATCH
            

    ELSE  
    BEGIN TRY
        BEGIN TRAN
            UPDATE e
            SET    e.employee_name=@employee_name,
                  e.city=@city,
                  e.department=@department,  
                  e.gender=@gender
            FROM   dbo.Employee e, dbo.Employee_Health_Insurance h
            WHERE  e.employee_id=@employee_id AND h.employee_id=@employee_id
                                                                         
            UPDATE i
            SET    i.user_image=@user_image,
                  i.file_extension=@file_extension
            FROM   dbo.Employee_Image i, dbo.Employee e
            WHERE  i.employee_id=@employee_id AND e.employee_id=@employee_id
        COMMIT TRAN
    END TRY

    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRAN --RollBack in case of Error
        RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
    END CATCH 


这就是我通过 C# 添加记录的方法

using (SqlConnection con = new SqlConnection(connectionStringConfig))
using (SqlCommand sqlCmd = new SqlCommand("spCreateOrUpdateData", con))
{
try
{
    con.Open();
    sqlCmd.CommandType = CommandType.StoredProcedure;

    //Employee Record
    sqlCmd.Parameters.Add("@employee_id", SqlDbType.NVarChar).Value = EmployeeId;
    sqlCmd.Parameters.Add("@employee_name", SqlDbType.NVarChar, 250).Value = txtEmpName.Text;
    sqlCmd.Parameters.Add("@city", SqlDbType.NVarChar, 50).Value = txtEmpCity.Text;
    sqlCmd.Parameters.Add("@department", SqlDbType.NVarChar, 50).Value = txtEmpDept.Text;
    sqlCmd.Parameters.Add("@gender", SqlDbType.NVarChar, 6).Value = cboEmpGender.Text;

    //Employee Image 
    sqlCmd.Parameters.Add("@user_image", SqlDbType.VarBinary, 8000).Value = ConvertImageToByteArray(pictureBox1.Image); <-----------------error here according to StackTrace
    sqlCmd.Parameters.Add("@file_extension", SqlDbType.VarChar, 12).Value = lblFileExtension.Text;

    int numRes = sqlCmd.ExecuteNonQuery();
    string ActionType = (btnSave.Text == "Save") ? "Saved" : "Updated";
    if (numRes > 0)
    {
        MessageBox.Show($"{ txtEmpName.Text }'s record is { ActionType } successfully !!!");
        RefreshData();
    }
    else
        MessageBox.Show($"{txtEmpName.Text} Already Exist !!!");
}
catch (Exception ex)
{
    MessageBox.Show($"Cannot INSERT or UPDATE data! \nError: { ex.Message }");
}

这就是我将图像转换为 byte[] 数组的方法:

byte[] ConvertImageToByteArray(Image img)
{
    //with memory stream:
    /*[1]
    using (MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, img.RawFormat);<-----------------error here according to StackTrace
        return ms.ToArray();
    }*/

    /*[2]
    using (MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, img.RawFormat);<-----------------error here according to StackTrace
        byte[] arrImage = ms.GetBuffer();
        return arrImage;
    }*/


    // with image converter
    /*ImageConverter converter = new ImageConverter();
    return (byte[])converter.ConvertTo(img, typeof(byte[]));*/ <-------------error here according to StackTrace
}

我在将图像转换为字节数组时尝试了上面的代码,当我INSERT它到数据库,但是当我UPDATE一条记录(例如更改了“员工姓名”)而不更改图像,它将显示错误:“GDI+ 发生一般错误。”

EDIT:

它与检索图像有关系吗?

我不在我的 datagridview 上显示我的图像二进制数据,但我像这样显示/检索我的图像:

private void dgvEmpDetails_CellClick(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        if (e.RowIndex != -1)
        {
            DataGridViewRow row = dgvEmpDetails.Rows[e.RowIndex];
            EmployeeId = row.Cells[0].Value?.ToString();             
            txtEmpName.Text = row.Cells[1].Value?.ToString();
            txtEmpCity.Text = row.Cells[2].Value?.ToString();
            txtEmpDept.Text = row.Cells[3].Value?.ToString();
            cboEmpGender.Text = row.Cells[4].Value?.ToString();

            //Display user image
            using (SqlConnection con = new SqlConnection(connectionStringConfig))
            using (SqlCommand sqlCmd = new SqlCommand("SELECT user_image, file_extension FROM dbo.Employee_Image WHERE employee_id=@employee_id", con))
            {
                con.Open();
                sqlCmd.Parameters.Add("@employee_id", SqlDbType.NVarChar).Value = EmployeeId;

                using (SqlDataReader reader = sqlCmd.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        reader.Read();
                        pictureBox1.Image = ConvertByteArrayToImage((byte[])(reader.GetValue(0))); <------------- displaying the image here
                        lblFileExtension.Text = reader.GetValue(1).ToString();
                    }
                    else
                    {
                        pictureBox1.Image = null;
                    }
                }
            }
            btnSave.Text = "Update";
            btnDelete.Enabled = true;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Something is wrong with the selected record! \nError: { ex.GetType().FullName }");
    }
}

我将字节数组转换为图像的方法:

public static Image ConvertByteArrayToImage(byte[] byteArrayIn)
{
    using (MemoryStream ms = new MemoryStream(byteArrayIn))
    {
        Image returnImage = Image.FromStream(ms);
        return returnImage;
    }
}

我已经通过修改此方法解决了这个问题:https://stackoverflow.com/a/14866755/11565087 https://stackoverflow.com/a/14866755/11565087

这是我将图片从 pictureBox 转换为 byte[] 的代码:

public static byte[] ImageToBytes(Image userImage)//Get bytes of the image
{
    using (MemoryStream ms = new MemoryStream())
    using (Bitmap tempImage = new Bitmap(userImage))
    {
        /*copy the object (userImage) into a new object (tempImage), 
            then use that object(tempImage) to "Write" */
        tempImage.Save(ms, userImage.RawFormat);
        return ms.ToArray();
    }
}

这是我的代码,用于从数据库转换图像的二进制数据并将其加载到我的图片框:

public static Image BytesToImage(byte[] buffer) //Get image from database
{
    using (MemoryStream ms = new MemoryStream(buffer))
    {
        return Image.FromStream(ms);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使图像没有改变,如何更新数据库记录 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 如何在VB.NET中画一条线

    我正在尝试用 VB NET 画一条简单的线 我的代码如下 但是当我运行代码时 只显示表单 没有线 我在这里做错了什么 Public Class Form1 Dim pen As System Drawing Graphics Private
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • 展开 std::reference_wrapper 的成本

    Given include
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir

随机推荐

  • PHP 中每个文件只有一个或多个函数?

    每当我用 php 设计我的应用程序时 我都会遇到这个问题 这确实让我头疼 我不知道是否应该为每个函数创建单独的文件 例如 用于验证特定表单的函数 好吧 有人可能会认为这没有意义 因为我必须单独包含每个文件 这可能会导致应用程序更慢 但我仍然
  • C++ - 检测超出范围的访问

    我想分析我的 C 代码以查找向量和数组中的错误访问 超出范围访问 是否有工具可以实现这一点 提前致谢 如果您使用的是 gcc 则可以使用定义的 GLIBCXX DEBUG 和 GLIBXX DEBUG PEDATIC 进行编译 如果请求越界
  • 如何修改此 sed awk 命令以便输出到所选文件?

    我正在使用这个答案中的最后一个命令https stackoverflow com a 54818581 80353 https stackoverflow com a 54818581 80353 cap cd tmp rm f vtt y
  • 对 AngularJS 依赖注入不一致感到困惑

    我是新来的angular js 并浏览了几个教程 包括此处的所有教程代码学校 http campus codeschool com courses shaping up with angular js intro 我发现它们非常有用 并且学
  • Google Play 开发者控制台:支持的 Android 设备:0

    我尝试过多次上传 我还查看了有关同一问题的许多其他问题 在我的物理设备上运行良好 但上传到 google play 时显示它支持 0 个设备
  • 为什么我会在 .NET 的 StartsWith 中看到这种意外行为?

    这一定是一个 NET 错误 对吧 KonNy StartsWith Kon 返回 false 同时 KonNy StartsWith Ko and KonN StartsWith Kon 返回真 我在这里缺少什么吗 重复评论 我不太了解 N
  • 使用 fql 检查 Facebook 用户是否喜欢某个页面

    我想检查登录用户是否喜欢指定的页面 下面是我的代码 fql pageid SELECT url site id FROM object url WHERE url IN http developers facebook com api pa
  • 将本地分支合并到远程分支而不是master?

    我有一个本地分支 A 但远程存储库中尚不存在 我在远程仓库中还有一个远程分支 B 如何将本地更改合并到远程分支 如果分支 B 在本地 您可以在本地合并 A 到 B 然后将 B 推送到远程 git checkout B git merge A
  • ASP.NET 中的简单 Web 部件显示为空白页

    我正在尝试开发 Web 部件VS 2008 WinXP 我创建了一个网站项目 并在默认表单中添加了几个 Web 部件default aspx
  • 无法通过curl访问github

    尝试使用以下命令访问 github 失败 并出现验证失败错误 我应该怎么做才能解决这个问题 C software curl 7 23 1 win64 ssl sspi gt curl i https api github com curl
  • 在 Bash 中分割逗号分隔的字符串

    我有这个文件 里面有 20k IP 104 20 15 220 104 20 61 219 104 20 62 219 104 20 73 221 104 20 74 221 104 20 14 220 104 20 15 220 104
  • C# 奇怪的 WPF 组合框行为

    I have simple window This is what happens when I click ComboBox List appears in upper left corner of screen instead of u
  • 构建 Erlang 服务器场(用于业余爱好项目)最便宜的方法是什么? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 假设我们有一个 本质上并行 的问题需要用 Erlang 软件来解决 我们有很多并行进程 每个进程都执行顺序代码 不是数字运算 并且我们向它们投入的 C
  • C++ 元编程中的 typedef 与公共继承

    免责声明 这个问题与继承而不是 typedef https stackoverflow com questions 441744 inheritance instead of typedef到目前为止我找不到任何类似的问题 我喜欢玩 C 模
  • 在 iPhone 中显示图库中的图像

    我是 iPhone 新手 现在正处于学习阶段 实际上我想实现读取存储在 iPhone PHOTO Gallery 中的图像 然后将其显示到我的应用程序上 我在很多搜索引擎中进行了搜索 但找不到任何东西 你们这里都是专业人士 请指导我完成一些
  • 使用 PHP 反向抓取图像

    我需要使用 google 反向图像搜索来获取一些图像 API 不支持该搜索 但幸运的是 您可以通过图像的直接链接查询 google 它仍然显示结果 因此 googleURL https www google com searchbyimag
  • 我应该使用哪个版本的 iOS SDK?

    请告诉我应该使用哪个版本的 iOS SDK 以便我的应用程序可以在 iPhone 3 0 或更高版本上运行 您应该注意两个不同的概念 基础 SDK 这是您用来构建应用程序的内容 最新版本是 4 2 因此您应该使用它来构建您的应用程序 iOS
  • 自动在输入框中填写数据

    我有四个输入框 如果用户填充第一个框并单击按钮 那么它应该使用用户在第一个框中输入的值自动填充剩余的输入框 可以使用javascript来完成吗 或者我应该说用用户输入的最后数据预先填充文本框 单击按钮时 调用此函数 function fi
  • 为什么“notifyDatasetChanged()”不通知所有可见项目?

    背景 注意 我已经使用listViews很多年了 所以我非常熟悉如何使用适配器 ViewHolders等 所以这个问题对我来说没有意义 这次我遇到了一个非常奇怪的行为 由于某种原因只发生在 2 台设备上 LG G2 搭载 Android 4
  • 即使图像没有改变,如何更新数据库记录

    我使用 localDB 作为我的数据库 我有一个员工表 员工图像存储在另一个表中 这是我用于创建和更新的存储过程 IF NOT EXISTS SELECT FROM dbo Employee WHERE employee id employ