Как я могу переносимо реализовать построчное связывание произвольных наборов результатов в ODBC, избегая проблем с выравниванием? - PullRequest
3 голосов
/ 11 августа 2011

У меня есть класс, который принимает запрос SQL, выполняет его, а затем связывает каждый столбец в наборе результатов как SQL_C_WCHAR, используя построчное связывание.

Прямо сейчас я делаю это, чтобы выделить вектор символа и определить указатели для предоставления SQLBindColumn следующим образом:

  • буфер для столбца 1 = & vec [0]
  • буфер для индикатора длины столбца 1 = & vec [0] + (sizeof (SQLWCHAR) * длина столбца 1)
  • буфер для столбца 2 = & vec [0] + (sizeof (SQLWCHAR) * длина столбец 1) + sizeof (указатель длины)
  • буфер для индикатора длины столбца 2 = & vec [0] + (sizeof (SQLWCHAR) * длина столбца 1) + sizeof (индикатор длины) + (sizeof (SQLWCHAR) * длина столбца 2)

и т. Д.

это вызывает некоторые проблемы с выравниванием (в SPARC). Я знаю, что мне нужно добавить некоторые отступы, но я не знаю, как рассчитать, сколько переносимо.

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

То, как я в итоге справился с этим, заключалось в том, чтобы фактически поместить индикаторы длины и wchars в отдельные, правильно напечатанные буферы.На самом деле они не должны жить в одном и том же буфере, поскольку все, что делает ODBC, - это добавляет «размер структуры» к каждому адресу каждый раз, когда он хочет перейти к следующему набору.

Я выяснил, какое выравнивание необходимодля WCHAR и SQLLEN, выделяя два маленьких массива в стеке и вычитая указатели между соседними ячейками.Затем я взял LCM обоих выравниваний и добавил отступы к буферам, чтобы каждый набор занимал кратное этого пространства.Я кормил ODBC это как фальшивый «размер структуры».

1 голос
/ 12 августа 2011

Пошаговое связывание - это боль в спине.Однако я подумал, что индикаторы (при условии, что вы имеете в виду аргумент StrLen_or_IndPtr) могут быть указаны в отдельном массиве SQLINTEGER / SQLLEN (в зависимости от того, насколько новым является ваш ODBC).Ищите что-то вроде SQL_DESC_INDICATOR_PTR, и есть еще один для длины.Вы можете установить их отдельно от данных, установив поля в дескрипторе.Если вы сделаете это, вы избежите проблем с выравниванием и сохраните данные строк отдельно от индикатора / длины.

Обновление: http://msdn.microsoft.com/en-us/library/ms711730(v=vs.85).aspx

Обновление 2: просто убедитесь, что целочисленные значения (как у вас, индикатор)правильно выровнены на границе 4 байта или того, что требует Sparc.

...