2017-05-03 1 views
0

1つの列がタイプURIとして指定されているデータテーブルを作成しました。これは後で、テーブルをWPFのグリッドにバインドするためのソースとして使用し、ハイパーリンクを使用してグリッド列を自動生成するためです。このデータテーブルをSQL Serverデータベースからどのように埋めることができますか?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として認識されていないので、最後の充填文が失敗したということです。私はデータアダプターにデータを変換するよう説得することができますか?

[私はdatatableを単にフィールドのテキストを使用して、私のWPF Xamlで明示的に列をフォーマットすることになりますが、自動生成された列を使用したいと思います。データをデータテーブルに入れる]

答えて

0

私はこの問題が他の誰かに役立つ場合、この問題の解決策を見つけました。データアダプタのFillエラーを処理して、デフォルトのfillメカニズムをオーバーライドして途中でデータ型を修正することができます。私の場合は

私はこれを追加しました: -

sdaMarkePlace.FillError += new FillErrorEventHandler(FillError); 

、これ、一緒にトリックをやっている...

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; 
     } 
    } 

私はそれを想定しているため、上記のロジックは完璧ではありません実現すべてのFill引数の例外は、必ずしも真実ではない可能性があるURIの問題によるものですが、もう少し微調整すれば包括的な解決策を得ることができます。今すぐWPF自動生成グリッド列でうまく動作します。

+0

SQL、データテーブル、エラー処理ロジック自体のデータの順序付けに依存するため、あまりエレガントではないので、最初に列を自動生成する点を多少弱めてしまい、テーブル構造変更することができますが、多少一般的にする方法があります。また、すべての行でエラーが発生することを期待している場合は、それは本当に良いデザインですか?しかし、少なくとも可能な解決策です... – DMFW

0

MarketPlaceHomeUriに入れたいURIの例を提供できますか?おそらく、それはURI検証要件(あなたがtypeof(Uri)と呼ぶ部分)に適合しないかもしれません。 URIを可能な限り完全なものにします(http://wwwなど)。

+0

System.ArgumentExceptionが処理されていません HResult = -2147024809 メッセージ=値の型が列の型と一致しませんをMarketPlaceHomeUri列に格納できませんでした。予想されるタイプはUriです。 – DMFW

+0

上記は私のファイルの最初のレコードにある私のエラーです。スタック交換がエラーメッセージのテキストをリンクに変換しているのが分かります。元の生のテキストでは、ブラウザのアドレスバーにコピーされ、完全なhttp:\\プレフィックス – DMFW

+0

を含む完全なURLです。コード内の最初のダミーの例に従ってデータテーブルに "手動で"レコードを追加すると、値がDBNull.Valueの場合、またはURIオブジェクトとして明示的にキャストした場合には意味があります。私はFillメソッドが文字列をキャストしていないと思うし、もし私がそれを行うように納得できるかどうか、私は疑問に思います。例えば、 – DMFW

関連する問題