Проверка, чтобы видеть, существует ли столбец в средстве чтения данных [дубликат]

Мы использовали aspectJ в одном из моих больших проектов в течение достаточно долгого времени. Проект был составлен из нескольких веб-сервисов, каждого с несколькими функциями, который был фронтэндом для сложной обработки документов / запросы системы. Где-нибудь вокруг 75k строк кода. Мы использовали аспекты для двух относительно незначительных частей функциональности.

Первый прослеживал поток приложения. Мы создали аспект, который работал прежде и за каждым вызовом функции распечатать "вводимую 'функциональную'" и "'функцию', из которой выходят". С функциональной селекторной вещью (pointcut, возможно? Я не помню правильное имя), мы смогли использовать, это как средство отладки, выбирая только функционирует, который мы хотели проследить в установленный срок. Это было действительно хорошим использованием для аспектов в нашем проекте.

второй вещью, которую мы сделали, были специализированные метрики. Мы помещаем аспекты вокруг наших методов веб-сервиса, чтобы получить синхронизацию, информацию об объекте, и т.д. и вывести результаты в базе данных. Это было хорошо, потому что мы могли получить эту информацию, но все еще разделить весь тот код получения от "реального" кода, который сделал работу.

я читал о некоторых хороших решениях, которые аспекты могут принести к таблице, но я все еще не убежден, что они могут действительно сделать что-либо, что Вы не могли сделать (возможно, лучше) с "нормальной" технологией. Например, я не мог думать ни о какой основной функции или функциональности, в которой любой из наших проектов был нужен, который не мог быть сделан столь же легко без аспектов - где я нашел, что полезными аспектами является вид незначительных вещей, которые я упомянул.

43
задан JamesEggers 30 July 2009 в 13:35
поделиться

4 ответа

В итоге я нашел решение с помощью метода reader.GetName (int) . Я создал метод ниже, чтобы охватить эту логику:

public bool ColumnExists(IDataReader reader, string columnName)
{
    for (int i = 0; i < reader.FieldCount; i++)
    {
         if (reader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
        {
            return true;
        }
    }

    return false;
}
60
ответ дан 26 November 2019 в 22:43
поделиться

Похоже, я исправился. Я знаю , что там указаны ваши настоящие имена столбцов, но я пошел по неправильному пути. Эта ссылка помогла немного прояснить ситуацию, но я все еще не уверен, есть ли элегантный способ сделать это. В соответствии с приведенной выше ссылкой вы можете получить список всех своих столбцов следующим образом:

List<string> myCols = new List<string>();
DataTable schema = reader.GetSchemaTable();
foreach (DataRow row in schema.Rows)
{
    myCols.Add(row[schema.Columns["ColumnName"]]);
}

К сожалению, похоже, что вы можете получить доступ только к schema.Rows по индексу, поэтому я не уверен, что вы можете обойтись без цикла по строкам сначала перед проверкой по имени. В этом случае ваше исходное решение кажется гораздо более элегантным!

Примечание: в моем исходном ответе предлагалось проверить наличие столбца просто с помощью: reader.GetSchemaTable (). Columns ["optionalfield"].

6
ответ дан 26 November 2019 в 22:43
поделиться

Загрузите его в DataTable и затем вы можете проверить столбец:

DataTable dataTable = new DataTable();
dataTable.Load(reader);
foreach (var item in dataTable.Rows) 
{
    bool columnExists = item.Table.Columns.Contains("ColumnName");
}
3
ответ дан 26 November 2019 в 22:43
поделиться

Не нужно столько усложнений, просто это:

bool bFieldExists = datareader.GetSchemaTable().Columns.Contains(strFieldName);
1
ответ дан 26 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: