Нужны ли именам CSV-файлов определенный шаблон при чтении с помощью поставщика Microsoft.Jet.OLEDB.4.0?

Я пытался использовать интерфейсы OleDb для чтения CSV-файла, но заметил кое-что странное.

var filePath = @"C:\set2\orders3_1.csv";
var fileDirPath = Path.GetDirectoryName(filePath);
SqlBulkCopy bcp = new SqlBulkCopy("Data Source=.; Initial Catalog=indexer; Integrated Security=SSPI");
OleDbConnection cxn = new OleDbConnection();
cxn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='text;HDR=Yes;FMT=Delimited(,)';Data Source=" + fileDirPath;
OleDbCommand cmd = cxn.CreateCommand();
cmd.CommandText = string.Format("Select [OrderNumber] from [{0}]", Path.GetFileName(filePath));
cxn.Open();
var rdr = cmd.ExecuteReader();
bcp.DestinationTableName = "PersonTable";
bcp.WriteToServer(rdr);
rdr.Close();
cxn.Close();

Когда я помещаю имя файла как orders3_1.csv, оно читается нормально. Но когда я изменяю имя файла на orders3.1.csv, код сталкивается с исключением, говорящим, что он не может найти файл...

Это известная проблема с поставщиками JET?


person deostroll    schedule 25.10.2012    source источник
comment
в какой строке выдает исключение?   -  person Aleksandar Vucetic    schedule 25.10.2012
comment
Ошибка выдается при вызове executereader...   -  person deostroll    schedule 25.10.2012


Ответы (2)


Да это так. Jet довольно суетлив в отношении расширений файлов:

Другая потенциальная проблема заключается в том, что по умолчанию вы ограничены (по крайней мере, в Access) тем, какие расширения файлов вы можете использовать. Из коробки вы можете использовать только расширения файлов: txt, csv, tab и asc.

-- http://www.databasejournal.com/features/msaccess/article.php/3853531/Working-with-external-text-files-in-MS-Access.htm

Вы можете изменить реестр, чтобы он принимал другие.

person Fionnuala    schedule 25.10.2012
comment
Несколько точек в имени файла вызовут ошибку. Вы можете использовать вызов API, чтобы получить имя 8.3 MS-DOS и использовать его. Пример здесь: stackoverflow.com/a/22680288/741136 - person SSS; 28.03.2014

Вы должны заключить все имя файла в кавычки, но, поскольку это буквальная строка, используйте \", чтобы избежать их

cxn.ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='text;HDR=Yes;FMT=Delimited(,)';Data Source=\"{0}\"",fileDirPath);

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

person Imran Rizvi    schedule 25.10.2012