2011-03-27 7 views
4

세상에, 나는 약간의 문제가 있습니다.
1)) 데이터베이스
2에서 예술가의 목록을 읽어 그 작가 및 저장에 의해 작성된 모든 트랙을 찾기 : 아니, 이건 아니다 '숙제'DataReader는 행을 반환하지 않습니다. 행은 데이터베이스에 있습니다.

나는 두 가지 작업을 수행해야하는 몇 가지 코드를 가지고 그것을 위해 나중에

내가 뭘하는지 :
1) SELECT ArtistID FROM artists 내 아티스트의 목록을 가져옵니다. 내가 수동으로 ArtistID을 지정하면 두 번째 선택 문이 성공
: 나는 DataReader 사용하여 List<string> 데이터 타입에서 그것을 구축 등
2) SELECT count(*) as track_numbers from tracks WHERE ArtistID = @ArtistID 그렇게 큰

내 문제 작동하지 않습니다 좋은 작품 (예 : SELECT count(*) as track_numbers FROM Tracks WHERE ArtistID = 0 작동)하지만 내 목록을 반복 할 경우 항상 0 개의 결과가 반환됩니다. 내가 커넥터를 사용하고

/네트 6.3.6, 비주얼 스튜디오 2010 (모든 업데이트), .NET 4.0 클라이언트 프로파일, 의 MySQL 커뮤니티 서버 5.5.9 64, 윈도우 7 홈 프리미엄 x64

가 나는 시도했다 :

  • ArtistID 순 내 쿼리 문자열을 구축하는 문자열 연결을 사용하여
  • 다음 문자열로 int를 ArtistID 순 캐스팅
  • 다음, 그 반대의
  • 재 배열 매개 변수가 정의되는 경우, 넣어 값,

관련 명령 텍스트 (내 생각) 아래 코드 :

List<string> list = new List<string>(); 
Hashtable table = new Hashtable(); 
DbProviderFactory factory = DbProviderFactories.GetFactory(setting.ProviderName); 
using (DbConnection conn = factory.CreateConnection()) 
{ 
conn.ConnectionString = setting.ConnectionString; 
conn.Open(); 

using (DbCommand cmd = conn.CreateCommand()) 
{ 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "SELECT ArtistID FROM artists;"; 
    using (DbDataReader reader = cmd.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      list.Add(reader["ArtistID"].ToString()); //this works, and I can iterate no problem through this list 
     } 
    } 
} 

using (DbCommand cmd = conn.CreateCommand()) 
{ 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "SELECT count(*) as counts FROM tracks WHERE ArtistID = @ArtistID;"; 
    //cmd.CommandText = "SELECT count(*) as counts FROM tracks WHERE ArtistID = 0;"; <-- this line works 


    DbParameter param = cmd.CreateParameter(); 
    param.ParameterName = "@ArtistID"; 

    foreach (string artist in list) 
    { 
     param.Value = artist; 
     cmd.Parameters.Add(param); 
     using (DbDataReader reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       Console.WriteLine(artist + "\t" + reader["counts"]); //reader["counts"] is always '0' 
      } 
      cmd.Parameters.Clear(); 
     } 
    } 
} 

}

데이터베이스 테이블 형식은 다음과 같습니다 아티스트가 하나 개의 값/키 ArtistID 불렀다 입력 int
개 트랙은 세 개의 열, TrackID (int, pk), artistid (int), albumid(int)

어떤 제안이? 감사.

+0

루프를 시작하기 전에'HasRows' 속성을 확인할 수 있습니까? 데이터 소스에서 검색이 실제로 작동하는지 또는 잘못된지 확인하십시오. –

답변

0

cmd.Parameters.Add(param); 전화를 삭제해야한다고 생각합니다. 각 반복마다 새로운 매개 변수가 추가됩니다. 기존 매개 변수에 매번 매개 변수 값을 설정하는 것만으로 충분합니다.

0
foreach (string artist in list) 
{ 
    param.Value = artist; 
    cmd.Parameters.Add(param) 

당신은하는 모든 아티스트의 매개 변수를 다시 추가 -이 전혀 작동 놀랐어요, 확실히이 SqlParameter 아니해야 - DbParameter이 같은 방식으로 작동하는 경우는 다음과 같이해야한다 :

cmd.Parameters.Add(param); 
foreach (string artist in list) 
{ 
    param.Value = artist; 
0

다른 시간 동안 벽에 머리를 부딪 히고 후, 나는 문제가 발견 : 나는 2를 추측 할 수없는 이유로 '클린 솔루션') 어떻게 든 외래 키 관계는 보장을 할 필요가 1)이있다 실제로 예술가의 예술가와 일치하는 트랙의 예술가였습니다. ts 나는 어떻게 든 망쳐 놓을 수 있었다

나는 실제로 큰 바보이다.

위의 대답은 내 문제를 해결하지 못했지만 C#에 대해 새로운 것을 가르쳐 주었기 때문에 첫 번째 포스터에 공헌했습니다.

관련 문제