如何使用 SQL 中的 URI 数据类型列填充数据表?

Posted

技术标签:

【中文标题】如何使用 SQL 中的 URI 数据类型列填充数据表?【英文标题】:How can I fill a data table with a URI datatype column from SQL? 【发布时间】: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 中显式格式化列,但我想在那里使用自动生成的列,如果只有我可以加载数据,这似乎是可能的进入数据表]

【问题讨论】:

【参考方案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); - 努力使堆栈交换编辑器不尝试将我的文本转换为此处的链接,因此您必须相信真正的文字是正确的链接。 在将其放入数据表之前先将其转换为单独的变量怎么样?

以上是关于如何使用 SQL 中的 URI 数据类型列填充数据表?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 pandas 数据框中的数据类型填充 NaN 值?

在sql中有个表a,有一列名为b的数据如bb,后面有几个空格,所以数据都是,怎么批量删除数据后面的空格?

如何使用对称密钥加密和解密 SQL Server 中的整数数据类型列

如何根据excel中的另一个单元格值自动填充两个不同列中的数据

如何在SSIS中的每一行中生成具有不同数据类型的固定宽度文件

如何仅显示 SQL 数据库中 DataGrid 中的某些列?