Czy kolumna posiada auto inkrementację? [Ole Db C#]

0

Witam,

jak sprawdzić czy dana kolumna jest przyrostowa? Wyciągnąłem już wszystkie dane po przez OleDbSchemaGuid tj. nazwy kolumn, klucze, indeksy, typy danych, unikalność itp ale nie mogę doszukać się autoinkrementacji. Źródłowa baza to Accessowe accdb, a docelowa będzie SQLite. Tworzę prosty konwerter, bo żaden z sieci nie działa dobrze albo są płatne. Może jakieś zapytanie bezpośrednio do bazy istnieje? Information_Schema oczywiście nie działa. Nie sprawdzi się też np. porównanie ze sobą wartości ID jakiejś grupy rekordów, bo są tabele gdzie wartość rośnie stale o 1 z każdym nowym rekordem a nie ma włączonej autoinkrementacji. Baza Access to kilkaset tabel i milony rekordów. Ręcznie nie chce mi się wprowadzać wszystkiego. Klucze Podstawowe nie zawsze są autiinkrementowane więc takie kombinowanie z góry odpada.

Tak wyciągam np klucz podstawowy. Sprawdzam każdą kolumnę czy jest kluczem podstawowym. Podobnie bym chciał się dowiedzieć czy jest autoincrementowany

private bool IsPrimaryKey(string nazwaTabeli, string nazwaKolumny)
{
    try
    {
        connection.Open();
        List<string> listOfPrimaryKeys = new List<string>();
        DataTable schema = (connection as OleDbConnection).GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, new Object[] { null, null, nazwaTabeli });
        connection.Close();

        int columnOrdinalForName = schema.Columns["COLUMN_NAME"].Ordinal;

        foreach (DataRow row in schema.Rows)
        {
            listOfPrimaryKeys.Add(row.ItemArray[columnOrdinalForName].ToString());
        }

        for (int i = 0; i < listOfPrimaryKeys.Count; i++)
        {
            if (listOfPrimaryKeys[i] == nazwaKolumny)
                return true;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("*******Error******* Komunikat z funkcji IsPrimaryKey - > " + ex.Message + " w: " + nazwaTabeli + "[" + nazwaKolumny + "]");
    }

    return false;
} 

Pozdrawiam
Przemysław Mazurek

0

nom przecież pola autoinkrementowane mają typ AutoNumber więc jak masz typ to sobie porównaj czy jest AutoNumber i tyle

0

No niestety tam gdzie tabela jest autonamber to mi pobiera typ Integer:\

a typ pobieram tak

 private string GetColumnDataType(string nazwaTabeli, string nazwaKolumny)
        {

            try
            {
                connection.Open();
                DataTable schema = (connection as OleDbConnection).GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new Object[] { null, null, nazwaTabeli, nazwaKolumny });
                connection.Close();

                DataRow row = schema.Rows[0];

                string columnDataType = ((OleDbType)(int.Parse(row["DATA_TYPE"].ToString()))).ToString();

                return columnDataType; //add: ConvertOleDbToSqlLiteDataType(columnDataType)???
            }
            catch(Exception ex)
            {
                Console.WriteLine("*******Error******* Komunikat z funkcji getColumnDataType - > " + ex.Message + " w: " + nazwaTabeli + "[" + nazwaKolumny + "]");
            }

            return null;
        } 
1

Bo Identity/autonumer to atrybut a nie typ pola...

0

Ok, dziękuję. Działa przykład z linka od Panczo. Łapka w górę

1 użytkowników online, w tym zalogowanych: 0, gości: 1