2010-12-28 6 views
1

데이터베이스 연결에 문제가 있으며 코드에 문제가 있는지 궁금합니다. 검토하시기 바랍니다. 이 질문은 관련되어 있습니다 : Switch between databases, use two databases simultaneously 질문. 내가받을거야SQL 서버 데이터베이스에서 데이터를 검색하는 올바른 코드

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

실행하려고하면 어떻게됩니까? 우리는 당신을 위해 그것을 테스트 할 수 없습니다. 또한, 왜 이것이 두 데이터베이스 문제와 관련이 있다고 말합니까? 여기에는 데이터베이스가 하나뿐입니다. – egrunin

답변

3

여기에는 실제 문제가 없습니다.

마지막으로 {cnn.close()가 필요하지 않습니다. } using 절을 사용하면이를 처리 할 것이다. 그러나 그것을 변경하면 영의 영향은 없습니다.

또 다른 한가지는 리디렉션을 사용하여 using 절의 외부에 try .. catch를 넣는 것입니다. 그러나, 다시 말하면 나는 그 처분이 처형되는 데 영향을 줄 것이라고 생각하지 않습니다.

표시 한 것처럼 항상 연결을 올바르게 처리하는 경우 연결 풀 오류 (시간 초과가 만료 됨)가 발생한다는 것은 흥미로운 일입니다.

하나의 실제 솔루션으로 스위치 호스팅 제공 업체가 있습니다. 그들은 DB 서버를 사용 불가 상태로 과부하 시켰거나 네트워크 설정 (닉, 스위치, 라우터 등)에있는 일부 하드웨어 요소가 잘못되어 패킷을 삭제합니다. 당신이 데이터베이스 공급자에 원격으로 연결하는 경우

+0

좋아, 네 말이 맞아. 나는 너와 동의한다. 두 데이터베이스를 사용하는 것이 나에게 좋은 해결책으로 보였다. 그러나 그렇게 복잡 할 것입니다. –

1

, 당신은 등 자신의 네트워크 구성, 방화벽 설정,

손실 된 패킷으로 문제가 있는지 알아 내기 위해 패킷 스니퍼를 사용하여 같은 몇 가지 가능성을 볼 필요가 .

로컬 풀에 연결 풀링이 설정되어 서버가 연결합니다. 데이터베이스 공급자가 5 개의 연결 만 허용하고 연결 풀이 50 개의 연결로 설정되면 음 ... 당신은 수학을 할 수 있습니다. 당신이 제대로 연결을 닫고있는 것처럼 보이므로 문제는 없습니다.

참 ... "description = rdr ["Description "] ToString()"이 (가) "description = rdr ["Title "];

SqlCommand 개체 주위에 using 문을 넣을 필요가 없으며 특수 쿼리를 사용하기 때문에 string.Format ("sql test {0}", param)을 사용하십시오. 이렇게하면 매개 변수를 지우지 않고도 SqlCommand 개체를 다시 사용할 수 있습니다.

내가보기에 가장 큰 문제는 데이터 소스 레이어가있는 비즈니스 레이어와 프리젠 테이션 레이어를 섞어 놓은 것입니다. 시도해 덤프 ...비즈니스 레이어가 로깅 작업을 처리하도록 허용합니다. 프레젠테이션 레이어로 객체를 반환하고 리디렉션을 수행 할 수 있도록합니다. 데이터 소스 레이어를 매우 간단하게 유지하십시오. 데이터를 가져 와서 엔티티를 반환하십시오. 비즈니스 계층은 엔티티 자체의 모든 비즈니스 로직을 처리 할 수 ​​있습니다.

SQL Server를 찾을 수 없다는 것은 귀하의 잘못이거나 제공자가 될 수 있습니다 ... 제공자가 자주 잘못되었을 경우 제공자를 변경하십시오.

+0

아니요 물론 :). 나는 cs에 문제가 없다고 생각한다. –

+0

"초기 카탈로그 = 데이터베이스"는 데이터베이스 이름이 '데이터베이스'라고 말합니다. 또한 "데이터 소스 = mywebsite.com"은 무엇입니까? mywebsite.com은 SQL Server의 알려진 IP 주소로 해석합니까? –

+0

이름이 'database'인 데이터베이스가있을 수 있지만 실제 데이터베이스 이름은 FirmaDMOZ입니다. 내 진짜 db 도메인 이름은 IP로 해결되는 mssql2005.turhost.com입니다. –

0

DB가 TCP를 사용하여 원격 액세스 권한을 부여하도록 구성되어 있습니까?

+0

공급자가 서버에 문제가있을 수 있지만 일시적입니다. 오프라인에서 최대 10 분. 웹 사이트가 현재 온라인 상태입니다. http://firmadmoz.com/ –

1

고정 할 필요가 불일치의 몇 가지가 있습니다

  1. 설명 = RDR [ "제목"]; 적절한 캐스팅이 정의되지 않았습니다.
  2. 동일한 명령 개체가 각 SQL 문에 사용되며 매개 변수를 지우지 않아도 각 SQL 문에 별도의 명령을 사용해야하는 경우 이상적입니다.
  3. 리디렉션이 너무 많으면 메서드 끝 부분에서 리디렉션을 처리하는 것이 가장 좋습니다.
  4. 데이터베이스 서버의 상태도 확인하십시오. 데이터베이스 서버가 충분히 응답하지 않는 것 같습니다.

희망이 있으면 도움이 될 것입니다.

+0

1 : 일부 코드를 삭제했습니다. 2 : 왜 매개 변수가 같은지 확인하십시오. 나는 단지 가치를 바꾼다. 자원을 소비하는 이유는 무엇입니까? 많은 작업에 동일한 명령을 사용할 수 있습니까? 3 : 리디렉션에 동의합니다. 4 : 호스팅 공유가 불가능합니다. –

+1

예, 똑같은 명령을 사용할 수 있지만 디버깅 및 코드 유지 관리 측면에서 보면 약간 어려울 수 있습니다. 사이트가 상당히 크고 공유 서버에서 호스트하기 때문에 호스팅 제공 업체를 변경하는 것이 좋습니다. 누구 쿼리가 서버를 엉망으로 만든 지 누가 알겠습니까! – ShahidAzim

관련 문제