所以我在Oracle数据库中有一个表,我基本上试图在C#中复制它的主键。我可以很好地加载表,但是当我尝试添加与oracle表相同的主键约束时,我收到此错误:
"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语句..如果我在填充之前将主键添加到数据表,它可以正常工作。我很难过。
编辑:我忘了添加它在另一个数据库上使用相同的表(当然是不同的数据)。我确认非工作数据库中的数据是唯一的。答案 0 :(得分: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"
}
答案 1 :(得分:0)
当你没有在数据库中添加PK时,getKeys(owner, name)
会返回什么?
我猜 - 没什么......。