我创建了一个数据表,其中一列被指定为类型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中显式格式化列,但我想在那里使用自动生成的列,如果只有我可以加载数据这似乎是可能的进入数据表]
答案 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自动生成的网格列。