Oracle - 基于原始列值的DELETE行

时间:2015-08-25 12:10:35

标签: sql vb.net oracle sql-delete

我想用我的代码执行以下操作,而且我不知道从哪里开始:

说我有一个包含Byte() ID字段的类:

Public Class Message
    Public Property ID as Byte()
    '...
End Class

并且那些Message存储在数据库中,ID存储为RAW列。

鉴于Messages = List(Of Message),我将如何删除列表中的所有邮件?

我已经达到了:

Dim sql as String = "DELETE FROM TableName WHERE IDColumn IN ("
For Each msg in Messages
    sql = sql + msg.ID ' I don't think this will work
Next
sql = sql + ")"

Using oCommand As New OracleCommand(sql)
' ...
  

注意:IDColumn实际上不是主键列或其他任何内容 -   它只是另一栏(不幸的是,根据规范)。

2 个答案:

答案 0 :(得分:1)

您缺少列表中的逗号,因此ID 1,2和3会生成IN (123)。你可以改用这个循环:

For Each msg in Messages
    sql = sql + msg.ID + ","
Next

sql= sql.Substring(0, sql.Length - 1) + ")";

或者即使如此,只要IDColumn不能为null:

Dim sql as String = "DELETE FROM TableName WHERE IDColumn IN (null"
For Each msg in Messages
    sql = sql + ", " + msg.ID
Next
sql = sql + ")"

这也将处理消息为空的情况,而在第一个示例中,您应该检查这一点,以免最终导致IN (),这将导致语法错误。

答案 1 :(得分:0)

我的代码有两个问题:

  1. 我需要在项目之间加入逗号(请参阅This answer
  2. 我忘记了ID值
  3. 周围的单引号
  4. 我需要将Byte()转换为十六进制值字符串:
  5. String.Join(String.Empty, msg.ID.Select(Function(id) id.ToString("X2")))

    所以我的循环看起来像:

    For Each msg in Messages
        sql = sql + "'" + String.Join(String.Empty, msg.ID.Select(Function(id) id.ToString("X2"))) + "'"
    Next