0

私は最近、sqlcmdコマンドラインユーティリティを使用するC#コードをSqlDataReaderに置き換えることを同僚に提唱していました。古いコードは次を使用します:System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo( "cmd"、 "/ c" + sqlCmd); whersqlCmdは"sqlcmd-S" + serverName + "-y 0 -h-1 -Q" + "\" "+" USE [" + database +"] "+"; + txtQuery.Text + "\ ""; \

次に、結果は正規表現を使用して解析されます。私は、SQLDataReaderを使用することで、業界の慣行に沿ったものになり、デバッグと保守が容易になり、おそらくより高速になると主張しました。ただし、SQLDataReaderのアプローチは少なくとも同じ速度であり、おそらく低速です。私はSQLDataReaderですべてを正しく行っていると思います。コードは次のとおりです。

using (SqlConnection connection =
         new SqlConnection())
        {
            try
            {
                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
                connection.ConnectionString = builder.ToString(); ;
                SqlCommand command =
                    new SqlCommand(queryString, connection);

                connection.Open();



                SqlDataReader reader = command.ExecuteReader();

    // do stuff w/ reader 
                reader.Close();

            }
            catch (Exception ex)
            {
                outputMessage += (ex.Message);
            }
        } 

System.Diagnostics.Stopwatchを使用して両方のアプローチの時間を計測しましたが、コマンドラインユーティリティ(C#コードから呼び出されます)の方が高速に見えます(20〜40%?)。SqlDataReaderには、同じコードが再度呼び出されたときに高速になるという優れた機能がありますが、このアプリケーションではそれを予期していません。

私はすでにこの問題についていくつかの研究を行っています。コマンドラインユーティリティsqlcmdは、OLEDBテクノロジを使用してデータベースにアクセスすることに注意してください。それはADO.NETよりも高速ですか?特にコマンドラインユーティリティのアプローチにはプロセスの起動が含まれるため、私は本当に驚いています。本当に遅くなると思いました。

何かご意見は?

ありがとう、デイブ

4

1 に答える 1

0

SqlDataReaderを作成すると、データをフェッチするだけでなく、データベーススキーマ情報も取得し、sqlcmdはデータのみを取得するため、SqlDataReaderはsqlcmdよりも遅いと思います。次のようなデータリーダーを使用して列名を取得できます。

for (int i = 0; i < reader.FieldCount; i++)
{
    Console.WriteLine(reader.GetName(i));
}

パフォーマンスが重要でない場合もありますが、セキュリティがより重要です。しかし、どちらがより安全かはわかりません。おそらくSqlDataReaderが安全です。

私は中国人なので、文法が間違っているかもしれません。ごめんなさい。

于 2010-05-14T00:49:05.127 に答える