2013-06-25 2 views
0

Я не понимаю этот фрагмент кода. Когда я пытаюсь использовать другой файл excel, он не компилируется должным образом. Почему программист использовал F и ссылается ли он на столбец или строку?Что это за SQL-запрос, выполняемый в файле Excel?

string strProvider; 
     if (dbFilePath.LastIndexOf("xlsx") > -1) 
      strProvider = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbFilePath + @";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"; 
     else 
      strProvider = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" + dbFilePath + @""";Persist Security Info=False;Extended Properties=""Excel 8.0;"""; 

     string strQuery = "SELECT " + 
          "F9 AS EmpNbr, " + 
          "F10 AS ACCTSTATUS, " + 
          "F1 AS PROJECTEDAGE, " + 
          "F14 AS UPDBALDUE, " + 
          "F15 AS AMTCURRENT, " + 
          "F16 AS AMT30DAY, " + 
          "F17 AS AMT60DAY, " + 
          "F18 AS AMT90DAY, " + 
          "F19 AS AMT120DAY, " + 
          "F20 AS AMT150DAY, " + 
          "F21 AS AMT180DAY " + 
          "FROM [Sheet1$A8:V] " + 
          "WHERE F9 IS NOT NULL AND " + 
          "(F17 > 0 OR F18 > 0 OR F19 > 0 OR F20 > 0 OR F21 > 0) " + 
          " AND Trim(F10) <> 'RETURN MAIL/LEFT COMPANY' " + 
          " AND Trim(Left(F1,3)) IN ('60','90','120','150','180') " + 
          "ORDER BY F9 "; 
+0

Относится ли F к колонке? –

+0

Jet и ACE являются поставщиками OLEDB, которые позволяют использовать синтаксис SQL в электронной таблице Excel и других данных в офисе MS. Итак, да, это клеточные ссылки, которые сглаживаются. Поскольку у вас есть электронная таблица, вы можете посмотреть в ячейках и посмотреть, что такое данные. Например, я подозреваю, что ячейка 'F9' содержит номер сотрудника. – Jodrell

+0

Я тоже так думал, но в файле Excel F9 не ссылается ни на что релевантное. Фактически, когда я переношу данные в файл Excel, он имеет немного больше смысла, т.е. 9 ссылается на столбец, а F - на строку ... я не знаю, почему это так, но –

ответ

2

F1, F2, F3 etc просто генерируются заголовки столбцов и являются NOT ссылки на ячейки. Несмотря на то, что в строке подключения есть HDR=YES, если первая строка пустая, поставщик будет автоматически генерировать имена столбцов от F1 до F(n). Почему он выбирает F, я не знаю, но n - это просто порядковый номер столбца (начиная с 1), и имя имеет префикс, поэтому его нельзя путать с числом.

Если вы вернетесь к тому, чтобы думать о своем наборе данных как о базе данных, а не о таблице, было бы бессмысленно ссылаться на определенную строку в запросе, например.г Если вы представить себе небольшую таблицу

ID | A | B | C | 
------------------- 
1 | x | y | z | 
2 | d | e | f | 
3 | j | k | l | 

Тогда думать в терминах SQL, а не превзойти следующий запрос не имеет смысла, чтобы получить только первую строку, так как A1 = X:

SELECT A, B, C 
FROM Sheet1 
WHERE A1 = 'x'; 

Вы бы должны использовать столбцы следующим образом:

SELECT A, B, C 
FROM Sheet1 
WHERE ID = 1 
AND A = 'x'; 
+0

Да, это то, что я искал. Я не понимал, откуда пришел F, поскольку это не относится к реальной ячейке. Кажется, что оба провайдера делают то же самое и назначают «F» в качестве префикса имени столбца, когда имена столбцов по умолчанию отсутствуют. Спасибо за решение этого вопроса –

+1

Вероятно F = "Поле" –

1

F9, F10 и так далее клетка, F (или любая другая буква/комбинация), являющийся показатель столбца и 9 (или любое другое количество) индекс строки.

0

Что здесь делает этот сниппет, создает соединение OLEDB с базой данных и выполняется запрос к базе данных. В начале он проверяет, является ли база данных еще одним листом excel. Если это то, что использует этот тип соединения:

Provider = Microsoft.ACE.OLEDB.12.0; Data Source =»+ dbFilePath + @ "; Extended Properties =" "Excel 12,0 Xml, HDR = YES"

В противном случае он использует это:

"Provider = Microsoft.Jet.OLEDB.4.0; Источник данных =" "" + dbFilePath + @ "" "; Упорство Security Info = False; Расширенные свойства = "

Вероятно, ожидается, что любой другой тип базы данных будет основан на доступе, как я предполагаю.

+2

Фактически, он всегда подключается к электронной таблице, но если расширение файла - 'xlsx', оно выводит новую версию Excel, поэтому использует' ACE'. В противном случае он использует более старый поставщик JET, суммируя расширение 'xls'. Конечно, на практике существует только взаимосвязь между расширением файла и содержимым файла. – Jodrell

0

Jet и ACE являются поставщиками OLEDB, которые позволяют использовать синтаксис SQL в электронной таблице Excel и других данных в офисе MS. Итак, да, это ссылки на ячейки, которые псевдонимы. Поскольку у вас есть электронная таблица, вы можете посмотреть в ячейках и посмотреть, что такое данные. Например, я подозреваю, что ячейка F9 содержит номер сотрудника.

В Spreasheet Excel, столбцы пронумерованы от A через Z, а затем через AAAZ и т.д., строки перечисления из 1 вверх. Поэтому ссылка ячейки F9 координируется в столбце F и в строке 9.


Поскольку «FROM» Диапазон Sheet1$A8:V относительна, вы, возможно, придется tarnspose избранных соответственно. Что находится в 17-й строке? Есть F17 номер сотрудника?


Возможно изменить запрос

string strQuery = "SELECT * FROM [Sheet1$A8:V]" 

и начать оттуда.

+0

В этом случае F9 не относится к ячейке F9 в электронной таблице Excel. Сначала я не понял, но GarethD объяснил это ниже –