【发布时间】: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