如何从SQL填充带有URI数据类型列的数据表?

时间:2017-05-03 08:20:53

标签: c# sql-server datatable uri sqldataadapter

我创建了一个数据表,其中一列被指定为类型URI。这是因为我后来想要使用该表作为绑定到WPF中网格的源,自动生成带有超链接的网格列。如何从我的SQL Server数据库填充此数据表?

以下是我的示例代码: -

 _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);

问题是最后一个fill语句失败,因为MarketPlaceHomeUri的数据类型在数据库上是nvarchar,并且不被识别为URI。有没有什么方法可以说服DataAdapter转换填充数据?

[我知道另一种方法是让数据表只是为字段使用文本,然后在我的WPF Xaml中显式格式化列,但我想在那里使用自动生成的列,如果只有我可以加载数据这似乎是可能的进入数据表]

2 个答案:

答案 0 :(得分:0)

您能提供一个您想要放入MarketPlaceHomeUri的URI的示例吗?也许它不符合URI验证要求(您调用typeof(Uri)的部分)。使URI尽可能完整(使用http://www。或其他)。

答案 1 :(得分:0)

如果它可以帮助其他人,我找到了解决这个问题的方法。您可以在数据适配器上处理填充错误,并自行执行操作以覆盖默认填充机制并修复数据类型。

就我而言,我补充说: -

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自动生成的网格列。