Как определить размер поля MS Access через OleDb

Существующее приложение написано на C#. Во время запуска приложение вызывает виртуальный метод для внесения изменений в базу данных (например, для новой версии может потребоваться вычисление нового поля или что-то в этом роде). В метод передается открытое соединение OleDb.

Мне нужно изменить ширину поля. Оператор ALTER TABLE работает нормально. Но я хотел бы избежать выполнения оператора ALTER TABLE, если поле уже имеет подходящий размер. Есть ли способ определить размер поля MS Access, используя то же соединение OleDb?


person Andy    schedule 11.10.2008    source источник
comment
Вы имеете в виду JET, а не ACCESS, поскольку вы используете только механизм базы данных, а не инструменты программирования приложений базы данных.   -  person David-W-Fenton    schedule 14.10.2008


Ответы (2)


Не уверен, что полностью понял ваш вопрос.
Но вы можете запросить в таблице 0 строк (SELECT 1 FROM myTable WHERE 1= 0)

И вы можете использовать коллекцию полей записи, обращаться к этому полю по имени или индексу и использовать свойство поля, такое как размер, тип и т. д.

Это помогает?

person shahkalpeshp    schedule 11.10.2008
comment
Вот что у меня получилось: var command = new OleDbCommand(SELECT FIELD FROM TABLE, connection); var reader = command.ExecuteReader(CommandBehavior.SchemaOnly); схема var = reader.GetSchemaTable(); var size = Convert.ToInt32(table.Rows[0][ColumnSize]); - person Andy; 12.10.2008
comment
Но как узнать, является ли это NCHAR фиксированной ширины, NVARCHAR переменной ширины или MEMO большого двоичного объекта? Есть ли опция WITH COMPRESSION? Лучше использовать метод OpenSchema (+ ADOX, если необходимо) IMO: вы получаете больше/детализированную информацию. - person onedaywhen; 13.10.2008
comment
В таблице схемы был dbtype, но он мне не понадобился. В этом случае я знаю тип поля... Мне просто нужен текущий размер поля, и я предпочитаю использовать существующее соединение OleDb. OpenSchema может быть лучшим решением для другой проблемы. - person Andy; 14.10.2008

Вот что я придумал, основываясь на ответе Шахкалпеша:

var command = new OleDbCommand("SELECT FIELD FROM TABLE", connection); 
var reader = command.ExecuteReader(CommandBehavior.SchemaOnly); 
var schema = reader.GetSchemaTable(); 
var size = Convert.ToInt32(table.Rows[0]["ColumnSize"]);
person Andy    schedule 12.10.2008
comment
Ответ Рему на самом деле лучше, поскольку он не требует открытия набора записей, и вы используете инструменты, предоставленные в ADO, для запроса словаря данных. - person David-W-Fenton; 14.10.2008
comment
Уверены ли вы? Рему отвечает на набор записей (While Not rs.EOF... rs.MoveNext). Обратите внимание, что мне нужен был только размер, и я предпочел использовать существующее соединение. Ответ Рему может быть лучшим ответом на другую проблему. - person Andy; 14.10.2008