Создать таблицу с дефисом в имени, используя Excel ACE OLEDB Connection - PullRequest
1 голос
/ 23 мая 2011

Кто-нибудь успешно использовал оператор CREATE TABLE для соединения ACE OLEDB с книгой Excel 2007, в которой в таблице указан дефис?На данный момент у меня есть что-то вроде

using(OleDbConnection c = new OleDbConnection())
{
    c.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"book.xlsx\";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";";
    c.Open();
    using(OleDbCommand cmd = c.CreateCommand())
    {
        cmd.CommandText = "CREATE TABLE [EN-GB] ([Brand] TEXT,[Text] TEXT, [SortOrder] TEXT, [Image] TEXT);";
        cmd.ExecuteNonQuery();
    }               
}

Имя таблицы является локалью и поэтому требует дефиса (мне нужна эта причина, потому что выходная рабочая книга импортируется в экземпляр SQL Server и таблицудолжен соответствовать схеме этой базы данных).Использование приведенного выше кода приводит к названию листа «EN_GB».Другие попытки использования различных кавычек или обратных тиков приводят либо к тому же, либо к книге, которую Excel восстанавливает при открытии.

Я понимаю, что могу открыть книгу позже и переименовать имя листа, но я надеялся, чточто-то, что я мог бы изменить в операторе SQL.

1 Ответ

1 голос
/ 17 мая 2012

У меня есть статический метод, который я создал и вызываю со всеми именами таблиц и столбцов. Я передаю методу строку, и он заменяет любые символы, указанные в моем массиве, подчеркиванием '_':

internal static string SafeName(string text) {
  if (!String.IsNullOrEmpty(text)) {
    const string array = "~`!@#$%^&*()-[]{}\\|<>,.;'\":/?";
    for (int i = 0; i < array.Length; i++) {
      text = text.Replace(array[i], '_');
    }
    return text;
  }
  throw new NullReferenceException();
}

Я редко использую какой-либо жестко закодированный SQL, как вы показали выше в своем выражении "CREATE".

Надеюсь, это поможет.

...