2011-08-11 3 views
3

SQL 쿼리를 사용하여 실행 한 다음 결과 집합의 모든 열을 행 방식의 바인딩을 사용하여 SQL_C_WCHAR로 바인딩하는 클래스가 있습니다.정렬 문제를 피하면서 어떻게 ODBC에서 임의의 결과 집합을 행 방식으로 바인딩 할 수 있습니까?

지금 I 그것을 문자의 벡터를 할당하고 다음 SQLBindColumn주고 포인터를 결정하는 수행하는 방법 :

  • 버퍼 컬럼 1 = & VEC [0]
  • 버퍼에 대한 컬럼의 길이 지시자 1 = & VEC [0] + (는 sizeof (SQLWCHAR) * 1 열의 길이) 열의
  • 버퍼 (2) = & VEC [0] + (는 sizeof (SQLWCHAR) * 칼럼 (1)의 길이) + sizeof (길이 표시기)
  • 컬럼의 길이 지시자 10
  • 버퍼 (2) = & VEC [0] + (는 sizeof (SQLWCHAR) * 1 열의 길이) +는 sizeof (길이 지시자) + (컬럼 2는 sizeof (SQLWCHAR) * 길이)

(SPARC에서) 일부 정렬 문제가 발생합니다. 나는 약간의 패딩을 추가 할 필요가 있음을 알고 있지만, 어떻게 이식 가능한지 계산하는 방법을 모른다.

답변

2

내가 처리하는 방법은 실제로 길이 표시기와 별표를 별도의 올바르게 입력 된 버퍼에 넣는 것입니다. ODBC는 실제로 다음 버퍼 세트에 들어가기를 원할 때마다 각 주소에 'struct size'를 추가하기 때문에 실제로 동일한 버퍼에 살 필요가 없습니다.

스택에 두 개의 작은 배열을 할당하고 인접한 셀 사이의 포인터를 빼서 WCHAR 및 SQLLEN에 필요한 정렬을 알아 냈습니다. 그런 다음 두 정렬의 LCM을 가져 와서 버퍼에 패딩을 추가하여 각 세트가이 공간의 배수를 차지하도록했습니다. 필자는 ODBC를 위조 된 '구조체 크기'로 제공했습니다.

1

행렬 바인딩은 뒷면의 고통입니다. 그러나, 나는 (당신이 StrLen_or_IndPtr 인수를 의미한다고 가정 할 때) 지시자가 SQLINTEGER/SQLLEN (ODBC의 새로운 방법에 따라)의 별도 배열로 지정 될 수 있다고 생각했습니다. SQL_DESC_INDICATOR_PTR과 같은 것을 찾고 길이에 대해 또 다른 것이 있습니다. 설명자의 필드를 설정하여 데이터와 별도로 설정할 수 있습니다. 이 경우 정렬 문제를 피하고 행 데이터를 표시기/길이와 분리하여 보관하십시오.

업데이트 : http://msdn.microsoft.com/en-us/library/ms711730(v=vs.85).aspx

갱신 2 : 그냥 올바르게 4 바이트 경계 또는 무엇이든 스팍은 필요에 정렬합니다 (표시 등) 정수 값을 보장합니다.

+0

"SQL_DESC_INDICATOR_PTR 및 SQL_DESC_OCTET_LENGTH_PTR 설명자 필드를 다른 값으로 설정하여 표시기와 길이 값을 별도의 버퍼에 저장할 수 있으며,이 작업을 완료하면 구조에 세 번째 요소가 포함됩니다." 그것은 단지 그들이 struct의 별도 필드에있을 수 있다는 것을 의미하지만, 여전히 동일한 버퍼에 있어야하므로 문제가 해결되지는 않습니다. – Bwmat

+0

나는 그 요점을 놓치고 있다고 생각합니다. 열과 지표를 포함하는 구조를 만듭니다. 그런 다음 행 집합 크기를 결정하고 구조체 N 개를 만들고 배열합니다. 행 바인드 유형을 구조체의 크기로 설정합니다. SQLBindCol을 호출하면 구조체 배열의 첫 번째 행에있는 요소의 주소를 전달합니다. 드라이버가 두 번째 행에 쓸 때 행 바인드 형식 (sizeof 구조체)을 각 열의 SQLBindCol 값 전달에 추가합니다. 그러한 구조는 그 안에 "구멍"을 가질 수 있으며 정렬은 당신에게 달려 있습니다.구조에서 올바른 유형을 사용해야합니다. – bohica

+0

문제는 임의의 결과 집합에 대해 작동해야하며 구조체가 없다는 것입니다. 질문을 다시 읽으면 char 버퍼를 사용하고 있습니다. – Bwmat