Sql SMO: Как получить путь базы данных физическое имя файла?

Причина, по которой я использую спецификатор функции inline (в частности, static inline), заключается не в «скорости», а в том, что часть

  1. static сообщает компилятору функция видна только в текущем блоке перевода (текущий файл компилируется и включает заголовочные файлы). Часть

  2. inline сообщает компилятору, что она может включать реализацию функции при вызове. site, если он хочет, чтобы

  3. static inline сообщали компилятору, что он может полностью пропустить функцию, если она вообще не используется в текущем модуле перевода

    ( В частности, компилятор, который я использую чаще всего с опциями, которые я использую чаще всего, gcc -Wall, выдает предупреждение, если функция, помеченная static, не используется, но не выдает предупреждение, если функция, помеченная static inline, не используется.)

  4. static inline говорит нам, что эта функция является вспомогательной функцией, подобной макросу, и, кроме того, добавляет проверку типа в то же поведение, что и макрос.

Таким образом, на мой взгляд, предположение, что inline имеет какое-либо отношение к скорости как таковое, неверно. Ответ на поставленный вопрос прямым ответом будет вводить в заблуждение.


В моем коде вы видите их связанные с некоторыми структурами данных или иногда с глобальными переменными.

Типичным примером является случай, когда я хочу реализовать генератор псевдослучайных чисел Xorshift в своем собственном коде C:

#include 

static uint64_t  prng_state = 1; /* Any nonzero uint64_t seed is okay */

static inline uint64_t  prng_u64(void)
{
    uint64_t  state;

    state = prng_state;
    state ^= state >> 12;
    state ^= state << 25;
    state ^= state >> 27;
    prng_state = state;

    return state * UINT64_C(2685821657736338717);
}

static uint64_t prng_state = 1; означает, что prng_state является переменной типа uint64_t, видимый только в текущем модуле компиляции и инициализированный значением 1. Функция prng_u64() возвращает беззнаковое 64-битное псевдослучайное целое число. Однако, если вы не используете prng_u64(), компилятор также не будет генерировать для него код.

Другой типичный случай использования - когда у меня есть структуры данных, и им нужны функции доступа. Например,

#ifndef   GRID_H
#define   GRID_H
#include 

typedef struct {
    int            rows;
    int            cols;
    unsigned char *cell;
} grid;
#define  GRID_INIT { 0, 0, NULL }

#define  GRID_OUTSIDE -1

static inline int grid_get(grid *const g, const int row, const int col)
{
    if (!g || row < 0 || col < 0 || row >= g->rows || col >= g->cols)
        return GRID_OUTSIDE;
    return g->cell[row * (size_t)(g->cols) + col];
}

static inline int grid_set(grid *const g, const int row, const int col,
                           const unsigned char value)
{
    if (!g || row < 0 || col < 0 || row >= g->rows || col >= g->cols)
        return GRID_OUTSIDE;
    return g->cell[row * (size_t)(g->cols) + col] = value;
}

static inline void grid_init(grid *g)
{
    g->rows = 0;
    g->cols = 0;
    g->cell = NULL;
}

static inline void grid_free(grid *g)
{
    free(g->cell);
    g->rows = 0;
    g->cols = 0;
    g->cell = NULL;
}

int grid_create(grid *g, const int rows, const int cols,
                const unsigned char initial_value);

int grid_load(grid *g, FILE *handle);

int grid_save(grid *g, FILE *handle);

#endif /* GRID_H */

Этот заголовочный файл определяет некоторые полезные вспомогательные функции и объявляет функции grid_create(), grid_load() и grid_save(), которые будут реализованы в отдельном файле .c. [ 1140]

(Да, эти три функции можно было бы также реализовать в заголовочном файле, но это сделало бы заголовочный файл довольно большим. Если у вас был большой проект, распределите его по множеству единиц перевода (. c исходные файлы), каждый из которых включает в себя файл заголовка, получит свои собственные локальные копии функций. Функции доступа, определенные как static inline выше, являются короткими и тривиальными, поэтому вполне нормально, что они будут скопированы здесь и там. три функции, которые я пропустил, намного больше.)

5
задан Osama Al-Maadeed 23 January 2009 в 21:56
поделиться

3 ответа

Обычно проблема со свойством DefaultFile, являющимся пустым. Файл данных по умолчанию - то, где файлы данных хранятся на экземпляре SQL Server, если иначе не указано в свойстве FileName. Если никакое другое местоположение по умолчанию не было указано, свойство возвратит пустую строку.

Так, это свойство ничего не возвращает (пустая строка), если Вы не установили местоположение по умолчанию.

Обходное решение должно проверить свойство DefaultFile, если оно возвращает использование пустой строки, SMO для получения основной базы данных затем используют Базу данных. Свойство PrimaryFilePath для получения Местоположения Файла данных По умолчанию (так как это не изменилось),

Так как Вы говорите, что проблема с Вашим PrimaryFilePath:

  • Подтвердите, что Ваше соединение открыто
  • Подтвердите, что другие свойства доступны
5
ответ дан 14 December 2019 в 09:02
поделиться

Server srv = new Server(connection); DatabaseCollection dbc = svr.Databases; Database database = dbc["dbName"]; string filePath = database.PrimaryFilePath;

0
ответ дан 14 December 2019 в 09:02
поделиться

Вот как я это делаю, подготовленный для нескольких имен файлов. Обратитесь к database.LogFiles, чтобы получить тот же список имен файлов журнала:

private static IList<string> _GetAttachedFileNames(Database database)
{
    var fileNames = new List<string>();

    foreach (FileGroup group in database.FileGroups)
        foreach (DataFile file in group.Files)
            fileNames.Add(file.FileName);

    return fileNames;
}
2
ответ дан 14 December 2019 в 09:02
поделиться
Другие вопросы по тегам:

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