Как я могу определить в C #, является ли столбец базы данных SQL Server автоинкрементом?

Мне нужно иметь возможность определить из DataTable, возвращаемого DbConnection.GetSchema (), является ли конкретный столбец в таблице SQL Server идентификатором / автоинкрементом или нет. Я не могу напрямую обращаться к системным таблицам.

Как ни странно, если я подключаюсь к SQL Server через ODBC, возвращаемый тип данных для такого столбца возвращается как «int identity» (или «bigint identity» и т. Д.), Но если я использую собственный драйвер SQL Server, похоже, что нет различие между столбцом «int» и столбцом «int identity». Есть ли другой способ вывести эту информацию?


person Dan Hermann    schedule 29.01.2011    source источник
comment
Не похоже, что эта информация доступна в коллекциях GetSchema (). Почему вы не можете запросить представления системного каталога ?? Те определенно владеют этой информацией!   -  person marc_s    schedule 29.01.2011
comment
Мне нужен независимый от базы данных способ сделать это. Похоже, что запрос каждой отдельной таблицы и изучение вывода DatabaseReader.GetSchemaTable () - единственный надежный способ сделать это.   -  person Dan Hermann    schedule 31.01.2011


Ответы (3)


DataTable имеет Columns свойство, а DataColumn имеет свойство с указанием автоинкремента:

bool isAutoIncrement = dataTable.Columns[iCol].AutoIncrement
person kelloti    schedule 29.01.2011
comment
Ему нужно получить его от GetSchema(), который возвращает DataTable с информацией о схеме, а не о самой схеме. - person Adam Robinson; 29.01.2011
comment
Правильно, я предполагаю, что предполагается, что делать небольшой запрос к таблице, чтобы получить DataTable с этой информацией, - плохая идея. Но если уж на то пошло, может, это неплохая идея? - person kelloti; 29.01.2011

См. Этот поток StackOverflow

Функция GetSchema() не вернет нужную информацию. Также не будем изучать свойства схемы DataTable. Вам придется перейти на более низкий уровень, и это будет зависеть от СУБД и, вероятно, ее версии.

Приведенный ниже член извлекает все таблицы со столбцами идентификаторов, а затем ищет соответствие определенной таблице, переданной в качестве аргумента. Код можно изменить так, чтобы он либо возвращал все таблицы, либо запрос, оптимизированный для поиска только интересующей таблицы.

// see: https://stackoverflow.com/questions/87747/how-do-you-determine-what-sql-tables-have-an-identity-column-programatically
private static string GetIdentityColumnName(SqlConnection sqlConnection, Tuple<string, string> table)
{
    string columnName = string.Empty;

    const string commandString =
         "select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS "
       + "where TABLE_SCHEMA = 'dbo' and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 "
       + "order by TABLE_NAME";

    DataSet dataSet = new DataSet();
    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
    sqlDataAdapter.SelectCommand = new SqlCommand(commandString, sqlConnection);
    sqlDataAdapter.Fill(dataSet);

    if (dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0)
    {
        foreach (DataRow row in dataSet.Tables[0].Rows)
        {
            // compare name first
            if (string.Compare(table.Item2, row[1] as string, true) == 0)
            {
                // if the schema as specified, we need to match it, too
                if (string.IsNullOrWhiteSpace(table.Item1) || string.Compare(table.Item1, row[0] as string) == 0)
                {
                    columnName = row[2] as string;
                    break;
                }
            }
        }
    }
    return columnName;
}
person Scott Howard    schedule 30.12.2011

Я столкнулся с тем же. Насколько я обнаружил, здесь «Столбец с автоматическим приращением реализуется по-разному в зависимости от типа базы данных, с которой вы работаете. Он не отображается через GetOleDbSchema.».

Я не нашел другого способа, кроме упомянутого @kelloti. Итак, на данный момент меня устраивает это решение, потому что на данный момент мне нужно знать, является ли столбец .AutoIncrement. У меня уже есть таблица в памяти, поэтому мне не нужно снова запрашивать базу данных.

@pesaak Пожалуйста, превратите этот ответ в комментарий сейчас, когда у вас должно быть достаточно репутации.

person pesaak    schedule 24.06.2011
comment
Пожалуйста, переместите это в комментарий. - person Nisarg; 04.08.2017