2010-12-28 19 views
1

データベース接続に問題があり、コードに問題があるかどうか疑問に思う。レビューしてください。この質問は関連しています:Switch between databases, use two databases simultaneously質問。私が受けてるSQL Serverデータベースからデータを取得するための正しいコード

cs="Data Source=mywebsite.com;Initial Catalog=database;User Id=root;Password=toor;Connect Timeout=10;Pooling='true';" 

using (SqlConnection cnn = new SqlConnection(WebConfigurationManager.ConnectionStrings["cs"].ConnectionString)) 
{ 
    using (SqlCommand cmmnd = new SqlCommand("", cnn)) 
    { 
     try 
     { 
      cnn.Open(); 

      #region Header & Description 
      cmmnd.Parameters.Add("@CatID", SqlDbType.Int).Value = catId; 
      cmmnd.CommandText = "SELECT UpperID, Title, Description FROM Categories WHERE [email protected];"; 

      string mainCat = String.Empty, rootCat = String.Empty; 

      using (SqlDataReader rdr = cmmnd.ExecuteReader()) 
      { 
       if (rdr.Read()) 
       { 
        mainCat = rdr["Title"].ToString(); 
        upperId = Convert.ToInt32(rdr["UpperID"]); 
        description = rdr["Title"]; 
       } 
       else { Response.Redirect("/", false); } 
      } 

      if (upperId > 0) //If upper category exists add its name 
      { 
       cmmnd.Parameters["@CatID"].Value = upperId; 
       cmmnd.CommandText = "SELECT Title FROM Categories WHERE [email protected];"; 
       using (SqlDataReader rdr = cmmnd.ExecuteReader()) 
       { 
        if (rdr.Read()) 
        { 
         rootCat = "<a href='x.aspx'>" + rdr["Title"] + "</a> &raquo; "; 
        } 
       } 
      } 
      #endregion 

      #region Sub-Categories 
      if (upperId == 0) //show only at root categories 
      { 
       cmmnd.Parameters["@CatID"].Value = catId; 
       cmmnd.CommandText = "SELECT Count(CatID) FROM Categories WHERE [email protected];"; 

       if (Convert.ToInt32(cmmnd.ExecuteScalar()) > 0) 
       { 
        cmmnd.CommandText = "SELECT CatID, Title FROM Categories WHERE [email protected] ORDER BY Title;"; 

        using (SqlDataReader rdr = cmmnd.ExecuteReader()) 
        { 
         while (rdr.Read()) 
         { 
          subcat.InnerHtml += "<a href='x.aspx'>" + rdr["Title"].ToString().ToLower() + "</a>\n"; 
          description += rdr["Title"] + ", "; 
         } 
        } 
       } 
      } 
      #endregion 
     } 
     catch (Exception ex) { HasanG.LogException(ex, Request.RawUrl, HttpContext.Current); Response.Redirect("/", false); } 
     finally { cnn.Close(); } 
    } 
} 

ランダムエラーは以下のとおりです。

  • サーバーにリクエストを送信するとき、トランスポートレベルのエラーが発生しました。 (プロバイダー:TCPプロバイダー、エラー:0 - 既存の接続がリモートホストによって強制的に閉じられました)
  • SQL Serverへの接続を確立する際に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからなかったか、アクセスできませんでした。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認します。 (プロバイダー:名前付きパイププロバイダー、エラー:40 - SQL Serverへの接続を開けませんでした)
  • タイムアウトが切れています。プールから接続を取得する前にタイムアウト期間が経過しています。これは、プールされたすべての接続が使用中で、プールの最大サイズに達したために発生した可能性があります。
  • ログインで要求されたデータベース "db"を開くことができません。ログインに失敗しました。ユーザー 'root'のログインに失敗しました。
+0

あなたの質問は何ですか? – egrunin

+0

コードは正しいですが、間違いがありますか? –

+0

実行しようとするとどうなりますか?私たちはあなたのためにそれをテストすることはできません。また、なぜこれに2データベースの問題と関係があると言いますか?ここには1つのデータベースしかありません。 – egrunin

答えて

3

ここには実際の問題はありません。

最後に不要な{cnn.close();}は必要ありません。 } using節があなたのためにそれを処理します。しかし、それを変更することは全く影響を与えません。

もう1つは、リダイレクトを使用してusing句の外にtry .. catchを置くことです。しかし、再び、私はそれが処分に影響を与えるとは思わない。

ここで示したように、接続を正しく処理している場合は、接続プールエラー(タイムアウト期限切れ)が発生するのは面白いことです。

実際のソリューションは1つだけです:スイッチホスティングプロバイダ。彼らはDBサーバーを使用不能にするか、またはネットワーク設定(NIC、スイッチ、ルータなど)のハードウェア要素に負荷がかかり、パケットを破棄してしまいます。失われたパケットが問題にしている場合など

+0

さて、あなたは正しいと私はあなたに同意します。 2つのデータベースを使用することは私にとっては良い解決策に見えました。しかし、それはそのように非常に複雑になるでしょう。 –

1

データベースプロバイダにリモートで接続している場合、あなたはあなた自身のネットワーク設定、ファイアウォールの設定のようないくつかの可能性を調べる必要があり、

は把握するパケットスニファを使用します。

接続プーリングは、接続を確立しているローカルマシンでセットアップされています。データベースプロバイダが5つの接続のみを許可し、接続プールが50の接続に対して設定されている場合は、よく...あなたは数学を行うことができます。あなたが接続を適切に閉じているように見えるので、問題はありません。

True ... "description = rdr [" Description "rdr [" Title "];"の記述が "Description"] ToString() "である必要があります。

SqlCommandオブジェクトの前後にusingステートメントを置く必要はなく、アドホッククエリを使用しているので、単にstring.Format( "sql test {0}"、param)を使用してください。このようにして、パラメータを消去することなくSqlCommandオブジェクトを再利用できます。

私がここで見る最も大きな問題は、プレゼンテーションレイヤーとビジネスレイヤーをデータソースレイヤーで混合したことです。試してみてください...ビジネス層がロギングを処理できるようにします。オブジェクトをプレゼンテーションレイヤーに戻し、リダイレクトを実行できるようにします。データソース層を非常にシンプルに保つ...データを取得してエンティティを返す。ビジネスレイヤーは、エンティティ自体のビジネスロジックを処理できます。

SQL Serverが見つかりませんでした。プロバイダが不具合を起こしている可能性があります。プロバイダに障害が頻繁に発生している場合は、プロバイダを変更してください。

+0

いいえもちろんです:)。私はcsに何も間違っているとは思わない。 –

+0

"Initial Catalog = database"は、データベース名が「データベース」であることを示します。また、「データソース= mywebsite.com」はどうなっていますか? mywebsite.comはSQL Serverの既知のIPアドレスに解決しますか? –

+0

名前が 'database'のデータベースがありますが、私の実際のデータベース名はFirmaDMOZです。私の実際のdbドメイン名はmssql2005.turhost.comで、これはIPに解決されます。 –

0

DBがTCPを使用したリモートアクセスを許可するように設定されていますか?

+0

プロバイダーがサーバーに問題がある可能性はありますが、一時的です。オフラインで最大10分。 Webサイトは現在オンラインです:http://firmadmoz.com/ –

1

固定する必要が不一致のカップルがあります。

  1. 説明= RDR [ "タイトル"];適切なキャスティングは定義されません。
  2. 同じコマンドオブジェクトが各SQL文に使用され、パラメータをクリアしていない場合でも、各SQL文に対して別々のコマンドを使用するのが理想的です。
  3. リダイレクトが多すぎる場合は、メソッドの最後にリダイレクトを処理することをお勧めします。
  4. データベースサーバーの健全性もチェックしてください。データベースサーバーが十分に応答していないようです。

希望すると助かります。

+0

1:私はいくつかのコードをクリアしました。 2:パラメータが同じであれば、なぜクリアしますか?私は値を変更するだけです。なぜ私は多くのアクションに対して同じコマンドを使用できるのですか? 3:リダイレクトに同意します。 4:共有ホスティングはできません。 –

+1

はい、同じコマンドを使用することはできますが、デバッグやコードのメンテナンスに関しては少し難しいでしょう。サイトが非常に大きく、共有サーバーでホストすることが問題になるため、ホスティングプロバイダーを変更することを検討する必要があります。どのクエリがサーバを台無しにしたのか誰が知っていますか? – ShahidAzim

関連する問題