Если вы прочитаете вопрос, Майкл спросил о DataReader, а не о DataRecord.
Использование r.GetSchemaTable().Columns.Contains(field)
в DataRecord действительно работает, но оно возвращает столбцы BS (см. Снимок экрана ниже).
Чтобы узнать, существует ли столбец данных и содержит данных в DataReader, используйте следующие расширения:
public static class DataReaderExtensions
{
/// <summary>
/// Checks if a column's value is DBNull
/// </summary>
/// <param name="dataReader">The data reader</param>
/// <param name="columnName">The column name</param>
/// <returns>A bool indicating if the column's value is DBNull</returns>
public static bool IsDBNull(this IDataReader dataReader, string columnName)
{
return dataReader[columnName] == DBNull.Value;
}
/// <summary>
/// Checks if a column exists in a data reader
/// </summary>
/// <param name="dataReader">The data reader</param>
/// <param name="columnName">The column name</param>
/// <returns>A bool indicating the column exists</returns>
public static bool ContainsColumn(this IDataReader dataReader, string columnName)
{
/// See: http://stackoverflow.com/questions/373230/check-for-column-name-in-a-sqldatareader-object/7248381#7248381
try
{
return dataReader.GetOrdinal(columnName) >= 0;
}
catch (IndexOutOfRangeException)
{
return false;
}
}
}
Использование:
public static bool CanCreate(SqlDataReader dataReader)
{
return dataReader.ContainsColumn("RoleTemplateId")
&& !dataReader.IsDBNull("RoleTemplateId");
}
Вызов r.GetSchemaTable().Columns
в DataReader возвращает столбцы BS:
[/g0]
Попробуй это. Нет необходимости использовать подзапрос для одинаковых столбцов таблицы и псевдонима.
UPDATE Customers
SET FirstName =Mid(FullName, 1, InStr(FullName, ' ') - 1)
Нет необходимости в подзапросе:
UPDATE
Customers
SET
FirstName = Mid(FullName, 1, InStr(FullName, " ") - 1),
LastName = Mid(FullName, InStr(FullName, " ") + 1),
FullName = Null
Вы можете попробовать ниже -
UPDATE Customers
SET Customers.FirstName =Mid(FullName, 1, InStr(FullName, ' ') - 1)