2010-04-27 65 views
1

目前我正在編寫一個小型轉換程序,它會將主鍵策略轉換爲使用GUID而不是整數。這是一個簡單的客戶導致的要求,我不能改變這一點。Oracle guid到其他表格

我已經爲RAW(16)的替代pk候選添加到數據庫中的每個表中,並用SYS_GUID()填充每條記錄。 我爲FK做了同樣的工作,我爲每個FK添加了一個替代列。 現在我正在將FK連接到PK,通過查詢父表,我得到了特定行的GUID/NEW鍵,之後我想插入到子表中的替代候選FK中。

有點像這樣:

sqlString = "SELECT PK FROM " + t+ " WHERE " + fkcol+ " = " + childValue; 
OracleDataReader guidReader = GetDataReader(sqlString); 

while (guidReader.Read()) 
{ 
    sqlString = "UPDATE T SET FK = " + guidReader["PK"]; 
} 

調試此的SqlString讓我以下值:

UPDATE SIS_T_USER SET FK_C_EMPLOYEE_ID = System.Byte []

現在,如何我是否會將其保存爲oracle數據庫中的一個很好的指導?

編輯如何:

OracleCommand command = new OracleCommand(sqlString, this.oracleConnection); 
           command.CommandType = CommandType.Text; 
           OracleParameter op1 = new OracleParameter("guid", OracleDbType.Raw); 
           op1.Value = guidReader["PK"]; 
           command.Parameters.Add(op1); 
           try 
           { 
            command.ExecuteNonQuery(); 
           } 
           catch (OracleException oex) 
           { 
            Console.WriteLine("Unable to update: {0}", oex.Message); 
           } 

回答

2

爲什麼你不只是做這一切的Oracle的一面呢?

MERGE 
INTO sis_t_user s 
USING employee e 
ON  (s.integer_fk = e.integer_pk) 
WHEN MATCHED THEN 
UPDATE 
SET  s.guid_fk = e.guid_pk 
+0

我不想對此做太多的闡述,但最終無論如何我最終還是需要圍繞指導進行折騰,所以遲早會出現同樣的問題,並帶有不同的塗層。雖然你的解決方案很好,但它不足以滿足(我們特定的)未來的需求。否則我不會問這個問題。 – Oxymoron 2010-04-27 11:49:09

0

試試這個代碼:

sqlString = "UPDATE T SET FK = '" + (new Guid((byte[])guidReader["PK"])).ToString() + "'"; 

基本上,你只需要創建一個字節的GUID,然後將其轉換爲字符串。 有Guid構造函數允許它:http://msdn.microsoft.com/en-us/library/90ck37x3(v=VS.100).aspx

+0

爲什麼.ToString(),列是RAW(16)格式 – Oxymoron 2010-04-27 12:21:43

+0

您能否展示更新應該如何?我以爲你需要像更新SIS_T_USER設置FK_C_EMPLOYEE_ID ='33b386b2-bf1d-42be-9110-c688cb8c8afc' – empi 2010-04-27 12:28:02

+0

我做了一些改變,而不是這種天真的方法即時通訊使用參數化查詢。 的工作更容易 – Oxymoron 2010-04-27 12:55:26