加载 DataTable 时使用默认列值以避免 Null

     2023-05-08     250

关键词:

【中文标题】加载 DataTable 时使用默认列值以避免 Null【英文标题】:Use default column values when loading DataTable to avoid Nulls 【发布时间】:2013-07-10 20:11:36 【问题描述】:

我有一个 xsd 数据集架构,它允许我为 DataTable 定义一个结构。对于每一列,我都设置了一个默认值,因此在构造新行时,我得到实例化值(“”代表字符串,0 代表整数)而不是 DbNull

我想在以下两个方法调用中使用DataTable.LoadSqlDataAdapter.Fill 时保留它

Dim table1 As New CodeSetSchemas.EntityByRoleDataTable()
Using reader As SqlDataReader = cmd.ExecuteReader()
    table1.Load(reader)
End Using

Dim table2 As New CodeSetSchemas.EntityByRoleDataTable()
Using adapter As New SqlDataAdapter(cmd)
    adapter.Fill(table2)
End Using

但是当这些方法中的任何一个创建新行时,它们实际上会将数据库中的 DbNull 写入该行。如果我将每列上的AllowDBNull 属性设置为False,则会出现以下异常:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

有没有办法在填充 DataTable 时保留每行的默认值?

【问题讨论】:

【参考方案1】:

我也遇到了这个问题。不幸的是,DataTable.Load 或 SqlDataAdapter.Fill 绕过了 xsd 数据集架构中所需的默认值。加载或填充后需要使用代码填写默认值。

当使用加载或填充时,您实际上并没有创建新行本身;您正在从其他地方获取行。即使 SQL 实际上是动态创建行也是如此。

比事后使用代码修复数据表更好的解决方案是将填充或加载中的 SQL 更改为使用 IsNull(x, 0) 或 IsNull(x, '')。

【讨论】:

谢谢。在这种情况下,我真的不能轻松访问 SQL。我已经发布了一些我认为可以解决问题的工作;如果您再次遇到该问题,希望它对您也有帮助。【参考方案2】:

这并没有专门使用加载或填充,但您可以通过读取数据读取器并仅在传入值不为空时设置值来轻松完成此操作。通过从SqlDataReader 获取SchemaTable,您仍然可以保持加载或填充命令的简单性,而不必写出每个列名。通过添加一个名为 Load 的 Extension 方法,该方法采用默认行参数,您可以在自己实现功能的同时保留 Load 函数的外观和感觉

使用默认行参数加载扩展方法:

''' <summary>
''' Fills a <c>System.Data.DataTable</c> with values from a data source using the supplied <c>System.Data.SqlDataReader</c>.<br/>
''' Each row is new row is given the default values from the new row and incoming nulls are ignored
''' </summary>
''' <param name="dt">DataTable to fill</param>
''' <param name="reader">A <c>System.Data.SqlDataReader</c> that provides a result set.</param>
''' <param name="defaultRow">Default values for each DataRow</param>
''' <remarks></remarks>
<Extension()> _
Public Sub Load(ByVal dt As DataTable, ByVal reader As SqlDataReader, ByVal defaultRow As DataRow)
    Dim newRow As DataRow
    'get incoming data fields
    Dim columns As List(Of String)
    columns = reader.GetSchemaTable.AsEnumerable _
                    .Select(Function(r) CStr(r("ColumnName"))).ToList()

    While reader.Read()
        'make new row and set default item array
        newRow = dt.NewRow()
        newRow.ItemArray = defaultRow.ItemArray
        'copy over new values
        For Each col As String In columns
            If Not IsDBNull(reader(col)) Then newRow(col) = reader(col)
        Next
        dt.Rows.Add(newRow)
    End While
End Sub

像这样调用你的加载方法:

Dim roleTable As New CodeSetSchemas.EntityByRoleDataTable()
Using reader As SqlDataReader = cmd.ExecuteReader()
    roleTable.Load(reader, roleTable.NewEntityByRoleRow())
End Using

【讨论】:

排除列值以“836”开头的记录

...奏效,因为我仍在找回以“836”开头的索赔号码。我试过使用NOTLIKE和NOTIN。能否告知我做错了什么?我包括查询和我的 查看详情

胶水加载作业不保留红移中的默认列值

】胶水加载作业不保留红移中的默认列值【英文标题】:Glueloadjobnotretainingdefaultcolumnvalueinredshift【发布时间】:2021-03-2503:35:33【问题描述】:我有一个Glue作业,将S3中的CSV加载到红移表中。有1列(updated_date)未映射。该列的默认值... 查看详情

ExtJS 4 - 当列编辑器是组合框时如何避免网格列值变为空?

...问题描述】:我在网格中有一个列,编辑器作为组合框。加载网格后,所有列值都会正确显示。问题是,当用户单击列(将组合框作为编辑器)进行编辑时,列值变为空,如所附屏幕截图所示。 查看详情

使用 TABS 时 DataTable.js 无法正确加载

】使用TABS时DataTable.js无法正确加载【英文标题】:DataTable.jsdoesn\'tloadproperlywhenusingTABS【发布时间】:2019-07-0510:27:00【问题描述】:我使用DataTables.js来生成表格。这很棒,工作正常。我想将选项卡添加到我的“页面”中,但似乎... 查看详情

避免在 Redshift 上仅向日期时间字段提供时间时使用默认日期值

...我创建了一个带有日期时间字段“dt”的表。使用COPY命令加载数据。文件中字段的对应值只是小时信息,例如,14:50:00。因此,存储的 查看详情

如何在末尾使用空列值对 C# Datatable 进行排序

】如何在末尾使用空列值对C#Datatable进行排序【英文标题】:HowtosortC#Datatablewithemptycolumnvaluesattheend【发布时间】:2020-07-2906:46:47【问题描述】:我有一个包含1000行的C#数据表。但主要的200行有空值(多列)。过滤器会发生在这些... 查看详情

根据 C#2.0 中的列值过滤 DataTable 行

】根据C#2.0中的列值过滤DataTable行【英文标题】:FilterDataTablerowsbasedonacolumnvalueinC#2.0【发布时间】:2020-03-0614:06:49【问题描述】:我有一个包含n行/列的数据表。我想根据只有一个字符值为“*”的列过滤行。我的版本是C#2.0。如... 查看详情

在使用 oracle apex 加载数据时,我应该查找其他表以匹配 id 并提取列值

】在使用oracleapex加载数据时,我应该查找其他表以匹配id并提取列值【英文标题】:Whiledataloadingusingoracleapexishouldlookuptoothertableformatchingidandpullacolumnvalue【发布时间】:2015-10-0116:45:48【问题描述】:我正在使用OracleApex4.2构建应用... 查看详情

jquery.datatable插件如何不自动加载数据?

参考技术A$(window).load(function()$('#managertable').dataTable("bServerSide":true,"bAutoWidth":true,"bStateSave":false,//保存状态到cookie******很重要,当搜索的时候页面一刷新会导致搜索的消失。使用这个属性设置为true就可... 查看详情

使用 DataTable 将数据加载到 DataGridView 的进度条

】使用DataTable将数据加载到DataGridView的进度条【英文标题】:ProgressbarforloadingdatatoDataGridViewusingDataTable【发布时间】:2013-08-2500:41:20【问题描述】:我有一个DataGridView,我在其中从SQL服务器数据库加载数据。当我加载数据时,它... 查看详情

您如何修改默认值以接受 Y 或 N 而不仅仅是 SQL 中的 Y

】您如何修改默认值以接受Y或N而不仅仅是SQL中的Y【英文标题】:HowdoyoumodifythedefaulttoacceptYorNnotjustYinSQL【发布时间】:2015-05-0301:00:36【问题描述】:我正在尝试修改现有表的列中的默认值,但它不起作用。我在其他网站上进行... 查看详情

如何从 bootstrap-vue-select 控件中设置值以在表单加载时预选?

】如何从bootstrap-vue-select控件中设置值以在表单加载时预选?【英文标题】:Howtosetvaluefrombootstrap-vue-selectcontroltobepre-selectedonformload?【发布时间】:2018-12-1513:20:38【问题描述】:我正在使用VueJS,或者更准确地说是Bootsrap-Vue(selectfo... 查看详情

我可以使用联锁操作来更新多个值以避免锁定关键部分/互斥锁吗?

】我可以使用联锁操作来更新多个值以避免锁定关键部分/互斥锁吗?【英文标题】:CanIuseinterlockedoperationstoupdatemultiplevaluestoavoidlockingacriticalsection/mutex?【发布时间】:2009-06-1120:01:57【问题描述】:我有一个多线程应用程序(C++),... 查看详情

聚合列值以在 python/pyspark 中创建一个新列

】聚合列值以在python/pyspark中创建一个新列【英文标题】:aggregatecolumnvaluestocreateanewcolumninpython/pyspark【发布时间】:2019-10-1019:05:47【问题描述】:我有一个数据集,我想创建一个新列,其中包含id出现的平均年龄和每个id的性别... 查看详情

熊猫填充列值以具有其他列的相似值

】熊猫填充列值以具有其他列的相似值【英文标题】:Pandasfillcolumnvaluestohavesimilarvaluesofothercolumn(s)【发布时间】:2020-12-2716:24:34【问题描述】:我有一个日期列,其中包含每一分钟的时间序列数据。我想更新我的所有其他列以每... 查看详情

避免页面重新加载以及使用 Javascript/JQuery 重新加载时 [重复]

】避免页面重新加载以及使用Javascript/JQuery重新加载时[重复]【英文标题】:AvoidpagereloadandwhenpressreloadusingJavascript/JQuery[duplicate]【发布时间】:2021-12-1501:57:07【问题描述】:我正在创建一个考试应用程序,我希望用户在参加考试... 查看详情

JQuery Datatable - 放置自定义加载 GIF 而不是默认的“处理”文本

】JQueryDatatable-放置自定义加载GIF而不是默认的“处理”文本【英文标题】:JQueryDatatable-PlacingacustomloadingGIFinsteadofdefault"Processing"text【发布时间】:2017-05-1520:28:02【问题描述】:我正在使用当前版本的JQuery数据表。我已经... 查看详情

c#datatable按照两列排序当a列值相等时,再按照b列排序

用datatable的select方法,只能对一列排序,两列怎么实现呢不用sql文在代码中实现谢谢~datatable排序这个思路就错了如果数据量小于1万还行,大于这个值运行会很慢推荐让sql处理后显示而且你不可能一次性显示要分页读取不是吗?如... 查看详情