2015-05-19 43 views
0
 var sdr = db.ExecuteReader("SELECT [key],translation FROM language WHERE [email protected]"); 
     DataTable someTable = new DataTable(); 
     someTable.Load(sdr); 
     return ((string)(someTable.Rows.Find("[key] = CUSTOMDATEFORMAT").ItemArray[1])); 

最後一行現在引發錯誤System.Data.MissingPrimaryKeyException道:「表沒有主密鑰」。柱[鍵]拋出MissingPrimaryKeyException DataTable中

所以我猜它找到關鍵字「鍵」,現在期望我在主鍵列上查詢,而不是名爲「鍵」的列。我該如何逃避列名?

+1

如果使用Find,則必須指定[主鍵](https://msdn.microsoft.com/en-us/library/system.data.datatable.primarykey%28v=vs。 110%29.aspx)。 –

回答

1

如果你想使用DataRowCollection.Find你必須指定DataTablePrimaryKey(s)

我會用Linq-To-DataTable

DataRow row = someTable.AsEnumerable() 
    .FirstOrDefault(row => row.Field<string>("key") == "CUSTOMDATEFORMAT"); 
if(row != null) 
    return row.Field<string>(1); // or by name but with correct type 
else 
    return "something else"; 

然後你可以使用你在查詢想要的所有方法。

1

Find方法用於通過主鍵值查找單個行。使用Select通過任意列值找到行:

DataRow[] foundRows; 
foundRows = someTable.Select("[key] = CUSTOMDATEFORMAT"); 
return foundRows[0].ItemArray[1]; // adding proper bounds checking, of course. 
1

Find方法是使用在DataTable對象指定爲primary key列,並返回一個包含它得到primary key細胞內的值的行。
從MSDN:

獲取由主鍵值指定的行。

由於您的表沒有指定爲primary key的列,因此會出現此錯誤。

如果您key列保證不包含重複,您可以使用DataTable's PrimaryKey property.

如果沒有,則使用的,而不是發現的LINQ的Select方法指定它作爲主鍵:

return ((string)(someTable.Rows.Select("[key] = CUSTOMDATEFORMAT").ItemArray[1])); 
相關問題