2010-04-27 2 views
1

На данный момент я пишу небольшую программу конверсии, она преобразует стратегию первичного ключа в использование GUID вместо целых чисел. Это простое требование, вызванное клиентом, и я не могу его изменить.Oracle guid для другой таблицы

Я добавил заменяющего pk-кандидата RAW (16) к каждой таблице в базе данных и заполнил каждую запись с помощью 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 []

Теперь, как я иду дальше и сохраняю это как хороший guid в моей базе данных оракула?

РЕДАКТИРОВАТЬ как:

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

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

+0

Не могли бы вы показать, как должно выглядеть обновление? Я думал, вам нужно что-то вроде UPDATE SIS_T_USER SET FK_C_EMPLOYEE_ID = '33b386b2-bf1d-42be-9110-c688cb8c8afc' – empi

+0

Я внесла некоторые изменения вместо этого наивного подхода im с использованием параметризованного запроса. работает намного проще – Oxymoron

Смежные вопросы