Я пытаюсь прочитать файл DBF. Прежде чем читать данные в нем, я анализирую таблицу его схем, чтобы не прочитать неправильный файл. Когда я анализирую его, я проверяю имена его столбцов и их типы. Моя проблема заключается в том, что в некоторых системах определенное поле отображается на System.Double, а в других - на System.Int16. Фактически, фактический тип этого поля (как видно из DBFNavigator) является числовым (4,0). Я написал тестовое приложение для проверки этих dbf-файлов на стороне клиента. Это класс, который выводит схему dbf:
public class DBFAnalyzerCore:IDisposable
{
private OleDbConnection _connection;
private bool _keyInfo;
private string _fileName;
bool _bDisposed;
public DBFAnalyzerCore(string path, bool keyInfo)
{
_connection = new OleDbConnection(
String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV;User ID=Admin;Password=",
System.IO.Path.GetDirectoryName(path)));
_connection.Open();
_keyInfo = keyInfo;
_fileName = System.IO.Path.GetFileName(path);
}
public void Analyze(StringBuilder result)
{
OleDbCommand command = null;
IDataReader reader = null;
try
{
command = new OleDbCommand(String.Format("SELECT * FROM [{0}]", _fileName), _connection);
if (_keyInfo)
reader = command.ExecuteReader(CommandBehavior.KeyInfo);
else
reader = command.ExecuteReader();
DataTable schema = reader.GetSchemaTable();
OutputShema(schema, result);
}
finally
{
if (reader != null) reader.Close();
if (command != null) command.Dispose();
}
}
private void OutputShema(DataTable schema, StringBuilder sb)
{
foreach (DataRow row in schema.Rows)
{
sb.AppendLine(String.Format("{0} - {1}", row["ColumnName"], row["DataType"]));
}
}
protected virtual void Dispose(bool bDisposing)
{
if (bDisposing)
{
_connection.Dispose();
_bDisposed = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
В результате на клиентской системе показывался System.Int16. Система Win7 x64. HKEY_LOCAL_MACHINE \ Software \ Microsoft \ DataAccess \ Версия "6.1.7601.17514". То же самое мое, но я получаю System.Double!
В то же время на «новой» системе клиентов показывался System.Double. Какие настройки / настройки могли быть причиной этого?
Я понимаю, что теперь я должен удалить проверку типов столбцов, но из-за нашей политики управления версиями я не могу сделать это прямо сейчас.