2015-08-25 56 views
0

我想要做我的代码如下,我不知道从哪里开始:甲骨文 - 基于RAW列删除行值

说我有一个包含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实际上不是一个主键列或任何东西 - 它只是另一列(按规格,可惜)。

+0

您的方法很好--id不需要是主键。但是,如果它们是字符串或日期,它们确实需要逗号和引号之间的逗号。 –

+0

IDColumn不是主键并不重要,因为任何列都可以用来限制WHERE子句中的记录。只是,对于不是表的主键的列而言,这是一个奇怪的名称。 –

+0

但我不能在Byte()和String中使用+操作符 - 所以必须有另一种方法将id放入SQL字符串中? – simonalexander2005

回答

0

有错我的代码两件事情:

  1. 我需要包括项目之间的逗号(见This answer
  2. 我忘了单引号括起来的ID值
  3. 我需要的字节()转换为十六进制值的字符串:

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 
+0

要十六进制?所以你得到'IN(01,0F,1A)'而不是'IN(1,15,26)'?这应该会导致SQL中出现语法错误。使用Join和Select是一个好主意,但使用'id.ToString()'而不是'id.ToString(“X2”)'。 –

+0

每个messageID是一个字节数组,因此它是'IN('010F','4D32')'。也许它会使用直接的'ToString()',我没有尝试它 - 但十六进制似乎工作正常。当我打开Oracle SQL Developer时,我看到显示的是十六进制字符串 - 所以它与其相比是有道理的。 – simonalexander2005

+0

好吧,我误读并认为每个ID都是一个ID而不是一个ID数组。所以列IDColumn显然是一个字符串,其中包含以十六进制格式粘在一起的ID列表。奇怪的存储数据的方式。特别是尽管持有相同的ID,'0A1F'仍不符合'1F0A'。但是,很高兴你找到了解决方案。 –

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不能为空:

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

这也将处理此案的消息是空的,而在第一个例子中,你应该检查这是为了不会因IN()而导致语法错误。

+0

如果我使用'sql = sql + msg.ID +','',我得到错误''操作符+没有为字节和字符串的1维数组定义' - 所以我不能使用它。 .. – simonalexander2005

+0

好吧,我不太了解vb.net。如果字节不能自动转换,则手动执行:'String.ToString(msg.ID)'。 –

+0

'ToString'不起作用 - 请参阅我的答案。感谢您的帮助,并指出逗号的事情:) – simonalexander2005