2017-05-03 1 views
0

하나의 열이 유형 URI로 지정된 데이터 테이블을 만들었습니다. 이는 나중에 테이블을 WPF의 그리드에 바인딩하기위한 소스로 사용하고 하이퍼 링크가있는 그리드 열을 자동 생성하기 때문입니다. SQL Server 데이터베이스에서이 datatable을 채우려면 어떻게해야합니까?SQL의 URI 데이터 유형 열을 사용하여 데이터 테이블을 채우려면 어떻게해야합니까?

가 여기 내 예제 코드입니다 : -

_tblMarketPlaces = new DataTable("MarketPlaces"); 
_tblMarketPlaces.Columns.Add("MarketPlaceID"); 
_tblMarketPlaces.Columns.Add("MarketPlaceIdentifier"); 
_tblMarketPlaces.Columns.Add("MarketPlaceName"); 
_tblMarketPlaces.Columns.Add("MarketPlaceHomeUri",typeof(Uri)); 
_tblMarketPlaces.Columns.Add("DisplayPriorityOrder"); 

_tblMarketPlaces.Clear(); 

_tblMarketPlaces.Rows.Add(0, "N/A", "Unknown", DBNull.Value, 0); 

SqlConnection DB = ArtContentManager.Static.Database.DBReadOnly; 
string sqlSelectMarketPlaces = "Select * from MarketPlaces Order By DisplayPriorityOrder"; 
SqlCommand cmdSelectMarketPlaces = new SqlCommand(sqlSelectMarketPlaces, DB); 

SqlDataAdapter sdaMarkePlace = new SqlDataAdapter(cmdSelectMarketPlaces); 
sdaMarkePlace.Fill(_tblMarketPlaces); 

문제는 MarketPlaceHomeUri의 데이터 유형은 데이터베이스에 NVARCHAR이며, URI로 인식되지 않기 때문에 마지막 채우기 문이 실패합니다. 채우기의 데이터를 변환하도록 DataAdapter를 설득 할 수있는 방법이 있습니까?

[다른 접근법은 단순히 필드에 텍스트를 사용하고 내 WPF Xaml에서 명시 적으로 형식을 지정하는 것이지만 자동 생성 된 열을 사용하고 싶습니다. 데이터를 데이터 테이블로]

답변

0

다른 사람들에게 도움이된다면이 문제에 대한 해결책을 찾았습니다. 데이터 어댑터에서 채우기 오류를 처리하고 기본 채우기 메커니즘을 재정의하고 도중에 데이터 유형을 고치는 작업을 할 수 있습니다.

private static void FillError(object sender, FillErrorEventArgs args) 
    { 
     Uri rowURI; 

     if (args.Errors.GetType() == typeof(System.ArgumentException)) 
     { 
      if (Uri.IsWellFormedUriString(args.Values[3].ToString(), UriKind.Absolute)) 
      { 
       // The URI is valid. This should be ensured in the database update but don't assume it is for defensive coding reasons 
       rowURI = new Uri(args.Values[3].ToString()); 
       DataRow myRow = args.DataTable.Rows.Add(new object[] 
       {args.Values[0], args.Values[1], args.Values[2], rowURI, args.Values[4]}); 
      } 
      else 
      { 
       // The URI is invalid. Update with a Null value for that field 
       DataRow myRow = args.DataTable.Rows.Add(new object[] 
      {args.Values[0], args.Values[1], args.Values[2], DBNull.Value, args.Values[4]}); 
      } 

      args.Continue = true; 
     } 
    } 

가 나는 그것이 가정하기 때문에 위의 논리가 완벽하지 실현 함께 속임수를 썼는지

sdaMarkePlace.FillError += new FillErrorEventHandler(FillError); 

이 ... - 내 경우

나는이 추가 모든 Fill 인수 예외는 항상 사실 일 수는없는 URI 문제로 인한 것이지만 조금 더 조정하면 포괄적 인 해결책을 얻을 수 있습니다. 이제 WPF 자동 생성 된 그리드 열과 잘 호환됩니다.

+0

SQL, 데이터 테이블 및 오류 처리 논리 자체에서 데이터 정렬에 종속되어 있으므로 처음에는 열 자동 생성의 요점을 다소 약화시키고 테이블 구조 (예 : 변경되지만, 좀 더 일반적인 것으로 만드는 방법이있을 수 있습니다. 또한 모든 행에 대해 오류가 발생할 것으로 예상된다면 정말 좋은 디자인입니까? 하지만 적어도 가능한 해결책은 ... – DMFW

0

MarketPlaceHomeUri에 넣으려는 URI의 예를 제공 할 수 있습니까? 어쩌면 URI 검증 요구 사항 (typeof (Uri)을 호출하는 부분)과 일치하지 않을 수도 있습니다. 가능한 한 완전한 URI를 만드십시오 (http://www 또는 그와 함께).

+0

System.ArgumentException 처리되지 않았습니다. HResult = -2147024809 메시지 = 값 유형이 열 유형과 일치하지 않습니다. MarketPlaceHomeUri 열에 을 저장할 수 없습니다. 예상 유형은 Uri입니다. – DMFW

+0

위의 내용은 내 파일의 첫 번째 레코드에있는 내 오류입니다. 스택 교환이 오류 메시지의 텍스트를 링크로 변환 한 것을 봅니다. 원래 원시 텍스트에서 브라우저 주소 표시 줄에 복사 할 때 작동하는 전체 URL이고 전체 http : \\ 접두어가 포함되어 있습니다 – DMFW

+0

코드의 첫 번째 더미 예제에 따라 데이터 테이블에 "수동으로"레코드를 추가하면, 값이 DBNull.Value이거나 URI 객체로 명시 적으로 캐스팅하면 작동합니다. 필자는 Fill 메서드가 문자열을 캐스팅하지 않는다고 생각하며 어떻게해야하는지 확신 할 수 있는지 궁금합니다. – DMFW

관련 문제