2015-08-25 55 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