1

私はODBC用のCコードを書くのは初めてですが、ここで質問があります...Cのodbc関数チュートリアルのチュートリアルを検索した後でも、それらがどのように連携して動作するかを正確に理解できません...

ステートメント ハンドル hstmt はデータベース データに対して正確に何をしますか? パラメータとして指定する SQL クエリ ステートメントを制御することはわかっていました。しかし、その後、クエリとして指定するすべての SQL ステートメントには、それぞれのステートメント ハンドル (hstmt) が必要ですか? それとも、複数の SQL クエリ ステートメントに対して 1 つのステートメント ハンドルですか?

例えば、

lstrcpy((LPTSTR)update, L"insert into employee values  ('Dshong','summer','LosAngeles');");
SQLExecDirect(hstmt1, update, SQL_NTS);

lstrcpy((LPTSTR)update, L"insert into works values ('Dshong','Small Bank',    2500);");
SQLExecDirect(hstmt3, update1, SQL_NTS);

lstrcpy((LPTSTR)select, L"select * from works;");
if (SQLExecDirect(hstmt, select, SQL_NTS) != SQL_SUCCESS)
    return printf("can’t exec direct");


lstrcpy((LPTSTR)select1, L"select * from employee;");
if (SQLExecDirect(hstmt2, select1, SQL_NTS) != SQL_SUCCESS)
    return printf("can’t exec direct");

hstmt が 4 つの 2 つの insert ステートメントと 2 つの select ステートメントに対して、このように指定する必要がありますか?

そして、私がこのように与えると、

lstrcpy((LPTSTR)insert, L"insert into employee values ('Dshong','summer','LosAngeles');");
SQLExecDirect(hstmt1, insert, SQL_NTS);

SQLExecDirect にはパラメータとして hstmt1 がありますが、SQLExecDirect がどのように動作するかわかりません..

で、やはり結果は一行挿入のはずですよね。

しかし、コードを実行すると、複数の同じ行が挿入('Dshong','summer','LosAngeles')されます...結果を印刷すると('Dshong','summer','LosAngeles')、挿入行がforループにない場合でも複数回挿入されました...

また、それらは以下の機能とどのように連携しますか?

  • SQLBindCol(hstmt, 1, SQL_C_CHAR, id, (SDWORD)sizeof(id), &idlen);
  • SQLFetch(hstmt)

私は彼らが単に何をしているのか知っていますが..ここでは、hstmt(ステートメントハンドル)がどのように機能するかを正確に知りたいです..

ありがとうございました.. :)

4

1 に答える 1

3

C のハンドルは、ODBC によって割り当てられたメモリのチャンクへの単なるポインターです。通常、SQL クエリの状態を追跡する構造体です。INSERT ステートメントでハンドルを使用することはあまりありません。使用するのは 1 回だけです。失敗しない限り、正確に同じハンドルを SQLError() に渡して、何が問題なのかを調べる必要があります。次に、どの ODBC を使用してその内部構造体にアクセスし、エラー コードを取得します。構造体ポインターに対するハンドルの利点は、内部実装を隠すことです。

クエリ結果を取得する必要があるため、SELECT クエリに対して繰り返し使用する必要があります。クエリ結果の列をメモリ ロケーションにマップするには、まったく同じハンドルを SQLBindCol() に渡す必要があります。そして、SQLFetch() で行を取得します。

C++ を知っている場合は、ハンドルをthisオブジェクト ポインターと考えると便利です。そしてコンストラクタとして SQLAllocStmt() 。そして、クラスのインスタンスメソッドとして SQLFetch() 。最後に、デストラクタとして SQLFreeHandle() を使用します。これはまさに、MFC の CRecordSet、CDatabase などの C++ ODBC ラッパー クラスが SQLHDBC ハンドルをラップするために行うことです。

ほとんどの場合、単一の SQLHSTMT ハンドルのみを使用します。複数の SQL ステートメントを同時に実行しない限り。2 つのハンドルを必要とする SELECT クエリから UPDATE ステートメントを生成するとします。

于 2012-11-03T11:49:28.257 に答える