2013-04-27 3 views
0

다른 날짜를 포함하는 (IDcolumn, int), (Differencecolumn, int) 및 (Datecolumn DateTime) 테이블이 있습니다.각 날짜의 차이 가져 오기 및 데이터베이스에 삽입

주말을 무시하는 날짜 간의 차이를 계산하는 방법입니다.

public static double GetBusinessDays(DateTime startD, DateTime endD) 
    { 
     double calcBusinessDays = 
      1 + ((endD - startD).TotalDays * 5 - 
      (startD.DayOfWeek - endD.DayOfWeek) * 2)/7; 

     if ((int)endD.DayOfWeek == 6) calcBusinessDays--; 
     if ((int)startD.DayOfWeek == 0) calcBusinessDays--; 

     return calcBusinessDays; 
    } 

각 DateColumn의 각 GetBusinessDays 값을 오늘부터 가져오고 싶습니다. 각 Differencecolumn에 삽입하십시오. 예를

ID Date  Difference 
1 4-22-2013 
2 4-23-2013 
3 4-24-2013 

를 들어

오늘 2013년 4월 28일이다 날짜 가정합니다. 차이는 각각 6, 5, 4를 포함해야합니다. 내가 지금 수행했지만 그렇지 :(

 myDatabaseConnection.OpenConnection(); 
     mySqlCommand.CommandType = CommandType.Text; 
     mySqlCommand.CommandText = "select * from Table1 where Difference IS Null"; 
     SqlDataReader sqlreader = mySqlCommand2.ExecuteReader(); 

     int i; 

     while (sqlreader.Read()) 
     { 
      i = sqlreader.GetInt32(0); 
      double y = GetBusinessDays(sqlreader.GetDateTime(1), DateTime.Now); 
      string commandtext = "Update Table1 SET Difference = " + y + " Where ID = " + i + " "; 
      mySqlCommand.CommandText = " " + commandtext + " "; 
     } 
     myDatabaseConnection.CloseConnection(); 

답변

1

먼저 작동하고 무엇보다도, 당신은 mySqlCommand.ExecuteNonQuery()를 호출 누락 된 것으로 나타납니다. 즉, 당신의 while 루프 내부에 가야한다, 당신이 할당 후 어떤

이를 당신이 결과 집합을 통해 반복으로 SqlDataReader으로 existing one is being used가. 나는 또한 0123을 사용하여 항상 추천으로 mySqlCommand.CommandText.

는 또한, 업데이트 쿼리에 대한 별도의 SqlCommand 객체를 사용해야합니다. 이 두 가지 점을 퍼팅 : 그 너머

SqlCommand myUpdateCmd = new SqlCommand("Update [Table1] SET [Difference] = @Difference Where [ID] = @ID", myDatabaseConnection); 
myUpdateCmd.Parameters.AddWithValue("@ID", i); 
myUpdateCmd.Parameters.AddWithValue("@Difference", (int)y); 
myUpdateCmd.ExecuteNonQuery(); 

을, 여기 당신이 도움이 될 수있는 몇 가지 제안 사항입니다 : 당신은 차이 열이 처음 NULL 될 것이라고 가정 할 것으로 보인다

,하지만 당신은 보이지 않았다 Table1에 대한 정확한 정의. 차이 열에 NULL 값이 허용되고 기본값이 설정되어 있지 않거나 기본값이 NULL임을 확인하십시오.

열의 순서가 맞는지 확인하려면 다음 중 하나를 수행하는 것이 좋습니다.

  1. select 쿼리에서 열 이름을 지정

    select [id], [date], [difference] from [Table1] where [difference] is null 
    
  2. SqlDataReader을 통해 열의 값을 검색 할 때, 하드 코드 열의 순서를 (할 0, 1, 2,. ..). 대신 GetOrdinal() 메서드를 사용하여 열의 서수를 동적으로 결정하십시오. 예를 들어 :

    i = sqlreader.GetInt32(sqlreader.GetOrdinal("id")); 
    

거의 모든 ADO.NET 개체의 IDisposable이다. 따라서 일반적으로 C#의 using 문을 사용하면 이러한 개체를 정리할 수 있습니다.

using (SqlConnection myDatabaseConnection = new SqlConnection("DB connection string goes here")) 
{ 
    myDatabaseConnection.Open(); 

    using (SqlCommand mySqlCommand = new SqlCommand("select [id], [difference], [date] from [Table1] where [difference] is null", myDatabaseConnection)) 
    using (SqlDataReader sqlreader = mySqlCommand.ExecuteReader()) 
    using (SqlCommand myUpdateCmd = new SqlCommand("update [Table1] set [difference] = @difference where [id] = @id", myDatabaseConnection)) 
    { 
     int i; 

     myUpdateCmd.Parameters.Add("@id", SqlDbType.Int); 
     myUpdateCmd.Parameters.Add("@difference", SqlDbType.Int); 

     while (sqlreader.Read()) 
     { 
      i = sqlreader.GetInt32(sqlreader.GetOrdinal("id")); 
      double y = GetBusinessDays(sqlreader.GetDateTime(sqlreader.GetOrdinal("date")), DateTime.Now); 
      myUpdateCmd.Parameters["@id"].Value = i; 
      myUpdateCmd.Parameters["@difference"].Value = (int)y; 
      myUpdateCmd.ExecuteNonQuery(); 
     } 
    } 
} 

업데이트 : 함께 이러한 모든 포인트를 퍼팅

using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString)) 
{ 
    // code that uses myDatabaseConnection goes here 
} 

, 우리와 끝까지 Karlx 그는 자신의 응용 프로그램이 작동합니다 전에 데이터베이스 연결에 Multiple Active Result Sets 수 있도록해야한다고 언급했다. 이렇게하려면 "MultipleActiveResultSets = True"를 데이터베이스 연결 문자열에 추가하십시오.

+0

좋습니다. 시도해 보겠습니다. databaseConnection을 닫지 않는 것이 괜찮습니까? –

+0

데이터베이스 연결 개체가 IDisposable 인터페이스 (SqlConnection 않습니다)를 구현하는 한 실행이'using' 블록의 끝 (이 경우에는 가장 바깥 쪽 사용 블록)에 도달하면 닫힙니다. –

+0

오류 "이미 닫혀 있어야하는이 명령과 연결된 열린 DataReader가 이미 있습니다". executenotquery 전에 sqlreader.close를 추가합니다. 단 하나의 행이 업데이트되고 "리더가 닫히면 Read를 호출하는 동안 잘못된 시도가 발생했습니다." –