使用Excel ACE OLEDB连接在名称中创建带有连字符的表

时间:2011-05-23 09:17:29

标签: c# excel-2007 oledb ms-jet-ace

是否有人在ACE OLEDB连接上成功使用CREATE TABLE语句到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 个答案:

答案 0 :(得分:1)

我创建了一个静态方法,并使用我的所有表名和列名进行调用。我将方法传递给字符串,并用下划线'_'替换我在数组中指定的任何字符:

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();
}

我很少使用您在“CREATE”语句中显示的任何硬编码SQL。

我希望这会有所帮助。