2010-05-20 3 views
2

Итак, у меня есть таблица в базе данных Oracle, которую я в основном пытаюсь реплицировать на C# вместе с ее основным ключом. Я могу загрузить таблицу просто отлично, но потом, когда я пытаюсь добавить такое же ограничение первичного ключа в таблице оракула, я получаю эту ошибку:C# datatable primary key issue

"These columns don't currently have unique values". 

Вот код

DataTable dt = new DataTable(combine(owner, name)); 
string q = "select " + getColumnSelect(owner, name) + 
      " from " + combine(owner, name) + " " + 
      (where_clause ?? "") + " order by " + getOrderByKeys(owner, name); 

// load the data table 
OracleDataAdapter oda = new OracleDataAdapter(q, conn); 
oda.FillLoadOption = LoadOption.PreserveChanges; 
dt.BeginLoadData(); 
oda.Fill(dt); 
dt.EndLoadData(); 

// now set primary keys 
List<DataColumn> cols = new List<DataColumn>(); 
foreach (string key in getKeys(owner, name)) 
{ 
    cols.Add(dt.Columns[key]); 
} 


// This is where it fails 
dt.PrimaryKey = cols.ToArray(); 

return dt; 

Теперь, используя точно такой же оператор select. Если я добавлю первичный ключ в datatable, прежде чем заполнить его, он будет работать нормально. Я в тупике.

EDIT: Я забыл добавить, что это работает с одной и той же таблицей (разные данные, конечно) в другой базе данных. И я подтвердил, что данные в нерабочей базе данных уникальны.

ответ

5

Проверить наличие пробелов, вот пример, который имеет уникальные значения (но имеет место), который воссоздаст вопрос:

DataTable dt = new DataTable("Hello world"); 
dt.Columns.Add("Col1"); 
dt.Rows.Add("Val1"); 
dt.Rows.Add("Val1 "); 
dt.Rows.Add("Val3"); 
List<DataColumn> cols = new List<DataColumn>(); 

cols.Add(dt.Columns["Col1"]); 

try 
{ 
    dt.PrimaryKey = cols.ToArray(); 
} 
catch (Exception e) 
{ 
    // Throws "These columns don't currently have unique values"  
} 
+0

Хороший улов. Это действительно проблема. Похоже, я вместо этого буду заполнять данные. – climbage

0

Что возвращает getKeys(owner, name), если вы еще не добавили PK в базу данных?

Я собираюсь угадать --- ничего ....

+0

возвращает первичный ключ правильно. Я установил точку останова там, потому что я думал, что это может быть проблемой. – climbage