【问题标题】:Updating image in VB and SQL Server not working [closed]在 VB 和 SQL Server 中更新图像不起作用[关闭]
【发布时间】:2020-01-04 09:27:56
【问题描述】:
Private Sub UpdateBTN_Click(sender As Object, e As EventArgs) Handles UpdateBTN.Click
    Dim IDdelete = Me.DataGridView1.Item(0, Me.DataGridView1.CurrentRow.Index).Value
    da.UpdateCommand.Parameters.Add(New SqlClient.SqlParameter("@Spic", SqlDbType.Image)).Value = IO.File.ReadAllBytes(ofd.FileName)

    da.UpdateCommand = New SqlCommand
    da.UpdateCommand.CommandText = "update Students set Fname = ' " & FnameTXT.Text & "' , Lname = ' " & LnameTXT.Text & "' , DOB = ' " & DateTimePicker1.Value.Date & "' , Address = '" & AddressTXT.Text & "' , Nationality = '" & NationalityCBX.Text & "' , Img =  '@Spic'  where StudentID = '" & IDdelete & "'"
    da.UpdateCommand.Connection = con

    con.Open()
    da.UpdateCommand.ExecuteNonQuery()
    con.Close()

【问题讨论】:

  • 首先,修复你巨大的安全漏洞;您的代码对注入开放
  • 标题和一些代码从来都不是一个好问题。您始终需要对问题提供完整而清晰的解释,其中包括您想要实现的确切目标、您正在做什么以及执行此操作时会发生什么。
  • 您不应该在 SQL Server 中使用 image 数据类型。该文档已明确指出它已被弃用十多年,因此没有任何借口。对于任何二进制数据,包括图像数据,都应存储在varbinary 列中。
  • 你显然知道,一般来说,如何在 ADO.NET 中使用参数,那就去做吧。不要只对二进制数据这样做,而是对所有数据这样做。假设不使用参数来保存用户输入的数据是绝对不安全的。来自应用程序的数据可以是,例如从下拉列表中选择的值,但实际上没有理由不对所有变量数据使用参数。如果你全力以赴,那么你就不会在应该做的时候不做。

标签: sql-server database vb.net


【解决方案1】:

该代码还有其他问题,但我将专注于与您所陈述的问题最直接相关的两个问题。

首先,你的 SQL 代码中有这个:

Img =  '@Spic'

这是错误的。如果你想在 VB 中使用变量的值,你会用双引号将变量名括起来吗?你当然不会!那将使用包含变量名称而不是变量本身的值的String。考虑到这一点,当 SQL 中单引号的目的是专门表示文字字符串时,为什么要将 SQL 参数的名称用单引号括起来?

即使你解决了这个问题,它仍然无法正常工作:

da.UpdateCommand.Parameters.Add(New SqlClient.SqlParameter("@Spic", SqlDbType.Image)).Value = IO.File.ReadAllBytes(ofd.FileName)

da.UpdateCommand = New SqlCommand

您向当前分配给UpdateCommand 属性的命令对象添加一个参数,然后立即丢弃该命令对象并用一个新对象替换它。如果你有一碗冰淇淋,在上面撒上巧克力,然后把冰淇淋扔进去,然后在碗里放一个新的scopp,你会惊讶于上面没有巧克力吗?当然不是。这正是您所期望的,那么您为什么认为这里会有所不同呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多