При попытке выбрать данные из Excel с помощью OLEDB выдает ошибку ** Синтаксическая ошибка (отсутствует оператор) в выражении запроса «Создано» ** - PullRequest
0 голосов
/ 01 февраля 2019

Когда я пытался выбрать все данные из Excel, используя OLEDB. Я получаю ошибку

Синтаксическая ошибка (отсутствует оператор) в выражении запроса 'Создано' Это из-за этого пространствав имени столбца?

Запрос:

ВЫБЕРИТЕ Код, Имя, Создан, Дата ОТ [Шаблон $]

public DataTable GetExcelDataToTable(string filename, string dataExchangeSelectedColum)
{
    //List<DataExchangeDefinition> dataExchange = new List<DataExchangeDefinition>();
    string extension = Path.GetExtension(filename);
    string connstring = string.Empty;
    DataTable ExcelData = null;
    try
    {
        switch (extension)
        {
            case ".xls":
                connstring = string.Format(ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString, filename);
                break;
            case ".xlsx":
                connstring = string.Format(ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString, filename);
                break;
        }
        using (OleDbConnection connExcel = new OleDbConnection(connstring))
        {
            using (OleDbCommand cmd = new OleDbCommand())
            {
                cmd.Connection = connExcel;
                connExcel.Open();
                var dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                connExcel.Close();
                var firstSheet = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                cmd.CommandText = "SELECT " + dataExchangeSelectedColum + " FROM [" + firstSheet + "]";
                ExcelData = new DataTable();
                OleDbDataAdapter oda = new OleDbDataAdapter();
                oda.SelectCommand = cmd;
                oda.Fill(ExcelData);
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return ExcelData;
}

Это код, который я пробовал, здесь dataExchangeSelectedColum содержит столбцы «Код, Имя, Создано, Дата»

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я сделал это так

 List<string> selecttedColsList = dataExchangeSelectedColum.Split(',').ToList();
        string formattedColumns = "";
        //string comma = "";
        for (int i = 0; i < selecttedColsList.Count; i++)
        {
            //formattedColumns = string.Join(",", selecttedColsList.Select(col => $"[" + selecttedColsList[i] + "]"));
            formattedColumns+= ""+$"[" + selecttedColsList[i] + "]";
            if (i != selecttedColsList.Count - 1)
            {
                formattedColumns += ",";
            }

        }            
0 голосов
/ 01 февраля 2019

Вам необходимо добавить квадратные скобки вокруг имени столбца, если он содержит пробелы:

cmd.CommandText = $"SELECT [{dataExchangeSelectedColum}] FROM [{firstSheet}]";

РЕДАКТИРОВАТЬ после вашего комментария:

Если вы хотите выбрать несколько столбцов, имя которых может содержать пробелы:

public DataTable GetExcelDataToTable(string filename, IEnumerable<string> columns)
{
    ...
    string formattedColumns = string.Join("," columns.Select(column => $"[{column}]"));

    cmd.CommandText = $"SELECT {formattedColumns} FROM [{firstSheet}]";
    ...
}

, который может быть вызван следующим образом:

DataTable table = GetExcelDataToTable(fileName, 
    new string[] { "Code", "Name", "Created By", "Date" });
...