Win32 API 日本語リファレンス
ホーム › System.Search › SQLSpecialColumns

SQLSpecialColumns

関数
行を一意に識別する列や更新時変化列の情報を返す。
DLLODBC32.dll文字セットANSI (-A)呼出規約winapi

シグネチャ

// ODBC32.dll  (ANSI / -A)
#include <windows.h>

SHORT SQLSpecialColumns(
    void* StatementHandle,
    WORD IdentifierType,
    BYTE* CatalogName,   // optional
    SHORT NameLength1,
    BYTE* SchemaName,   // optional
    SHORT NameLength2,
    BYTE* TableName,   // optional
    SHORT NameLength3,
    WORD Scope,
    WORD Nullable
);

パラメーター

名前型方向説明
StatementHandlevoid*inout[入力] ステートメントハンドル。
IdentifierTypeWORDin

[入力] 返す列の種類。次のいずれかの値である必要があります:

SQL_BEST_ROWID: 列の値を取得することで、指定したテーブル内の任意の行を一意に識別できる、最適な列または列のセットを返します。列は、この目的のために特別に設計された疑似列 (Oracle の ROWID や Ingres の TID など) の場合と、テーブルの一意なインデックスを構成する列の場合があります。

SQL_ROWVER: 指定したテーブル内で、任意のトランザクションによって行内のいずれかの値が更新されたときにデータソースが自動的に更新する列がある場合に、その列を返します (SQLBase の ROWID や Sybase の TIMESTAMP など)。

CatalogNameBYTE*inoptional

[入力] テーブルのカタログ名。ドライバーが一部のテーブルについてはカタログをサポートし、他のテーブルについてはサポートしない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、空の文字列 ("") はカタログを持たないテーブルを表します。CatalogName に文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、CatalogName は識別子として扱われ、大文字と小文字は区別されません。SQL_FALSE の場合、CatalogName は通常の引数であり、文字どおりに扱われて大文字と小文字が区別されます。詳細については、「Arguments in Catalog Functions」を参照してください。

NameLength1SHORTin[入力] *CatalogName の文字数単位の長さ。
SchemaNameBYTE*inoptional

[入力] テーブルのスキーマ名。ドライバーが一部のテーブルについてはスキーマをサポートし、他のテーブルについてはサポートしない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、空の文字列 ("") はスキーマを持たないテーブルを表します。SchemaName に文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、SchemaName は識別子として扱われ、大文字と小文字は区別されません。SQL_FALSE の場合、SchemaName は通常の引数であり、文字どおりに扱われて大文字と小文字が区別されます。

NameLength2SHORTin[入力] *SchemaName の文字数単位の長さ。
TableNameBYTE*inoptional

[入力] テーブル名。この引数を null ポインターにすることはできません。TableName に文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、TableName は識別子として扱われ、大文字と小文字は区別されません。SQL_FALSE の場合、TableName は通常の引数であり、文字どおりに扱われて大文字と小文字が区別されます。

NameLength3SHORTin[入力] *TableName の文字数単位の長さ。
ScopeWORDin

[入力] 必要とされる rowid の最小スコープ。返される rowid はこれより広いスコープを持つ場合があります。次のいずれかである必要があります:

SQL_SCOPE_CURROW: rowid は、その行に位置付けられている間のみ有効であることが保証されます。別のトランザクションによって行が更新または削除された場合、後で rowid を使用して再選択しても行が返されないことがあります。

SQL_SCOPE_TRANSACTION: rowid は、現在のトランザクションの間有効であることが保証されます。

SQL_SCOPE_SESSION: rowid は、セッションの間 (トランザクションの境界を越えて) 有効であることが保証されます。

NullableWORDin

[入力] NULL 値を持つ可能性がある特殊な列を返すかどうかを決定します。次のいずれかである必要があります:

SQL_NO_NULLS: NULL 値を持つ可能性がある特殊な列を除外します。一部のドライバーは SQL_NO_NULLS をサポートできず、その場合、SQL_NO_NULLS が指定されると空の結果セットを返します。アプリケーションはこのケースに備え、どうしても必要な場合にのみ SQL_NO_NULLS を要求してください。

SQL_NULLABLE: NULL 値を持つ可能性がある場合でも、特殊な列を返します。

戻り値の型: SHORT

公式ドキュメント

SQLSpecialColumns は、指定したテーブル内の列について次の情報を取得します:

戻り値

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR、または SQL_INVALID_HANDLE。

解説(Remarks)

IdentifierType 引数が SQL_BEST_ROWID の場合、SQLSpecialColumns はテーブル内の各行を一意に識別する列を返します。これらの列は、select-list または WHERE 句で常に使用できます。テーブルの列に関するさまざまな情報を返すために使用される SQLColumns は、各行を一意に識別する列や、トランザクションによって行内のいずれかの値が更新されたときに自動的に更新される列を必ずしも返しません。たとえば、SQLColumns は Oracle の疑似列 ROWID を返さない場合があります。そのため、これらの列を返すには SQLSpecialColumns を使用します。詳細については、「Uses of Catalog Data」を参照してください。

メモ

ODBC カタログ関数の一般的な使用方法、引数、および返されるデータの詳細については、「Catalog Functions」を参照してください。

テーブル内の各行を一意に識別する列が存在しない場合、SQLSpecialColumns は行を持たないローセットを返します。そのステートメントに対して後続の SQLFetch または SQLFetchScroll を呼び出すと、SQL_NO_DATA が返されます。

IdentifierType、Scope、または Nullable の各引数が、データソースでサポートされていない特性を指定している場合、SQLSpecialColumns は空の結果セットを返します。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、CatalogName、SchemaName、および TableName の各引数は識別子として扱われるため、状況によっては null ポインターに設定できません。(詳細については、「Arguments in Catalog Functions」を参照してください。)

SQLSpecialColumns は、SCOPE で並べ替えた標準の結果セットとして結果を返します。

次の列は ODBC 3.x で名前が変更されました。アプリケーションは列番号でバインドするため、列名の変更が下位互換性に影響することはありません。

ODBC 2.0 の列 ODBC 3.x の列
PRECISION COLUMN_SIZE
LENGTH BUFFER_LENGTH
SCALE DECIMAL_DIGITS

COLUMN_NAME 列の実際の長さを確認するには、アプリケーションから SQL_MAX_COLUMN_NAME_LEN オプションを指定して SQLGetInfo を呼び出します。

次の表に、結果セット内の列を示します。列 8 (PSEUDO_COLUMN) より後の追加の列は、ドライバーが定義できます。アプリケーションは、明示的な序数位置を指定するのではなく、結果セットの末尾から数えることでドライバー固有の列にアクセスする必要があります。詳細については、「Data Returned by Catalog Functions」を参照してください。

列名 列番号 データ型 説明
SCOPE (ODBC 1.0) 1 Smallint rowid の実際のスコープ。次のいずれかの値が格納されます:

SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION

IdentifierType が SQL_ROWVER の場合は NULL が返されます。各値の説明については、このセクションの前半にある「Syntax」の Scope の説明を参照してください。
COLUMN_NAME (ODBC 1.0) 2 Varchar not NULL 列名。名前を持たない列に対して、ドライバーは空の文字列を返します。
DATA_TYPE (ODBC 1.0) 3 Smallint not NULL SQL データ型。ODBC SQL データ型またはドライバー固有の SQL データ型のいずれかです。有効な ODBC SQL データ型の一覧については、「SQL Data Types」を参照してください。ドライバー固有の SQL データ型については、そのドライバーのドキュメントを参照してください。
TYPE_NAME (ODBC 1.0) 4 Varchar not NULL データソースに依存するデータ型名。たとえば "CHAR"、"VARCHAR"、"MONEY"、"LONG VARBINARY"、"CHAR ( ) FOR BIT DATA" など。
COLUMN_SIZE (ODBC 1.0) 5 Integer データソース上の列のサイズ。列サイズの詳細については、「Column Size, Decimal Digits, Transfer Octet Length, and Display Size」を参照してください。
BUFFER_LENGTH (ODBC 1.0) 6 Integer SQL_C_DEFAULT が指定された場合に、SQLGetData または SQLFetch の操作で転送されるデータのバイト単位の長さ。数値データの場合、このサイズはデータソースに格納されているデータのサイズと異なることがあります。文字データの場合、この値は COLUMN_SIZE 列と異なることがあります。詳細については、「Column Size, Decimal Digits, Transfer Octet Length, and Display Size」を参照してください。
DECIMAL_DIGITS (ODBC 1.0) 7 Smallint データソース上の列の小数点以下桁数。小数点以下桁数が適用されないデータ型の場合は NULL が返されます。小数点以下桁数の詳細については、「Column Size, Decimal Digits, Transfer Octet Length, and Display Size」を参照してください。
PSEUDO_COLUMN (ODBC 2.0) 8 Smallint Oracle の ROWID のように、その列が疑似列かどうかを示します:

SQL_PC_UNKNOWN SQL_PC_NOT_PSEUDO SQL_PC_PSEUDO Note: 相互運用性を最大にするため、疑似列は SQLGetInfo が返す識別子引用符文字で引用しないでください。

アプリケーションは SQL_BEST_ROWID の値を取得した後、その値を使用して、定義されたスコープ内でその行を再選択できます。この SELECT ステートメントは、行を返さないか 1 行を返すかのいずれかであることが保証されます。

アプリケーションが rowid 列に基づいて行を再選択し、その行が見つからなかった場合、アプリケーションはその行が削除されたか、rowid 列が変更されたと見なすことができます。その逆は成り立ちません。rowid が変更されていない場合でも、行内の他の列が変更されている可能性があります。

列の種類 SQL_BEST_ROWID に対して返される列は、結果セット内を前後にスクロールして一連の行から最新のデータを取得する必要があるアプリケーションで役立ちます。rowid の列は、その行に位置付けられている間は変更されないことが保証されます。

rowid の列は、カーソルがその行に位置付けられていない場合でも有効なままである場合があります。アプリケーションは、結果セット内の SCOPE 列を調べることでこれを判断できます。

列の種類 SQL_ROWVER に対して返される列は、rowid を使用して行を再選択している間に、その行内のいずれかの列が更新されたかどうかを確認する必要があるアプリケーションで役立ちます。たとえば、rowid を使用して行を再選択した後、アプリケーションは SQL_ROWVER 列の以前の値と、取得したばかりの値を比較できます。SQL_ROWVER 列の値が以前の値と異なる場合、アプリケーションは表示中のデータが変更されたことをユーザーに通知できます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp)

各言語での呼び出し定義

// ODBC32.dll  (ANSI / -A)
#include <windows.h>

SHORT SQLSpecialColumns(
    void* StatementHandle,
    WORD IdentifierType,
    BYTE* CatalogName,   // optional
    SHORT NameLength1,
    BYTE* SchemaName,   // optional
    SHORT NameLength2,
    BYTE* TableName,   // optional
    SHORT NameLength3,
    WORD Scope,
    WORD Nullable
);
[DllImport("ODBC32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern short SQLSpecialColumns(
    IntPtr StatementHandle,   // void* in/out
    ushort IdentifierType,   // WORD
    IntPtr CatalogName,   // BYTE* optional
    short NameLength1,   // SHORT
    IntPtr SchemaName,   // BYTE* optional
    short NameLength2,   // SHORT
    IntPtr TableName,   // BYTE* optional
    short NameLength3,   // SHORT
    ushort Scope,   // WORD
    ushort Nullable   // WORD
);
<DllImport("ODBC32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function SQLSpecialColumns(
    StatementHandle As IntPtr,   ' void* in/out
    IdentifierType As UShort,   ' WORD
    CatalogName As IntPtr,   ' BYTE* optional
    NameLength1 As Short,   ' SHORT
    SchemaName As IntPtr,   ' BYTE* optional
    NameLength2 As Short,   ' SHORT
    TableName As IntPtr,   ' BYTE* optional
    NameLength3 As Short,   ' SHORT
    Scope As UShort,   ' WORD
    Nullable As UShort   ' WORD
) As Short
End Function
' StatementHandle : void* in/out
' IdentifierType : WORD
' CatalogName : BYTE* optional
' NameLength1 : SHORT
' SchemaName : BYTE* optional
' NameLength2 : SHORT
' TableName : BYTE* optional
' NameLength3 : SHORT
' Scope : WORD
' Nullable : WORD
Declare PtrSafe Function SQLSpecialColumns Lib "odbc32" ( _
    ByVal StatementHandle As LongPtr, _
    ByVal IdentifierType As Integer, _
    ByVal CatalogName As LongPtr, _
    ByVal NameLength1 As Integer, _
    ByVal SchemaName As LongPtr, _
    ByVal NameLength2 As Integer, _
    ByVal TableName As LongPtr, _
    ByVal NameLength3 As Integer, _
    ByVal Scope As Integer, _
    ByVal Nullable As Integer) As Integer
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SQLSpecialColumns = ctypes.windll.odbc32.SQLSpecialColumns
SQLSpecialColumns.restype = ctypes.c_short
SQLSpecialColumns.argtypes = [
    ctypes.POINTER(None),  # StatementHandle : void* in/out
    ctypes.c_ushort,  # IdentifierType : WORD
    ctypes.POINTER(ctypes.c_ubyte),  # CatalogName : BYTE* optional
    ctypes.c_short,  # NameLength1 : SHORT
    ctypes.POINTER(ctypes.c_ubyte),  # SchemaName : BYTE* optional
    ctypes.c_short,  # NameLength2 : SHORT
    ctypes.POINTER(ctypes.c_ubyte),  # TableName : BYTE* optional
    ctypes.c_short,  # NameLength3 : SHORT
    ctypes.c_ushort,  # Scope : WORD
    ctypes.c_ushort,  # Nullable : WORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ODBC32.dll')
SQLSpecialColumns = Fiddle::Function.new(
  lib['SQLSpecialColumns'],
  [
    Fiddle::TYPE_VOIDP,  # StatementHandle : void* in/out
    -Fiddle::TYPE_SHORT,  # IdentifierType : WORD
    Fiddle::TYPE_VOIDP,  # CatalogName : BYTE* optional
    Fiddle::TYPE_SHORT,  # NameLength1 : SHORT
    Fiddle::TYPE_VOIDP,  # SchemaName : BYTE* optional
    Fiddle::TYPE_SHORT,  # NameLength2 : SHORT
    Fiddle::TYPE_VOIDP,  # TableName : BYTE* optional
    Fiddle::TYPE_SHORT,  # NameLength3 : SHORT
    -Fiddle::TYPE_SHORT,  # Scope : WORD
    -Fiddle::TYPE_SHORT,  # Nullable : WORD
  ],
  Fiddle::TYPE_SHORT)
#[link(name = "odbc32")]
extern "system" {
    fn SQLSpecialColumns(
        StatementHandle: *mut (),  // void* in/out
        IdentifierType: u16,  // WORD
        CatalogName: *mut u8,  // BYTE* optional
        NameLength1: i16,  // SHORT
        SchemaName: *mut u8,  // BYTE* optional
        NameLength2: i16,  // SHORT
        TableName: *mut u8,  // BYTE* optional
        NameLength3: i16,  // SHORT
        Scope: u16,  // WORD
        Nullable: u16  // WORD
    ) -> i16;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("ODBC32.dll", CharSet = CharSet.Ansi)]
public static extern short SQLSpecialColumns(IntPtr StatementHandle, ushort IdentifierType, IntPtr CatalogName, short NameLength1, IntPtr SchemaName, short NameLength2, IntPtr TableName, short NameLength3, ushort Scope, ushort Nullable);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ODBC32_SQLSpecialColumns' -Namespace Win32 -PassThru
# $api::SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
#uselib "ODBC32.dll"
#func global SQLSpecialColumns "SQLSpecialColumns" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; SQLSpecialColumns StatementHandle, IdentifierType, varptr(CatalogName), NameLength1, varptr(SchemaName), NameLength2, varptr(TableName), NameLength3, Scope, Nullable   ; 戻り値は stat
; StatementHandle : void* in/out -> "sptr"
; IdentifierType : WORD -> "sptr"
; CatalogName : BYTE* optional -> "sptr"
; NameLength1 : SHORT -> "sptr"
; SchemaName : BYTE* optional -> "sptr"
; NameLength2 : SHORT -> "sptr"
; TableName : BYTE* optional -> "sptr"
; NameLength3 : SHORT -> "sptr"
; Scope : WORD -> "sptr"
; Nullable : WORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ODBC32.dll"
#cfunc global SQLSpecialColumns "SQLSpecialColumns" sptr, int, var, int, var, int, var, int, int, int
; res = SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
; StatementHandle : void* in/out -> "sptr"
; IdentifierType : WORD -> "int"
; CatalogName : BYTE* optional -> "var"
; NameLength1 : SHORT -> "int"
; SchemaName : BYTE* optional -> "var"
; NameLength2 : SHORT -> "int"
; TableName : BYTE* optional -> "var"
; NameLength3 : SHORT -> "int"
; Scope : WORD -> "int"
; Nullable : WORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; SHORT SQLSpecialColumns(void* StatementHandle, WORD IdentifierType, BYTE* CatalogName, SHORT NameLength1, BYTE* SchemaName, SHORT NameLength2, BYTE* TableName, SHORT NameLength3, WORD Scope, WORD Nullable)
#uselib "ODBC32.dll"
#cfunc global SQLSpecialColumns "SQLSpecialColumns" intptr, int, var, int, var, int, var, int, int, int
; res = SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
; StatementHandle : void* in/out -> "intptr"
; IdentifierType : WORD -> "int"
; CatalogName : BYTE* optional -> "var"
; NameLength1 : SHORT -> "int"
; SchemaName : BYTE* optional -> "var"
; NameLength2 : SHORT -> "int"
; TableName : BYTE* optional -> "var"
; NameLength3 : SHORT -> "int"
; Scope : WORD -> "int"
; Nullable : WORD -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	odbc32 = windows.NewLazySystemDLL("ODBC32.dll")
	procSQLSpecialColumns = odbc32.NewProc("SQLSpecialColumns")
)

// StatementHandle (void* in/out), IdentifierType (WORD), CatalogName (BYTE* optional), NameLength1 (SHORT), SchemaName (BYTE* optional), NameLength2 (SHORT), TableName (BYTE* optional), NameLength3 (SHORT), Scope (WORD), Nullable (WORD)
r1, _, err := procSQLSpecialColumns.Call(
	uintptr(StatementHandle),
	uintptr(IdentifierType),
	uintptr(CatalogName),
	uintptr(NameLength1),
	uintptr(SchemaName),
	uintptr(NameLength2),
	uintptr(TableName),
	uintptr(NameLength3),
	uintptr(Scope),
	uintptr(Nullable),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // SHORT
function SQLSpecialColumns(
  StatementHandle: Pointer;   // void* in/out
  IdentifierType: Word;   // WORD
  CatalogName: Pointer;   // BYTE* optional
  NameLength1: Smallint;   // SHORT
  SchemaName: Pointer;   // BYTE* optional
  NameLength2: Smallint;   // SHORT
  TableName: Pointer;   // BYTE* optional
  NameLength3: Smallint;   // SHORT
  Scope: Word;   // WORD
  Nullable: Word   // WORD
): Smallint; stdcall;
  external 'ODBC32.dll' name 'SQLSpecialColumns';
result := DllCall("ODBC32\SQLSpecialColumns"
    , "Ptr", StatementHandle   ; void* in/out
    , "UShort", IdentifierType   ; WORD
    , "Ptr", CatalogName   ; BYTE* optional
    , "Short", NameLength1   ; SHORT
    , "Ptr", SchemaName   ; BYTE* optional
    , "Short", NameLength2   ; SHORT
    , "Ptr", TableName   ; BYTE* optional
    , "Short", NameLength3   ; SHORT
    , "UShort", Scope   ; WORD
    , "UShort", Nullable   ; WORD
    , "Short")   ; return: SHORT
●SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable) = DLL("ODBC32.dll", "int SQLSpecialColumns(void*, int, void*, int, void*, int, void*, int, int, int)")
# 呼び出し: SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
# StatementHandle : void* in/out -> "void*"
# IdentifierType : WORD -> "int"
# CatalogName : BYTE* optional -> "void*"
# NameLength1 : SHORT -> "int"
# SchemaName : BYTE* optional -> "void*"
# NameLength2 : SHORT -> "int"
# TableName : BYTE* optional -> "void*"
# NameLength3 : SHORT -> "int"
# Scope : WORD -> "int"
# Nullable : WORD -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "odbc32" fn SQLSpecialColumns(
    StatementHandle: ?*anyopaque, // void* in/out
    IdentifierType: u16, // WORD
    CatalogName: [*c]u8, // BYTE* optional
    NameLength1: i16, // SHORT
    SchemaName: [*c]u8, // BYTE* optional
    NameLength2: i16, // SHORT
    TableName: [*c]u8, // BYTE* optional
    NameLength3: i16, // SHORT
    Scope: u16, // WORD
    Nullable: u16 // WORD
) callconv(std.os.windows.WINAPI) i16;
proc SQLSpecialColumns(
    StatementHandle: pointer,  # void* in/out
    IdentifierType: uint16,  # WORD
    CatalogName: ptr uint8,  # BYTE* optional
    NameLength1: int16,  # SHORT
    SchemaName: ptr uint8,  # BYTE* optional
    NameLength2: int16,  # SHORT
    TableName: ptr uint8,  # BYTE* optional
    NameLength3: int16,  # SHORT
    Scope: uint16,  # WORD
    Nullable: uint16  # WORD
): int16 {.importc: "SQLSpecialColumns", stdcall, dynlib: "ODBC32.dll".}
pragma(lib, "odbc32");
extern(Windows)
short SQLSpecialColumns(
    void* StatementHandle,   // void* in/out
    ushort IdentifierType,   // WORD
    ubyte* CatalogName,   // BYTE* optional
    short NameLength1,   // SHORT
    ubyte* SchemaName,   // BYTE* optional
    short NameLength2,   // SHORT
    ubyte* TableName,   // BYTE* optional
    short NameLength3,   // SHORT
    ushort Scope,   // WORD
    ushort Nullable   // WORD
);
ccall((:SQLSpecialColumns, "ODBC32.dll"), stdcall, Int16,
      (Ptr{Cvoid}, UInt16, Ptr{UInt8}, Int16, Ptr{UInt8}, Int16, Ptr{UInt8}, Int16, UInt16, UInt16),
      StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
# StatementHandle : void* in/out -> Ptr{Cvoid}
# IdentifierType : WORD -> UInt16
# CatalogName : BYTE* optional -> Ptr{UInt8}
# NameLength1 : SHORT -> Int16
# SchemaName : BYTE* optional -> Ptr{UInt8}
# NameLength2 : SHORT -> Int16
# TableName : BYTE* optional -> Ptr{UInt8}
# NameLength3 : SHORT -> Int16
# Scope : WORD -> UInt16
# Nullable : WORD -> UInt16
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int16_t SQLSpecialColumns(
    void* StatementHandle,
    uint16_t IdentifierType,
    uint8_t* CatalogName,
    int16_t NameLength1,
    uint8_t* SchemaName,
    int16_t NameLength2,
    uint8_t* TableName,
    int16_t NameLength3,
    uint16_t Scope,
    uint16_t Nullable);
]]
local odbc32 = ffi.load("odbc32")
-- odbc32.SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
-- StatementHandle : void* in/out
-- IdentifierType : WORD
-- CatalogName : BYTE* optional
-- NameLength1 : SHORT
-- SchemaName : BYTE* optional
-- NameLength2 : SHORT
-- TableName : BYTE* optional
-- NameLength3 : SHORT
-- Scope : WORD
-- Nullable : WORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ODBC32.dll');
const SQLSpecialColumns = lib.func('__stdcall', 'SQLSpecialColumns', 'int16_t', ['void *', 'uint16_t', 'uint8_t *', 'int16_t', 'uint8_t *', 'int16_t', 'uint8_t *', 'int16_t', 'uint16_t', 'uint16_t']);
// SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
// StatementHandle : void* in/out -> 'void *'
// IdentifierType : WORD -> 'uint16_t'
// CatalogName : BYTE* optional -> 'uint8_t *'
// NameLength1 : SHORT -> 'int16_t'
// SchemaName : BYTE* optional -> 'uint8_t *'
// NameLength2 : SHORT -> 'int16_t'
// TableName : BYTE* optional -> 'uint8_t *'
// NameLength3 : SHORT -> 'int16_t'
// Scope : WORD -> 'uint16_t'
// Nullable : WORD -> 'uint16_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ODBC32.dll", {
  SQLSpecialColumns: { parameters: ["pointer", "u16", "pointer", "i16", "pointer", "i16", "pointer", "i16", "u16", "u16"], result: "i16" },
});
// lib.symbols.SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable)
// StatementHandle : void* in/out -> "pointer"
// IdentifierType : WORD -> "u16"
// CatalogName : BYTE* optional -> "pointer"
// NameLength1 : SHORT -> "i16"
// SchemaName : BYTE* optional -> "pointer"
// NameLength2 : SHORT -> "i16"
// TableName : BYTE* optional -> "pointer"
// NameLength3 : SHORT -> "i16"
// Scope : WORD -> "u16"
// Nullable : WORD -> "u16"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int16_t SQLSpecialColumns(
    void* StatementHandle,
    uint16_t IdentifierType,
    uint8_t* CatalogName,
    int16_t NameLength1,
    uint8_t* SchemaName,
    int16_t NameLength2,
    uint8_t* TableName,
    int16_t NameLength3,
    uint16_t Scope,
    uint16_t Nullable);
C, "ODBC32.dll");
// $ffi->SQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable);
// StatementHandle : void* in/out
// IdentifierType : WORD
// CatalogName : BYTE* optional
// NameLength1 : SHORT
// SchemaName : BYTE* optional
// NameLength2 : SHORT
// TableName : BYTE* optional
// NameLength3 : SHORT
// Scope : WORD
// Nullable : WORD
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Odbc32 extends StdCallLibrary {
    Odbc32 INSTANCE = Native.load("odbc32", Odbc32.class, W32APIOptions.ASCII_OPTIONS);
    short SQLSpecialColumns(
        Pointer StatementHandle,   // void* in/out
        short IdentifierType,   // WORD
        byte[] CatalogName,   // BYTE* optional
        short NameLength1,   // SHORT
        byte[] SchemaName,   // BYTE* optional
        short NameLength2,   // SHORT
        byte[] TableName,   // BYTE* optional
        short NameLength3,   // SHORT
        short Scope,   // WORD
        short Nullable   // WORD
    );
}
@[Link("odbc32")]
lib LibODBC32
  fun SQLSpecialColumns = SQLSpecialColumns(
    StatementHandle : Void*,   # void* in/out
    IdentifierType : UInt16,   # WORD
    CatalogName : UInt8*,   # BYTE* optional
    NameLength1 : Int16,   # SHORT
    SchemaName : UInt8*,   # BYTE* optional
    NameLength2 : Int16,   # SHORT
    TableName : UInt8*,   # BYTE* optional
    NameLength3 : Int16,   # SHORT
    Scope : UInt16,   # WORD
    Nullable : UInt16   # WORD
  ) : Int16
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SQLSpecialColumnsNative = Int16 Function(Pointer<Void>, Uint16, Pointer<Uint8>, Int16, Pointer<Uint8>, Int16, Pointer<Uint8>, Int16, Uint16, Uint16);
typedef SQLSpecialColumnsDart = int Function(Pointer<Void>, int, Pointer<Uint8>, int, Pointer<Uint8>, int, Pointer<Uint8>, int, int, int);
final SQLSpecialColumns = DynamicLibrary.open('ODBC32.dll')
    .lookupFunction<SQLSpecialColumnsNative, SQLSpecialColumnsDart>('SQLSpecialColumns');
// StatementHandle : void* in/out -> Pointer<Void>
// IdentifierType : WORD -> Uint16
// CatalogName : BYTE* optional -> Pointer<Uint8>
// NameLength1 : SHORT -> Int16
// SchemaName : BYTE* optional -> Pointer<Uint8>
// NameLength2 : SHORT -> Int16
// TableName : BYTE* optional -> Pointer<Uint8>
// NameLength3 : SHORT -> Int16
// Scope : WORD -> Uint16
// Nullable : WORD -> Uint16
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SQLSpecialColumns(
  StatementHandle: Pointer;   // void* in/out
  IdentifierType: Word;   // WORD
  CatalogName: Pointer;   // BYTE* optional
  NameLength1: Smallint;   // SHORT
  SchemaName: Pointer;   // BYTE* optional
  NameLength2: Smallint;   // SHORT
  TableName: Pointer;   // BYTE* optional
  NameLength3: Smallint;   // SHORT
  Scope: Word;   // WORD
  Nullable: Word   // WORD
): Smallint; stdcall;
  external 'ODBC32.dll' name 'SQLSpecialColumns';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SQLSpecialColumns"
  c_SQLSpecialColumns :: Ptr () -> Word16 -> Ptr Word8 -> Int16 -> Ptr Word8 -> Int16 -> Ptr Word8 -> Int16 -> Word16 -> Word16 -> IO Int16
-- StatementHandle : void* in/out -> Ptr ()
-- IdentifierType : WORD -> Word16
-- CatalogName : BYTE* optional -> Ptr Word8
-- NameLength1 : SHORT -> Int16
-- SchemaName : BYTE* optional -> Ptr Word8
-- NameLength2 : SHORT -> Int16
-- TableName : BYTE* optional -> Ptr Word8
-- NameLength3 : SHORT -> Int16
-- Scope : WORD -> Word16
-- Nullable : WORD -> Word16
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let sqlspecialcolumns =
  foreign "SQLSpecialColumns"
    ((ptr void) @-> uint16_t @-> (ptr uint8_t) @-> int16_t @-> (ptr uint8_t) @-> int16_t @-> (ptr uint8_t) @-> int16_t @-> uint16_t @-> uint16_t @-> returning int16_t)
(* StatementHandle : void* in/out -> (ptr void) *)
(* IdentifierType : WORD -> uint16_t *)
(* CatalogName : BYTE* optional -> (ptr uint8_t) *)
(* NameLength1 : SHORT -> int16_t *)
(* SchemaName : BYTE* optional -> (ptr uint8_t) *)
(* NameLength2 : SHORT -> int16_t *)
(* TableName : BYTE* optional -> (ptr uint8_t) *)
(* NameLength3 : SHORT -> int16_t *)
(* Scope : WORD -> uint16_t *)
(* Nullable : WORD -> uint16_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library odbc32 (t "ODBC32.dll"))
(cffi:use-foreign-library odbc32)

(cffi:defcfun ("SQLSpecialColumns" sqlspecial-columns :convention :stdcall) :int16
  (statement-handle :pointer)   ; void* in/out
  (identifier-type :uint16)   ; WORD
  (catalog-name :pointer)   ; BYTE* optional
  (name-length1 :int16)   ; SHORT
  (schema-name :pointer)   ; BYTE* optional
  (name-length2 :int16)   ; SHORT
  (table-name :pointer)   ; BYTE* optional
  (name-length3 :int16)   ; SHORT
  (scope :uint16)   ; WORD
  (nullable :uint16))   ; WORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SQLSpecialColumns = Win32::API::More->new('ODBC32',
    'short SQLSpecialColumns(LPVOID StatementHandle, WORD IdentifierType, LPVOID CatalogName, short NameLength1, LPVOID SchemaName, short NameLength2, LPVOID TableName, short NameLength3, WORD Scope, WORD Nullable)');
# my $ret = $SQLSpecialColumns->Call($StatementHandle, $IdentifierType, $CatalogName, $NameLength1, $SchemaName, $NameLength2, $TableName, $NameLength3, $Scope, $Nullable);
# StatementHandle : void* in/out -> LPVOID
# IdentifierType : WORD -> WORD
# CatalogName : BYTE* optional -> LPVOID
# NameLength1 : SHORT -> short
# SchemaName : BYTE* optional -> LPVOID
# NameLength2 : SHORT -> short
# TableName : BYTE* optional -> LPVOID
# NameLength3 : SHORT -> short
# Scope : WORD -> WORD
# Nullable : WORD -> WORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い