如何使用来自 SQL 的 URI 数据类型列填充数据 table?
How can I fill a data table with a URI datatype column from SQL?
我创建了一个数据table,其中一列被指定为类型 URI。这是因为我后来想使用 table 作为绑定到 WPF 中的网格的源,自动生成带有超链接的网格列。如何从我的 SQL 服务器数据库中填充此数据table?
这是我的示例代码:-
_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 转换填充中的数据吗?
[我知道另一种方法是让数据table 简单地为字段使用文本,然后在我的 WPF Xaml 中显式格式化该列,但我想在那里使用自动生成的列如果我可以将数据加载到数据中,这似乎是可能的 table]
能否提供一个要放入 MarketPlaceHomeUri 的 URI 示例?也许它不符合 URI 验证要求(您调用 typeof(Uri) 的部分)。使 URI 尽可能完整(使用 http://www. 或其他内容)。
如果对其他人有帮助,我已经找到了解决这个问题的方法。您可以处理数据适配器上的 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 自动生成的网格列一起使用。
我创建了一个数据table,其中一列被指定为类型 URI。这是因为我后来想使用 table 作为绑定到 WPF 中的网格的源,自动生成带有超链接的网格列。如何从我的 SQL 服务器数据库中填充此数据table?
这是我的示例代码:-
_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 转换填充中的数据吗?
[我知道另一种方法是让数据table 简单地为字段使用文本,然后在我的 WPF Xaml 中显式格式化该列,但我想在那里使用自动生成的列如果我可以将数据加载到数据中,这似乎是可能的 table]
能否提供一个要放入 MarketPlaceHomeUri 的 URI 示例?也许它不符合 URI 验证要求(您调用 typeof(Uri) 的部分)。使 URI 尽可能完整(使用 http://www. 或其他内容)。
如果对其他人有帮助,我已经找到了解决这个问题的方法。您可以处理数据适配器上的 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 自动生成的网格列一起使用。