データベースへのODBCアクセス(転載)

使用ODBC API之前要用到的头文件和LIB库
の#include "SQL.H" //これがメインですODBCコア機能に含まれています。
#include「SQLEXT.H」//これは、Microsoft SQL拡張機能を使用するアプリケーションに含まれている
このファイルには、ODBCで使用されるタイプの定義//「sqltypes.h」の#include
これは//の#include「sqlucode.hを」 UnicodeはODBCコア機能に含ま
#includeし、「odbcss.h」//これは、アプリケーションがSQL Serverドライバの特定の定義のためのファイルが含まれています。
#pragma COMENT(LIB、 "ODBC32.LIB")

ODBCのAPIの戻り値
         SQLRETURN:ODBC APIの戻り値は以下のように定義されます。;失敗のリターン・エラー・コードSQL_SUCCESS、SQL_SUCCESS_WITH_INFO:成功の戻り値に。もう一つ注意すべきは、そのODBCの戻り値があれば:SQL_SUCCESS_WITH_INFOはあなたが完全な成功を実行しますが、成功裏に実施することをが、特定のエラーメッセージで示されたことを意味するものではありません。ODBCのバグは、エラーメッセージを表示して結果セットを返し、あなたは結果セット内のすべての行を反復処理する必要が行う場合には、アイデアの実行の結果セットはこれを言及し、次のSQLクエリステートメントは非常に似ています。

SQLAllocHandleをODBCハンドルを作成
        SQLRETURNたSQLAllocHandle(
              SQL SMALLINT HandleTypeを、//ハンドル・タイプを適用する必要が
              SQLHANDLE InputHandle、//入力ハンドル
              SQLHANDLE * OutputHandlePtrをする);扱う最初のパラメータに適用する必要性を指定する//出力ハンドル
        HandleTypeをの最初のパラメータを指定できる値は:
            1. SQL_HANDLE_ENV
            SQL_HANDLE_DBC 2.
            3. SQL_HANDLE_STMT

SQLConnectの接続データベース
        SQLRETURNのSQLConnect(
              SQLHDBC ConnectionHandleは、DBC //ハンドル、HDBC
              SQLCHAR * ServerNameの、// ODBC DSNの名前
              SQLSMALLINT NameLength1、// ServerNameパラメータは、全体の長さ(必要に応じてSQL_NTS)を指定
              SQLCHAR *ユーザー名、//データベースのユーザー名を
              SQLSMALLINT NameLength2、//ユーザー名パラメータ指定された長さ(CAN SQL_NTS)
              SQLCHAR *認証、//ユーザパスワードデータベース
              (SQL_NTSであってもよい)SQLSMALLINT NameLength3)//認証パラメータ指定された長さ
    たとえば、次
        のSQLConnect(
                HDBC、
                (SQLTCHAR *)szDSN 、SQL_NTS、
                (SQLTCHAR *)szUserId、SQL_NTS、
                (SQLTCHAR *)szPassword、SQL_NTS)。

直接SQL文を実行するSQLExecDirectを
        SQLRETURNにSQLExecDirect(
            SQLHSTMT StatementHandleで、// STMTハンドル
            SQLCHAR * StatementTextに、// SQL文
            // StatementTextに長パラメータSQLINTEGER TextLength)を、あなたがSQL_NTSを使用することができます
        関数が成功した場合、あなたは結果セットを取得するか、あるいはエラーメッセージを返します。

SQL文の実行結果を取得する
        SQLクエリのために、ODBCは、カーソルが(形式として理解することができる)設定された対応する結果であり、カーソルを返します。開発者は、すべての結果を確認するためにカーソルを使用するには、カーソルを移動するためのODBC API関数を使用して、列フィールド行に現在のカーソルの値を取得することができます。さらなる修飾はまた、カーソルによるデータカーソルは、現在の変更がデータベースに直接反映され、指してもよいです。

カーソル移動のSQLFetch
        SQLRETURNのSQLFetch(SQLHSTMT StatementHandleでの);
        あなたはSQL文を実行するためにSQLExecDirectを呼び出した後、あなたは、データを取得するために、結果セットを横断する必要があります。StatementHandleが、それが施行されなければならない、STMTハンドルです。SQLFetch関数呼び出し、カーソルが、レコードセット時に、最後の1にカーソルを次のレコードに移動すると、この関数はSQL_NO_DATAを返します。

 カラム値で得られたSQLGetDataのカーソル
        SQLRETURNのSQLGetData(
            SQLHSTMT StatementHandlem、// STMTハンドル
            SQLUSMALLINT ColumnNumberには、//列番号は1から始まり
            SQLSMALLINT TargetTypeに、//データバッファ(のTargetValuePtr)C言語タイプ
            SQLPOINTERのTargetValuePtr、//データバッファ
            SQLINTEGER BufferLengthに、//データバッファ長の(のTargetValuePtr)
            SQLINTEGER * StrLen_or_IndPtrの); //現在のフィールドのバイト長を得る返します

カラムフィールドデータを得る結合するのSQLBindCol
        SQLRETURNのSQLBindCol(
            SQLHSTMT StatementHandleで、// STMTステートメント
            1から始まるSQLUSMALLINT ColumnNumberに、//列番号、
            SQLSMALLINT TargetTypeに、C言語タイプの//データバッファ(のTargetValuePtr)
            //データSQLPOINTERのTargetValuePtr、バッファ
            SQLINTEGER BufferLengthに、//データバッファ(のTargetValuePtr)バイト長
            SQLINTEGER * StrLen_or_IndPtrのを); //得られた現在のフィールドのバイト長を返し
        、結果セットからフィールド値を読み取るときには、SQLGetDataを使用することができるが、速度のために利用することができますカーソルODBCの移動後ごとに指定された変数にデータを送信するように、(SQLBindColの)方法を結合カラム

SQLNumResultColsの結果セット内の列の数
        SQLRETURN SQLNumResultColsの(
            StatementHandleで、// STMTハンドルSQLHSTMT
            SQLSMALLINT * ColumnCountPtrは); //列の数を返します

がSQLRowCountは、SQL文の行を実行した後に影響されて
        SQLRETURNがSQLRowCount(
            SQLHSTMT StatementHandleで、STMT扱う//
            SQLINTEGER * RowCountPtrを); //データの影響を受ける行の数
        あなたは、SQLExecDirectのことで実行されたSQL文を挿入、変更、および内のデータを削除することができますが行数変更、挿入、およびSQL文を削除するには、がSQLRowCount機能の影響を受けたデータの後に取得することができます。

列のSQLDescribeColの結果に記載
        SQLRETURNにSQLDescribeCol(
            SQLHSTMT StatementHandleでは、// STMTハンドル
            SQLSMALLINT ColumnNumberには、//列の数は、必要が開始からカウントされる。1つの
            SQLCHARは* ColumnNameのは、//与える列の名前
            SQLSMALLINT BufferLengthには、// ColumnNameの指定しました最大長パラメータ
            列名の長さを返し// SQLSMALLINT * NameLengthPtrに、
            SQLSMALLINT * DataTypePtrは、テーブル内の列のODBCデータ型を返す//
            列の長さを返し// SQLUINTEGER * ColumnSizePtr、
            、SQLSMALLINT * DecimalDigitsPtrを//番号場合など戻り値のデータ型がビット小数点以下
            SQLSMALLINT * NullablePtrを); //列がNULL値を許可するかどうかを示します

たSQLSetStmtAttrは、ODBCカーソルタイプ設け
        SQLRETURNたSQLSetStmtAttr(
            SQLHSTMT StatementHandleで、// STMTハンドル
            SQLINTEGER属性//属性タイプ設定する
            SQLPOINTER ValuePtrには、パラメータ値が//提供
            パラメータが整数である場合、//指定された長さパラメータ、SQLINTEGER StringLengthの)を設定されたときに
                                                // SQL_IS_INTEGER、パラメータが文字列の場合に設定されている
                                                //文字列またはSQL_NTSをされます

SQLSetStmtAttrのは、私たちがタイプ別のODBCカーソルに使用することができるように機能することができ
属性
 のValuePtrの
 役割
 
:のSQL_ATTR_ASYNC_ENABLE整数値
、SQL_ASYNC_ENABLE_OFFを
非同期実行機能を使用するかどうかをSQL_ASYNC_ENABLE_ONを
 
SQL_ATTR_QUERY_TIMEOUTが0に設定されたSQL文の有効な整数実行し、設定したときにタイムアウトを秒単位でそれには、タイムアウトを示していない
 
:のSQL_ATTR_CURSOR_TYPE整数値
SQL_CURSOR_FORWARD_ONLY、
SQL_CURSOR_STATIC、
SQL_CURSOR_DYNAMIC、SQL_CURSOR_KEYSET_DRIVENが設けカーソル型
 
        フォワード1.カーソルを:SQL_CURSOR_FORWARD_ONLY、前方のみスクロールカーソルを。
        2.静的カーソル:SQL_CURSOR_STATIC、結果のデータセットが静的であり、クエリが実行された後に説明され、データは、データベース内のレコードを更新するために、別のプログラムがあっても、結果セットが変更されない結果セットのレコードを返さそれは変更されません。
        3.動的カーソル:SQL_CURSOR_DYNAMICカーソルを行に対応するデータ値の結果セットが変更された場合、変更はカーソルに対応する結果セットに反映させることができる、開かれた後、変更は、次のとおりフィールドの変更、追加、結果を内の行の順序を変更します。しかしながら、行が削除された場合に注意するために削除された行の、もはや現在の結果に焦点を当てて現れる、本に設定結果に反映することはできません。データの変化に対応する動的カーソル結果セットが再構築されます。これらの行を取得しようと、動的カーソルの場合、例えば、動的カーソルが2つの行を取得したと仮定し、その後、別のアプリケーションが行の2つの行を更新し、別の行を削除し、その削除された行を(検出されません現在の結果セットは一行だけではありませんが、データラインが変更されたため、このような状況があってもよいので、行が削除されて検出するために、このアプローチを使用していない、もはやクエリを満たすことができる)が、更新された行の新しい値を返しますので、 。
        4.カーソルキー:SQL_CURSOR_KEYSET_DRIVEN、カーソルキーおよび改変の上記セットは除去ラインを検出するが、線を検出できず、結果セットの配列変異を加えることを除いて動的カーソル。カーソルが結果セット全体に作成されたときに作成されるため、結果セットのレコードと順序が固定されており、これは静的カーソルと同じです。キーセットカーソルは、いわば、カーソルタイプは、静的および動的カーソルカーソルとの間に介在しています。
        例えば:たSQLSetStmtAttr(HSTMT、SQL_ATTR_CURSOR_TYPE、( SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN、0);

スクロール可能カーソルのクエリ使用のSQLFetchScroll
        SQLRETURNのSQLFetchScroll(
            SQLHSTMT StatementHandleで、// STMTステートメントの
            SQLSMALLINT FetchOrientationを、//カーソルはすべての方法は、下記の表にスクロール
            SQLINTEGERたFetchOffsetを); //スクロールカーソル位置
        前のSQLFetch関数に記述だけカーソルを作ることができます移動する前に、多くの場合、我々は前後にカーソルを移動できるようにする必要があります。私たちは、別の関数のSQLFetchScrollを使用する必要がありますが、あなたは再びそれを使用する前にSQLSetStmtAttrを正しくカーソルタイプを設定します。
数FetchOrientation
 意味
 
次の行にSQL_FETCH_NEXTのスクロールを、今回のSQLFetchに相当呼び出すのFetchOffsetが(0の値を)無視されパラメータ
SQL_FETCH_PRIOR前の行にスクロールし、パラメータのFetchOffsetが(0の値を持つ)は無視され
、最初の行にSQL_FETCH_FIRSTスクロール、パラメータのFetchOffset (0の値を有する)は無視される
最後の行にSQL_FETCH_LASTスクロール、のFetchOffsetパラメータが(0の値を有する)は無視され
、指定されたパラメータにSQL_FETCH_ABSOLUTEたFetchOffsetスクロール絶対行
ロールフォワードで、指定されたパラメータとのFetchOffset反対の行を現在の位置をスクロールSQL_FETCH_RELATIVE未満0が後方転がり示し、0より大きくたFetchOffsetのFetchOffset


C / C ++言語の開発を使用して、その後、C言語で存在するいくつかのODBCデータ型が存在しないため、問題のデータは、言語とODBC間に存在しますが変換する必要があります。ですから、このようなSQLINTEGER、SQLFLOATのような変数を定義するためにODBC定義のデータ型の変数を定義するために使用する必要があり、int型を使用し、開発プロセスのODBCでC言語の実際の型などをフロート状態にしないでください。:ODBCマクロ定義は、C言語のデータ型を定義し、ODBCを使用しように
タイプ識別子のC
 typedefのODBC C
 型のC
 
SQL_C_CHARの
 SQLCHAR *
 はunsigned char *
 
SQL_C_SSHORT
 SQLSMALLINT
 ショートINT
 
SQL_C_USHORT
 SQLUSMALLINT
 unsigned short型整数
SQL_C_SLONG
 SQLINTEGER long int型
SQL_C_ULONG
 SQLUINTEGER
 符号なしのロングint型
SQL_C_FLOAT SQLREALの
 フロート
SQL_C_DOUBLE
 たSqlDouble、SQLFLOAT
 ダブル
 
SQL_C_BIT SQLCHAR
 unsigned char型
SQL_C_STINYINT SQLSCHARは
 文字の符号付き
 
SQL_C_UTINYINT
 SQLCHAR
 unsigned char型を
 
SQL_C_SBIGINT SQLBIGINT
 _int64
 
SQL_C_UBIGINT
 SQLUBIGINT
 符号なし_int64
 
SQL_C_BINARY
 * SQLCHAR
 はunsigned char *
 
SQL_C_XMLの
 * SQLCHARを
 unsigned char型*
SQL_C_BOOKMARKブックマークのunsigned long int型
 
SQL_C_VARBOOKMARK SQLCHAR *
 unsigned char型*
 
SQL_C_TYPE_DATE SQL_DATE_STRUCT
 構造体tagDATE_STRUCT
{
        SQLSMALLINT年。
        SQLUSMALLINT月。
        SQLUSMALLINT日;
} DATE_STRUCT。
SQL_C_TYPE_TIME
 SQL_TIME_STRUCT
 構造体tagTIME_STRUCT
{
         SQLUSMALLINTの時間。
         SQLUSMALLINT分;
         二SQLUSMALLINT;
} TIME_STRUCT。
 
SQL_C_TYPE_TIMESTAMP
 SQL_TIMESTAMP_STRUCT
 構造体tagTIMESTAMP_STRUCT
{
         SQLSMALLINT年。
         SQLUSMALLINT月。
         SQLUSMALLINT日;
         SQLUSMALLINT時間;
         SQLUSMALLINT分;
         二SQLUSMALLINT;
         SQLUINTEGER画分;
} TIMESTAMP_STRUCT
 
SQL_C_NUMERIC
 SQL_NUMERIC_STRUCT構造体tagSQL_NUMERIC_STRUCT
{
         SQLCHAR精度。
         SQLSCHARスケール。
         SQLCHARサイン。
         SQLCHARヴァル[SQL_MAX_NUMERIC_LEN]。
} SQL_NUMERIC_STRUCT。
 
SQL_C_GUID
 SQLGUID
 構造体tagSQLGUID {
        DWORDデータ1。
        WORDデータ2;
        WORDデータ3。
        BYTEのDATA4 [8]。
} SQLGUID。
 
すべてのC区間データ型は
 SQL_INTERVAL_STRUCT
 この付録の後半では、「C間隔構造」を参照してください。
 

ます。https://www.cnblogs.com/shelvenn/archive/2008/01/15/1039714.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33920401/article/details/94184498