【问题标题】:How can I run a query on a dataset that returns different columns to the table?如何对向表返回不同列的数据集运行查询?
【发布时间】:2009-02-09 16:09:36
【问题描述】:

我正在尝试使用 C# 从我的数据集中的 SQL 表中提取一些数据。

在这种情况下,我不需要所有列,只需要几个特定的​​列,但是由于我没有拉回具有强制 NOT NULL 的列,因此表的副本会引发异常

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

我确信我可以通过将 unNullable 列返回到我的表来解决这个问题,但是我想避免返回不必要的数据。

我正在使用的引发此异常的查询是

SELECT     DeviceSerialNumber, BuildID, LEMSCredentialsID, LEMSSoftwareID, OwnerID, RestagedDate
FROM         tblDevice
WHERE     (DeviceSerialNumber = @SerialNumber)

这不包括必填列“tblLocationID”。但实际上,此列仅在将数据库作为一个整体考虑时才是强制性的,而不是当我只需要在我的表单中使用构建和软件详细信息时。

我正在尝试以下列方式使用此查询。

private DataTable dtDevice;

dtDevice = taDevice.GetDataByDeviceSN_ForRestage(txtDeviceSerial.Text);

我注意到在浏览预览数据时,Visual Studio 绘制了我的 SQL 中未指定的列,包括 tblLocationID 列,但是它不会用数据填充这些列。

无论如何我可以在临时表中使用这些数据而不导入列的不可为空的方面吗?最好完全不通过未选择的列?






为了完整起见,以下是源表的定义(- 减去外键定义):

CREATE TABLE [dbo].[tblDevice](
[DeviceSerialNumber] [nvarchar](50) NOT NULL,
[Model] [nvarchar](50) NULL,
[ManufactureDate] [smalldatetime] NULL,
[CleanBootDate] [smalldatetime] NULL,
[BuildID] [int] NULL,
[Notes] [nvarchar](3000) NULL,
[AuditID] [int] NULL,
[LocationID] [int] NOT NULL,
[SimID] [int] NULL,
[LEMSCredentialsID] [int] NULL,
[LEMSSoftwareID] [int] NULL,
[OwnerID] [int] NULL,
[RestagedDate] [smalldatetime] NULL,
[Boxed] [bit] NULL,
CONSTRAINT [PK_tblDevice_1] PRIMARY KEY CLUSTERED 
([DeviceSerialNumber] ASC) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

【问题讨论】:

    标签: c# sql datatable dataset non-nullable


    【解决方案1】:

    我假设 taDevice 是一个表适配器?使用类型化数据集生成?

    您还可以生成“FillDataByDeviceSN”方法(您可以生成 Get 和 Fill)

    然后你得到(伪代码):

    tblDeviceDataTable dtService = new tblDeviceDataTable();
    dtService.tblLocationID.AllowDbNull = true;
    taDevice.FillDataByDeviceSN(dtService,txtDeviceSerial.Text);
    

    【讨论】:

    • 就可以了。非常感谢您。虽然它给我带来了全新的信心,但这是另一个问题:-)再次感谢
    【解决方案2】:

    该列是强制性的,因为元数据告诉客户端要添加任何新行(或更改行),必须提供该列的值。如果您不更改数据并且不需要双向映射,那么像 DataReader 这样更轻量级的东西可能更合适。

    【讨论】:

    • DataReader,我明天会研究一下。谢谢凯德鲁克斯
    【解决方案3】:

    这里有几个选项:

    仅为您要使用的字段创建一个“无类型数据集”。

    将类型化数据集中 NOT NULL 字段的 NullValue 属性从默认的“抛出异常”更改为“空”。

    尝试 Patrick 建议将 EnforceConstraints 设置为 False。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多