問題タブ [sqlcommand]
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.
.net - SqlCommandと一緒に使用すると、SQLクエリの速度が大幅に低下するのはなぜですか?
System.Data.SqlClient.SqlCommand
SQL Server Management Studioから実行する場合(2分後にタイムアウト)よりもはるかに高速に実行されるストアドプロシージャがあります(2秒)。
これの理由は何でしょうか?
詳細:SQL Server Management Studioでは、これは2秒で実行されます(本番データベースで):
.NET / C#では、2分後に次のタイムアウトが発生します(本番データベースの場合)。
、、、も試してみましたがselectCommand = "sp_Stat"
、同じ結果です。CommandType = StoredProcedure
SqlParameter
そしてそれEXEC
がなければ、同じ結果になります。
ほとんどデータが空の開発データベースでは、どちらの場合も1秒未満で終了します。つまり、データベースには大量のデータがあることに関連していますが、それは.NETからのみ発生するようです...
Marc GravellがさまざまなSET
値について書いたことは、提示されたケースに違いをもたらします。
SQL Server Profilerは、Sql Server Management Studioが、SET
.NETSqlクライアントデータプロバイダーが実行しない次のを実行することを示しました。
これらを含めると、SSMSと.NETで同じクエリに同じ時間がかかりました。そして責任SET
は...
私は何を学びましたか?推測する代わりにプロファイラーを使用するかもしれません...
(最初の解決策は、パラメーターのスニッフィングに関連しているように見えました。しかし、私はいくつかのことを混ぜ合わせていました...)
.net - SqlCommand.CommandTimeoutとSqlConnection.ConnectionTimeoutの違いは何ですか?
SqlCommand.CommandTimeout
.NETと.NETに違いはありSqlConnection.ConnectionTimeout
ますか?
c# - コードをusingステートメントにリファクタリングする
私は多くのメソッドを備えたdal層を持っており、それらはすべてストアドプロシージャを呼び出し、一部のリターンリスト(を使用してSqlDataReader
)を呼び出し、その他は特定の値のみを呼び出します。
を作成するヘルパーメソッドがありますSqlCommand
:
これで、私の平均的な(過度に単純化された)メソッド本体は次のようになります。
これをリファクタリングして、ヘルパー関数を失わないようにする方法はありますか(それ以外の場合はかなりの反復作業を行います)、それでも使用できますusing
か?
.net - 同じSqlConnectionオブジェクトを使用して複数のSqlCommandでT-SQL変数を宣言および使用して、複数の挿入を実行するにはどうすればよいですか?
おそらく長いユーザー名のリスト(1から数千のユーザー名)を指定して、レコードのリストをロードしたいと思います。名前の選択方法を無視し、データベース内の既存のデータから名前を判別できないと想定します。これはSQLServer2005に適用されます。
特に、where句に数千の式を含む単一のselectステートメントを使用しないようにします。これにより、SqlCommandオブジェクトのコマンドテキストが非常に長くなります(例)。合理的に聞こえますか?...where n='bob000001' or n='bob000002' or ... or n='bob003000'
単純なテーブル変数にユーザー名を入力し、テーブル変数とテーブルとユーザーデータの間で選択/結合を実行して、選択を実行することにしました。
したがって、最初に行う必要があるのは、テーブル変数にデータを入力することです。ここでいくつか問題があります:
- SQL Server 2008より前のT-SQL構文は、単一のステートメントでテーブルに複数の行を挿入するために冗長であり、複数のselectやunionallsなどが必要です。
- SS2005の冗長な構文、またはSQL Server 2008で使用可能な簡潔な構文を使用するのではなく、長いコマンドテキストを完全に避け、単一の接続で複数のコマンドを使用するだけです。
- 1つのSqlCommandでテーブル変数を宣言すると、後続のSqlCommandで使用しようとすると、「スカラー変数を宣言する必要があります」というエラーが発生します。
- 何らかの方法でストアドプロシージャを含めると、依然として巨大な文字列を渡す必要がある場合や、変数がストアドプロシージャの範囲外に存続するのを妨げる場合があります。ストアドプロシージャの作成はオプションではないと想定します。
その3番目のポイントは、私が今解決しようとしている問題です。私は、人々(主張する)がエラーなしで単一のSqlCommandで変数を正常に宣言して使用する例を見てきました。複数のSqlCommandインスタンスを使用する場合、これをどのように実現できますか?変数は、複数のコマンドにまたがる単一の接続に対して存続することを読みました。何らかの形でトランザクションの助けを伴う可能性がありますか?
最後に、一時テーブルは使用したくないことを覚えておいてください。そうすることで簡単な解決策が提供されますが、変数と複数のSqlCommandsに関して私が尋ねている質問も回避できます。ただし、それが最善の選択肢であると本当に思われる場合は、遠慮なくそう言ってください。
何が起こっているかを示すコードスニペットは次のとおりです。
注:パラメーターを含むSqlCommandは、ストアドプロシージャを内部的に呼び出すことを認識しています。これにより、通常、複数のSqlCommand間で変数を永続化できなくなりますが、テーブル変数を宣言する最初のクエリにはパラメーターが含まれません(つまり、command.Parametersへの参照はありません)。 AddWithValueが作成されます)。したがって、ストアドプロシージャを呼び出す可能性のある後のコマンドのスコープ内にある必要があります。
@
編集:一時テーブルを使用するには、 sを#
sに、declare @
sテーブルをsに変更するだけcreate table #
です。これは便利です。最後に一時テーブルを削除することもできますが、必須ではありません。
sql-server - SQLServer2008でのBeginExecuteNonQueryへの複数の呼び出しの処理
データベースに保存したい大量のデータを受信しているアプリケーションがあります。私の現在の戦略は、準備ができたときに各レコードで非同期呼び出し(BeginExecuteNonQuery)を実行することです。アプリケーションの残りの部分がスムーズに実行されるように、非同期呼び出しを使用しています。
私が抱えている問題は、データの量が増えるにつれて、最終的には、接続がまだ使用されている間にコマンドを実行しようとしているところに到達することです。私は2つの可能なオプションを見ることができます:
- 既存のコマンドが終了するまで、保留中のデータを自分でバッファリングします。
- 必要に応じて複数の接続を開きます。
これらのオプションのどれが最適か、または実際にもっと良い方法があるかどうかはわかりません。オプション1はおそらく私のバッファがどんどん大きくなることにつながるでしょうが、オプション2は非常に悪い形かもしれません-私にはわかりません。
どんな助けでもいただければ幸いです。
sql-server - トランザクションを指定せずにSQLCommandを実行する
SELECT
SQLServerデータベースでクエリを実行するSqlCommandを介してアプリケーションにフェッチされているデータのリストがいくつかあります。SqlCommandでトランザクションを明示的に設定するのではなく、SqlConnectionを渡して実行するだけです。ReadCommitted
トランザクションが指定されていない場合、SQL ServerはデフォルトのIsolationLevelが?のデフォルトのトランザクションを開始して使用します。
c# - SqlDbType.DateTimeは秒を保存しませんか?
SqlCommand cmd.Parameters
のを使用SqlDbType.DateTime
してデータベースにレコードを作成しています。
秒はデータベースに保存されていません。dbのフィールドのタイプはdatetimeです。
秒を節約するために何か特別なことをする必要がありますか、それともしSqlDbType.DateTime
ませんか?
java - JavaでSQL接続を誤って閉じないようにする方法は?
現在、トランザクション管理のために私がやっていることは次のとおりです。
「updateTableX」メソッドで接続を閉じることを回避できるかどうかを知りたいです。誰かが誤って接続を閉じた場合、私の updateTableY は接続されず、例外がスローされるためです。