Non farlo
In realtà non dovresti modificare lo schema della tabella in fase di runtime. Ogni genere di cose può andare storto. Potresti avere qualcuno che tenta di creare una colonna che si rivela essere una parola riservata. L'accesso che stai dando all'utente per essere in grado di fare questi cambiamenti permette cose come dropping tables anche.
davvero non dovrebbe modificare lo schema della tabella in fase di runtime. Significa che non stai utilizzando gran parte di ciò che un database è buono a
Prova invece una struttura di tabella EAV
Se stai scrivendo dati dinamici in cui le colonne cambiano e vengono create arbitrariamente, considera l'utilizzo di un EAV struttura della tabella. È noto e comprende come funziona.
Sì, vari DBA e puristi ci daranno da fare, ma suggerirai la soluzione proposta di aggiungere colonne in fase di runtime, probabilmente si arrenderanno. Puoi anche trovare le librerie che ti permetteranno di scrivere un modello per tale come EAV @ CodePlex ).
Forse prova qualcosa su NoSQL
Forse non vuoi affatto un database relazionale. Forse vuoi qualcosa che ha un modello di documento e stai solo attaccando Json lì. Allora mongo o divano funzionerebbero in modo accettabile. O forse vuoi un database orientato alle colonne come Cassandra. Non ne sono sicuro, ma è qualcosa da esplorare se lo sei davvero dopo aver pensato "creando colonne in runtime".
Ok, lo stai davvero facendo
Puoi recuperare i metadati da un tavolo. Nel mondo Java, questo sarebbe qualcosa come ResultSetMetaData che ti consente scopri le specifiche di tutte le colonne, i tipi di dati che memorizzano e altri bit a riguardo.
In C #, apparentemente questo è memorizzato nella classe DataColumn . Da Recupero di metadati (nome tabella) da un'istruzione SQL su Stack Overflow:
SqlConnection con = new SqlConnection(connString);
String queryString = "Select CUSTOMER_NAME from CUSTOMER_DETAIL";
SqlCommand cmd = new SqlCommand(queryString, con);
DataTable myTable = new DataTable();
myTable.Load(cmd.ExecuteReader());
DataColumn column = myTable.Columns[0];
// zero based index of column, alternatively use column name
string typeOfColumn = column.DataType.Name;
// or column.DataType.FullName to get the fully qualified name of the System.Type