【问题标题】:How can I fill a data table with a URI datatype column from SQL?如何使用 SQL 中的 URI 数据类型列填充数据表?
【发布时间】:2017-05-03 08:20:52
【问题描述】:

我创建了一个数据表,其中一列被指定为类型 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);

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

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

【问题讨论】:

    标签: c# sql-server datatable uri sqldataadapter


    【解决方案1】:

    如果它可以帮助其他人,我已经找到了解决此问题的方法。您可以处理数据适配器上的 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 自动生成的网格列一起使用。

    【讨论】:

    • 不是很优雅,因为 SQL 中的数据排序、数据表和错误处理逻辑本身都存在依赖关系,这在某种程度上破坏了自动生成列的意义,并且会使它比我更混乱'希望表结构是否发生变化,但可能有一些方法可以使其更通用。此外,如果您期望每一行都出现错误,那真的是一个好的设计吗?但至少这是一个可能的解决方案......
    【解决方案2】:

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

    【讨论】:

    • System.ArgumentException 未处理 HResult=-2147024809 消息=值类型与列类型不匹配无法在 MarketPlaceHomeUri 列中存储 renderosity.com>。预期类型是 Uri。
    • 以上是我的错误,来自我文件中的第一条记录。我看到堆栈交换已将错误消息中的文本转换为链接。在原始原始文本中,它是一个完整的 URL,当复制到浏览器地址栏中时有效,并且包含完整的 http:\\ 前缀
    • 如果我按照代码中的第一个虚拟示例将记录“手动”添加到数据表中,则如果值为 DBNull.Value 或者我显式转换为 URI 对象,则它可以工作,这使得感觉。我怀疑 Fill 方法没有转换字符串,我想知道我是否可以/是否可以说服它这样做。
    • 例如// 这种“手动”方法有效 _tblMarketPlaces.Rows.Add(1, "Renderosity", "Renderosity", new Uri("renderosity.com/"), 1); // 这失败了(这就是我认为 Fill 正在做的事情) _tblMarketPlaces.Rows.Add(2, "Renderosity", "Renderosity", "renderosity.com", 2); - 努力使堆栈交换编辑器不尝试将我的文本转换为此处的链接,因此您必须相信真正的文字是正确的链接。
    • 在将其放入数据表之前先将其转换为单独的变量怎么样?
    猜你喜欢
    • 2019-03-11
    • 2019-01-29
    • 2016-07-31
    • 2018-06-02
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多