Как выполнить запрос к набору данных, который возвращает разные столбцы таблицы? - PullRequest
0 голосов
/ 09 февраля 2009

Я пытаюсь получить некоторые данные из таблицы SQL в моем наборе данных, используя C #.

В этом случае мне не нужны все столбцы, только несколько конкретных, однако, поскольку я не возвращаю столбец с обязательным значением 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]

Ответы [ 3 ]

1 голос
/ 09 февраля 2009

Я предполагаю taDevice такое табличный адаптер? сгенерированный с набранным набором данных?

Вы также можете сгенерировать метод "FillDataByDeviceSN" (вы можете сгенерировать Get и Fill)

тогда вы получите (псевдо-код):

tblDeviceDataTable dtService = new tblDeviceDataTable();
dtService.tblLocationID.AllowDbNull = true;
taDevice.FillDataByDeviceSN(dtService,txtDeviceSerial.Text);
0 голосов
/ 09 февраля 2009

Вот несколько вариантов:

Создайте «нетипизированный набор данных» только для полей, которые вы хотите использовать.

OR

Измените свойство NullValue поля NOT NULL в набранном наборе данных со значения по умолчанию «throw исключение» на «пусто».

OR

Попробуйте то, что Патрик предложил для установки EnforceConstraints на False.

0 голосов
/ 09 февраля 2009

Столбец является обязательным, поскольку метаданные сообщают клиенту, что для добавления любых новых строк (или изменения строк) необходимо указать значения для этого столбца. Если вы не изменяете данные и не нуждаетесь в двустороннем сопоставлении, может быть более подходящим что-то более легкое, например DataReader.

...