問題タブ [sqlncli]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ および SQL Native Client を使用した SQLGetData の問題
SQL Native Client を使用して MS SQL Server 2000 に接続する C++ アプリケーションがあります。
最初に割り当てられたバッファよりも多くのデータを含む TEXT カラムから結果を取得しようとしています。私の問題を明確にするために、私がやっていることの概要を説明します (以下のコード):
- 1024バイトのバッファを割り当てて使用
- SQLBindColumn を使用してバッファーを列にバインドする
- SQLExecute を使用して SELECT クエリを実行する
- SQLFetch を使用して結果を繰り返す
- SQLFetch は結果全体をバッファに返すことができませんでした: SQLGetData を使用して列の値全体を取得したいと思います
上記の操作順序には問題があります。SQLGetData が、ドライバーのバインドされた列に対して機能しません。
実際の解決策は、以下のコードに示すように SQL_DATA_AT_EXEC フラグを使用することです。
コードの開始:
c++ - C++ および SQL Native Client を使用して SQLPutData を準備するための SQLBindParameter
SQLBindParameter
を介して入力できるようにドライバーを準備するために使用しようとしていますSQLPutData
。データベースのフィールドはTEXT
フィールドです。私の関数は、MS の例に基づいて作成されています:
http://msdn.microsoft.com/en-us/library/ms713824(VS.85).aspx。
環境をセットアップし、接続を確立し、ステートメントを正常に準備しましたが、SQLBindParam
(以下のコードを使用して) 呼び出すと、一貫してレポートに失敗します:[Microsoft][SQL Native Client]Invalid precision value
SQL_NEED_LONG_DATA_LEN
上記は、使用中のドライバーが の情報タイプに「N」を返すことに依存していSQLGetInfo
ます。私のドライバーは「Y」を返します。を使用できるようにバインドするにはどうすればよいSQLPutData
ですか?
sql - SELECT ステートメントの後に行数が必要です: 最適な SQL アプローチは何ですか?
単一のテーブル (結合なし) から列を選択しようとしていますが、理想的には行の取得を開始する前に、行数のカウントが必要です。必要な情報を提供する 2 つのアプローチにたどり着きました。
アプローチ 1:
それで
またはアプローチ2
SQL ドライバー (SQL Native Client 9.0) では SELECT ステートメントで SQLRowCount を使用できないため、これを行っていますが、情報を割り当てる前に配列を割り当てるために、結果の行数を知る必要があります。残念ながら、動的に割り当てられたコンテナーの使用は、私のプログラムのこの領域ではオプションではありません。
次のシナリオが発生する可能性があることを懸念しています。
- SELECT for count 発生
- 別の命令が発生し、行を追加または削除します
- データの SELECT が発生し、突然配列が間違ったサイズになります。
-最悪の場合、配列の制限を超えてデータを書き込もうとして、プログラムがクラッシュします。
アプローチ 2 はこの問題を禁止しますか?
また、2 つのアプローチのどちらかが高速になりますか? もしそうなら、どれ?
最後に、考慮すべきより良いアプローチはありますか (おそらく、SQLRowCount を使用して SELECT 結果の行数を返すようにドライバーに指示する方法はありますか?)
質問された方のために、私はネイティブ C++ と前述の SQL ドライバー (Microsoft が提供) を使用しています。
c++ - それぞれがトランザクション、異なるテーブル、2 つのテーブル間の外部キー制約を使用する 2 つの SQL 接続によって作成されるデッドロック
環境
SQL Native Client 9.0 を使用して SQL Server 2000 データベースと通信する C++ アプリケーションに取り組んでいます。
シナリオ
- 2 つの接続が DBMS に対して開かれています
- 各接続はトランザクションを使用するように設定されています
Connection1
で動作するクエリTableA
Connection2
で動作するクエリTableB
TableB
key_id
のフィールドに外部キー制約がありますTableA
次のことを行う関数を作成しました。
私が遭遇したのは、 query(1)
が正常に実行されるということでしたが、 query に対して SQLExecute が呼び出されるとすぐ(2)
に、デバッガーはネバーランドでオフになります。
質問
デッドロックの問題として何が起こっているかを正しく診断していますか?
1Connection
はキーを作成しているTableA
がコミットしていないため、Connection2
それに情報を追加しようとしてTableB
いるため、外部キーの制約により、 にキーが存在する必要があることがわかりましたTableA
。このため、SQLExecute
クエリはブロックされ、トランザクションが完了するのを待ちます。これは、コードの記述方法のおかげで、書き込みが完了するTableA
まで実行できません。TableB
その他の注意事項
この問題を回避するためにコードを作成することはできますが、問題についての私の理解が正しいことを確認したいと思います。
c++ - sqlnclir.rll が継続的にロードおよびアンロードされる
私は、SQL Server 2000 と通信する C++ アプリケーションで SQL Native Client 9 を使用しています。現在、デバッグ作業を行っていますが、気になる点があることに気付きました (主に、かなりの混乱を引き起こしているため)。 rll は継続的にロードおよびアンロードされており、次の行がデバッグ出力ウィンドウにスパムされています。
「Win32 Thread」の後の ID は変わりますが、終了コードは常に 0 です。
.rll がこのように絶えずロードおよびアンロードされるのはなぜですか? また、それを防ぐにはどうすればよいですか?
上記の質問に答えられない場合、上記のメッセージが MSVC 2005 の [デバッグ出力] ウィンドウにスパム送信されないようにするにはどうすればよいですか? 理想的には、その特定のメッセージ セットに対してのみですか?
sql - SQLDisconnect 後に SQL Native Client ODBC アプリケーションが切断されず、プールされませんか?
背景:
SQL Native Client で ODBC を使用して SQL Server 2000 データベースと対話するための接続を確立する、C++ でコーディングされたプログラムを使用しています。
問題:
オブジェクトがインスタンス化されたときに接続を開き、オブジェクトが破棄されたときに接続を閉じるオブジェクトに接続が抽象化されます。オブジェクトが破棄されていることがわかります。デストラクタが起動し、これらのデストラクタの内部でSQLDisconnect( ConnHandle )
呼び出されSQLFreeHandle( SQL_HANDLE_DBC, ConnHandle );
ています。ただし、sp_Who2
SQL でまたはパフォーマンス モニターを使用して接続数を監視すると、これらの接続にもかかわらず、接続数が容赦なく増加していることがわかります。破壊されています。
これは、これらのオブジェクトを数千、つまり数千の接続を作成するのに十分長く実行される一連の関数を実行するまで、問題がないことが証明されています。
質問:
このようなものを見たことがありますか? 何が原因でしょうか? 私の最初の Google 検索はあまり実りがありませんでした。
編集:エラーなしで返されること
を確認しました。SQLDisconnect
接続プーリングはオフです。実際、 を使用して有効にしようとするとSQLSetEnvAttr
、 への 2 回目の呼び出しが行われたときにアプリケーションがクラッシュしますSQLDriverConnect
。
c++ - 接続プールがオンのときに 2 番目の接続を開くと、SQL Native Client がクラッシュしますか?
SQL Native Client を使用して ODBC 経由で SQL Server 2000 データベースと通信する C++ アプリケーションを使用しています。
データベース作業を行う前に、次のように環境ハンドルを割り当てます。
retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvironmentHandle );
これで正常に完了します。
接続プーリングを有効にするために、上記のステートメントの前に、次を呼び出します。
retcode = SQLSetEnvAttr( NULL, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER );
SQLSetEnvAttr
が含まれている場合、成功を示す適切なコードを返します。ただし、データベースへの接続を確立するために 2 回目に呼び出されたときに、アプリケーションがクラッシュする原因とSQLDriverConnect
なります (注: 最初の接続は を使用して作成され、この時点SQLDriverConnect
で切断さSQLDisconnect
れます)。この行をコメントアウトすると、アプリケーションは続行します。問題なく。
何が原因でしょうか?
c++ - SQL Server 2005 へのアップグレード: QNAN を浮動小数点列に挿入できませんか?
背景:
SQL Server 2000 から SQL Server 2005 への移行に取り組んでいます。これは、SQL Native Client を使用して ODBC 経由で SQL Server と通信する C++ アプリケーションに DB サービスを提供しています。
問題:
QNAN をデータベースの float 列に挿入しようとしています。私のアプリケーションでは、この値は double (値: 1.#QNAN00000000000) として格納され、パラメーターとしてデータベースに送信されます。これは SQL Server 2000 では問題ではありませんでしたが、SQL Server 20005 では同じコードで次のエラーが発生します。
着信表形式データ ストリーム (TDS) リモート プロシージャ コール (RPC) プロトコル ストリームが正しくありません。パラメータ 3 (""): 指定された値はデータ型 float の有効なインスタンスではありません。ソース データに無効な値がないか確認してください。無効な値の例は、位取りが精度より大きい数値型のデータです。
質問:
SQL Server 2005 で QNAN を受け入れることはできますか? もしそうなら、どのように?
c++ - SQL プロバイダーを SQLOLEDB.1 から SQLNCLI.1 に変更すると、ストアド プロシージャ経由でデータにアクセスするときにアプリが失敗する
MFC/C++ で記述されたレガシ アプリをサポートしています。アプリのデータベースは SQL Server 2000 にあります。最近、いくつかの新しい機能を追加したところ、SQL プロバイダーを SQLOLEDB.1 から SQLNCLI.1 に変更したときに、ストアド プロシージャを介してテーブルからデータを取得しようとするコードがあることがわかりました。失敗します。
問題のテーブルは非常に単純で、次のスクリプトで作成されています。
基本的に 4 つの列で、TableKey は ID 列であり、それ以外はすべて次のスクリプトによって設定されます。
上記の INSERT INTO に続く他の INSERT INTO の長いリストがあります。挿入された行の一部には、説明に特殊文字 (文字の上のアクセント記号など) が含まれています。私は当初、特殊文字を含めることが問題の一部であると考えていましたが、テーブルを完全にクリアしてから、特殊文字を含まない上から単一の INSERT INTO だけで再作成すると、それでも失敗します。
だから私は先に進みました...
このテーブルのデータは、次のコードを介してアクセスされます。
daxLayer は、アプリケーションが使用しているサード パーティのデータ アクセス ライブラリですが、そのソースがあります (一部を以下に示します)。 SP__GET_ALLERGEN_DESC は、テーブルからデータを取得するために使用されるストアド プロシージャであり、このスクリプト:
SQL プロバイダーが SQLNCLI.1 に設定されている場合、アプリは次の時点で異常終了します。
上記のコード スニペットから。そこで、次のような GetField に足を踏み入れました。
ここでの犯人は次のとおりです。
Fields->GetItem にステップインすると、次のようになります。
GetItem
次に、次のようになります。
GetValue
実行時にこれをステップ実行しながら _result を見ると、_result の BSTR 値は正しく、その値はテーブルの「説明」フィールドの「卵」です。すべての COM リリース コールなどのトレースをステップ実行し続けます。最終的に戻ると、次のようになります。
それを過ぎて次の行に進むと、BSTR="Egg" であるはずの tv の内容が次のようになります。
GetField 関数がその戻り値を tv.BSTR の値に設定しようとしたとき
当然のことながら、窒息して死にます。
では、BSTR の値はどうなったのでしょうか? また、プロバイダが SQLNCLI.1 に設定されている場合にのみ、BSTR の値が発生するのはなぜでしょうか?
なんと、最上位のコードでストアド プロシージャを使用してコメント アウトし、ストアド プロシージャが使用する同じ SQL SELECT ステートメントをハード コーディングしたところ、問題なく動作し、返される値が正しいことがわかりました。
また、ユーザーがアプリケーションを介してテーブルに行を追加することもできます。アプリケーションがそのテーブルに新しい行を作成し、ストアド プロシージャを介してその行を取得する場合、説明に特殊文字を含めない限り正しく機能します。その場合、行は正しく保存されますが、上記とまったく同じ方法で再び爆発します。その行の取得時。
要約すると、可能であれば、INSERT スクリプトを介してテーブルに挿入された行は、ストアド プロシージャによってアクセスされると、常にアプリを爆破します (特殊文字が含まれているかどうかに関係なく)。実行時にユーザーがアプリケーション内からテーブルに挿入した行は、説明に特殊文字が含まれていない限り、ストアド プロシージャを介して正しく取得されます。ストアド プロシージャではなく実行時にコードから SQL を使用してテーブル内の行にアクセスすると、説明に特殊文字があるかどうかに関係なく機能します。
これに光を当てることができれば大歓迎です。事前に感謝します。
vb6 - ログオン失敗、Crystal Reports 9、VB6、SQL サーバー、sqlncli
レガシー vb6 ソフトウェアのセットアップ パッケージをビルドしようとしています。ソフトウェア自体は、sqlncli (ネイティブ クライアント) を介して SQL サーバーに接続します。すべての依存関係をパッケージ化し、winxp と office2003 を実行している新しいマシンに展開しました。
これで、ターゲット マシンから、tcp/ip を使用して別の場所で実行されているデータベース (ms sqlserver 2005) に接続できます。レガシーソフトウェアはデータベースに問題なく接続し、データを操作できます。しかし、Crystal レポートを開こうとすると、問題が発生します。
「実行時エラー '-2147189176(80047e48): ログオンに失敗しました。詳細: 01000:[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect())」というエラーが表示されます。
レポートは別のシステム、別のデータベースなどで設計されているため、レポートを呼び出す前に、すべてのテーブルのデータベース情報をリセットするループがあります。
ConnectBufferString は、「接続文字列 = DRIVER = SQL Server;;ユーザー ID = ユーザー;;パスワード =;;データベース = MY_DB;;サーバー = 192.168.1.3\SQLEXPRESS;;UseDSNProperties = -1」を読み取ります。
プロバイダーを SQLNCLI に明示的に設定する方法はないようです。少なくとも、何も表示されません。
私の開発システムでソフトウェアを実行すると、すべてが想定どおりに機能します。
皆さんがこれで私を助けてくれることを願っています. これについて議論する必要はありません。また、これらのテクノロジー(vb6とcr9)は両方とも時代遅れだと思いますが、ここでは切り替えはオプションではありません.