因此,我使用IDataReader來保存一些業務對象,但我不知道在運行時確切地說明了讀取器中的字段。任何不在閱讀器中的字段將在結果對象上留空。你如何測試一個閱讀器是否包含一個特定的字段,而不僅僅是將其封裝在try/catch中?在迭代之前檢測IDataReader是否包含某個字段
8
A
回答
-4
您不能僅僅測試reader [「field」]爲null或DBNull,因爲如果該列不在讀取器中,則拋出IndexOutOfRangeException。
我在映射圖層中用於創建域對象的代碼和使用映射圖層的存儲過程在下面可能有不同的列名;如果未找到該列並且返回缺省值(t)或null,則可以將其修改爲不引發異常。
我知道這不是最優雅的或最佳的解決方案(如果你能避免它,那麼你應該),但是,遺留存儲過程或Sql查詢可能需要解決。
/// <summary>
/// Grabs the value from a specific datareader for a list of column names.
/// </summary>
/// <typeparam name="T">Type of the value.</typeparam>
/// <param name="reader">Reader to grab data off of.</param>
/// <param name="columnNames">Column names that should be interrogated.</param>
/// <returns>Value from the first correct column name or an exception if none of the columns exist.</returns>
public static T GetColumnValue<T>(IDataReader reader, params string[] columnNames)
{
bool foundValue = false;
T value = default(T);
IndexOutOfRangeException lastException = null;
foreach (string columnName in columnNames)
{
try
{
int ordinal = reader.GetOrdinal(columnName);
value = (T)reader.GetValue(ordinal);
foundValue = true;
}
catch (IndexOutOfRangeException ex)
{
lastException = ex;
}
}
if (!foundValue)
{
string message = string.Format("Column(s) {0} could not be not found.",
string.Join(", ", columnNames));
throw new IndexOutOfRangeException(message, lastException);
}
return value;
}
-3
雖然我不同意這種方法(我認爲在訪問數據時,應該事先知道形狀),但我知道有例外。
您可以隨時在閱讀器中加載數據表,然後遍歷它。然後您可以檢查該列是否存在。這個性能會更差,但是你不需要try/catch塊(所以也許它會更好地滿足你的需求)。
9
這應該做的伎倆:
Public Shared Function ReaderContainsColumn(ByVal reader As IDataReader, ByVal name As String) As Boolean
For i As Integer = 0 To reader.FieldCount - 1
If reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase) Then Return True
Next
Return False
End Function
或(在C#)
public static bool ReaderContainsColumn(IDataReader reader, string name)
{
for (int i = 0; i < reader.FieldCount; i++) {
if (reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase)) return true;
}
return false;
}
:O)
7
您還可以使用IDataReader.GetSchemaTable
讓所有列在列表讀者。
+0
GetSchemaTable不會列出返回的數據結構的列。 – JamesEggers 2009-08-13 13:30:29
0
我用過的最好的解決辦法是做這樣的:
DataTable dataTable = new DataTable();
dataTable.Load(reader);
foreach (var item in dataTable.Rows)
{
bool columnExists = item.Table.Columns.Contains("ColumnName");
}
試圖通過讀者[「的ColumnName」]訪問它,並檢查空或爲DBNull將拋出一個例外。
4
Enumerable.Range(0, reader.FieldCount).Any(i => reader.GetName(i) == "ColumnName")
相關問題
- 1. 檢查ruby hash是否包含填充的某些字段
- 2. 檢查輸入字段是否包含@
- 3. 檢測NSString是否包含...?
- 4. 如何檢查字符串是否包含某個字符?
- 5. Javascript檢查字符串是否只包含某個字符
- 6. 檢查一個字符串是否只包含某些字母
- 7. 檢查一個字符串是否只包含某些字符
- 8. 檢查mysql字段是否包含mysql查詢中的某個數字
- 9. 檢查一個字是否存在於某個詞的某個詞之前
- 10. 如何檢查一個TextView是否包含某個字符串
- 11. javascript檢查一個元素是否包含某個字符串
- 12. 如何檢測jQuery中某個屬性是否包含某個值?
- 13. 檢查url是否包含某個字,然後顯示
- 14. 檢查子字符串是否包含某個值
- 15. 檢查值是否包含某個字符串
- 16. 如何檢查html是否包含與iMacros的某個數字
- 17. 檢查當前頁面網址是否包含某些詞
- 18. 檢查前一個(-1&-2)url是否包含字符串
- 19. 檢查字符串是否包含某些字符
- 20. Php:檢測用戶是否在其網站上包含javascript代碼段
- 21. Recusively測試是否包含在字典
- 22. 如何檢查一個字段是否包含圓括號?
- 23. jQuery - 檢查輸入字段是否包含其中一個詞
- 24. 檢查多個ORM關係的字段是否包含值
- 25. 檢測一個字文件是否包含重複
- 26. 檢測一個字符串是否包含「真正的句子」?
- 27. VBA - 檢查一些時間段是否完全包含在某個月
- 28. 如何檢測表是否包含表?
- 29. 檢測收集是否包含數據
- 30. 檢查日期是否在某個日期之前PHP laravel
這將表現不佳 – DalSoft 2012-07-24 18:25:53