【问题标题】:Passing parameters to Insert statement in PostgreSQL将参数传递给 PostgreSQL 中的 Insert 语句
【发布时间】:2020-10-02 19:25:43
【问题描述】:

我有一个 WCF Windows 服务,该服务用于在 PostgreSQL 上执行 CURD 操作。 现在我正在尝试将动态参数传递给 PostgreSQL 中的插入或更新语句。

我在客户端使用查询和参数构建了一个字符串,在服务端我正在解析该字符串以获取查询和参数名称、值。

这是我从客户端发送的字符串: Insert into Test_Images (ImageID,Image,Description) Values (@ImageID,@Image,@Description)*!*cf92d82b3fc6b53490df71a2e2989dfc*!*@ImageID*!*5*!*@Image*!*5646546546546546541621321654168514685141654564532168541*!*@Description*!*'Test'

这是我在服务端用来将这些值传递给数据库的代码:

Private Sub InsertBlob()
    'dbconn is the psqlconnection       
    procCmd.Connection = dbConn
    If (paramValues IsNot Nothing And paramNames IsNot Nothing) Then
        If (paramNames.Length <> paramValues.Length) Then
            Dim sE As New Exception("Parameter Names count and Values count do not match")
            sE.Data.Add("HTTPSTATUSCODE", 400)
            Throw sE
        End If
        For pCount = 0 To paramNames.Length - 1
            procCmd.Parameters.AddWithValue(paramNames(pCount), paramValues(pCount))
        Next
    End If
    dbConn.Open()
    procCmd.CommandText = sQuery
    procCmd.ExecuteNonQuery()
End Sub

这种方法正在放弃普遍的错误。 Pervasive.Data.SqlClient.Lna.k: [LNA][PSQL][SQL Engine]Error in expression: @ImageID

虽然下面没有参数的查询总是正确执行。

 Insert into Test_Images (ImageID,Image,Description) Values (2,5646546546546546541621321654168514685141654564532168541,'Test')

有人可以帮我插入这些值作为参数吗?在传递 Image 字段的 BLOB 数据时,我还需要帮助。

注意:Image 字段的数据是 LONGVARBINARY 类型,因为我无法在此处插入总的 BLOB 数组,所以我插入了一个小的二进制字符串,只是为了便于理解。我正在使用 BLOB 数组,因为我无法发送图像的路径,因为客户端和服务器不会在同一台机器上。

【问题讨论】:

  • 你能显示你传递给 paramValues 的值吗?不要使用 AddWithValue,而是通过显式设置它的类型来创建参数
  • 参数的“@”前缀是微软的东西。一些 ADO.NET 提供程序增加了对它的支持,例如MySQL 的连接器/网络,因为它们正在 Microsoft 堆栈中使用。不过,情况并非如此。您的问题归结为表示 PostgreSQL 参数的正确方法是什么,您可以自己轻松研究。
  • 我已经用查询在客户端构建了一个字符串 - 我不允许我的 web 服务的客户端构建一个 SQL 字符串并将其发送给执行;这是一场等待发生的大规模黑客攻击
  • @Fabio 我正在发送“(2(DB TYPE-Integer),字节数组(图像的BLOB VALUE,DB TYPE-LONGVARBINARY),测试(DB TYPE-VarChar))”作为ParamValues。由于这些是动态值,我很难获得每个参数的类型。你能建议我是否有办法做到这一点?我尝试将图像参数值作为 base64 编码发送并直接在查询字符串中发送,但抛出错误。您能否告诉我发送 LongVarBinary 类型的图像值的正确方法?提前致谢。
  • 感谢您的帮助。我搞定了

标签: c# vb.net postgresql varbinarymax


【解决方案1】:

The fine manual 说“在位置上使用? 作为参数占位符。添加值的顺序与 ? 出现在 SQL 中的顺序相同”(释义)

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2011-08-07
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多