Webアプリケーションでクエリを実行しているときに、null
値を取得しています。 SQL Management Studioで同じクエリを直接実行すると、結果が返されます。
問題はタイムアウトだと思います。 Webアプリケーションでクエリの実行時間を増やすにはどうすればよいですか?私のweb.config:connectionstring
には、タイムアウトのコードがありません。そこでタイムアウトを選択すると、システムの他の部分に影響しますか?
あなたは一つのことをすることができます。
のように:-appsettings.config->
<appSettings>
<add key="SqlCommandTimeOut" value="240"/>
</appSettings>
コード内->
command.CommandTimeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]);
それでうまくいくはずです。
注:-MicrosoftアプリケーションブロックのSqlHelperクラスを使用すると、ほとんどのタイムアウト問題に直面しました。コードにそれがあり、タイムアウトの問題に直面している場合は、sqlcommandを使用して、上記のようにタイムアウトを設定する方が良いでしょう。他のすべてのシナリオでは、sqlhelperで問題ありません。クライアントがsqlhelperクラスが提供するよりも少し長く待機しても問題ない場合は、先に進んで上記の手法を使用できます。
例:-これを使用-
SqlCommand cmd = new SqlCommand(completequery);
cmd.CommandTimeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]);
SqlConnection con = new SqlConnection(sqlConnectionString);
SqlDataAdapter adapter = new SqlDataAdapter();
con.Open();
adapter.SelectCommand = new SqlCommand(completequery, con);
adapter.Fill(ds);
con.Close();
の代わりに
DataSet ds = new DataSet();
ds = SqlHelper.ExecuteDataset(sqlConnectionString, CommandType.Text, completequery);
更新:以下の@Triynkoの回答も参照してください。確認することも重要です。
httpRuntime
ブロックを追加して、executionTimeout
を処理する必要があります(秒単位)。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<system.web>
<httpRuntime executionTimeout="90" maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100" />
</system.web>
...
</configuration>
詳細については、 msdn page を参照してください。
SQL Serverには、接続文字列のクエリタイムアウトを制御する設定がありません。私の知る限り、これは他の主要なデータベースでも同じです。しかし、これはあなたが見ている問題のようには見えません:私は例外が発生するのを期待しています
エラー:System.Data.SqlClient.SqlException:タイムアウトの期限が切れました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
クエリの実行中に本当にタイムアウトが発生した場合。
これが問題であることが判明した場合は、SQL Serverデータベースのデフォルトのタイムアウトをデータベース自体のプロパティとして変更できます。これにはSQL Server Managerを使用します。
クエリがexactlyであり、Webアプリケーションから直接実行しているものと同じであることを確認してください。プロファイラーを使用してこれを確認します。
私はゲームに少し遅れていることに気づきましたが、Webサービスのタイムアウトを変更しようとすることに1日以上費やしました。デフォルトのタイムアウトは30秒のようです。私が見つけた他のタイムアウト値を変更した後、私は以下を含みます:
最終的に、デフォルトで30秒に設定されていたのはSqlCommandタイムアウトであることがわかりました。
接続文字列のタイムアウトをコマンドに複製することにしました。接続文字列は、web.configで構成されます。
いくつかのコード:
namespace ROS.WebService.Common
{
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
public static class DataAccess
{
public static string ConnectionString { get; private set; }
static DataAccess()
{
ConnectionString = ConfigurationManager.ConnectionStrings["ROSdb"].ConnectionString;
}
public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] sqlParams)
{
using (SqlConnection conn = new SqlConnection(DataAccess.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand(cmdText, conn) { CommandType = cmdType, CommandTimeout = conn.ConnectionTimeout })
{
foreach (var p in sqlParams) cmd.Parameters.Add(p);
cmd.Connection.Open();
return cmd.ExecuteNonQuery();
}
}
}
}
}
接続文字列からタイムアウト値を「複製」するために導入された変更:CommandTimeout = conn.ConnectionTimeout
クエリの実行時間を増やすことはできないと思いますが、リクエストのタイムアウトを増やす必要があります。
実行タイムアウトASP.NETによって自動的にシャットダウンされるまでにリクエストの実行が許可される最大秒数を指定します。 (デフォルトの時間は110秒です。)
詳細については、 https://msdn.Microsoft.com/en-us/library/e1f13641%28v=vs.100%29.aspx をご覧ください。
あなたはweb.configで行うことができます。例えば
<httpRuntime maxRequestLength="2097152" executionTimeout="600" />