Comment puis-je exécuter une requête sur un ensemble de données qui renvoie différentes colonnes à la table?

StackOverflow https://stackoverflow.com/questions/528776

Question

Je suis en train de tirer des données à partir d'une table SQL dans mon jeu de données en utilisant C #.

Dans ce cas, je ne suis pas besoin de toutes les colonnes à quelques Ones spécifiques, mais comme je ne suis pas déboitant une colonne obligatoire NOT NULL, la copie de la table est de lancer l'exception

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

Je suis sûr que je peux contourner ce problème en retournant la colonne unNullable à ma table mais je veux éviter le retour des données inutiles.

La requête J'utilise ce qui génère cette exception est

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

Ceci exclut la colonne obligatoire « tblLocationID ». En réalité cependant, cette colonne est obligatoire seulement lorsque l'on considère la base de données dans son ensemble, et non pas quand je juste besoin de construire et les détails de logiciel pour une utilisation dans ma forme.

Je suis en train d'utiliser cette requête de la manière suivante.

private DataTable dtDevice;

dtDevice = taDevice.GetDataByDeviceSN_ForRestage(txtDeviceSerial.Text);

Je remarque lorsque vous naviguez sur les données de prévisualisation, Visual Studio dessine des colonnes qui ne sont pas spécifiées dans mon SQL, y compris la colonne tblLOcationID il ne porte toutefois pas remplir ces colonnes avec des données.

Y at-il de toute façon je peux utiliser ces données dans une table temporaire sans importer l'aspect non annulable de la colonne? de préférence en ne tirant throught les colonnes non sélectionnées tout?



Pour être complet, voici la définition (- moins les définitions clés étrangères) de la table source:

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]
Était-ce utile?

La solution

Je suppose taDevice est un TableAdapter? généré avec l'ensemble de données typé?

Vous pouvez également générer la méthode « FillDataByDeviceSN » (vous pouvez générer un Get et un remplissage)

vous obtenez (code pseudo-ish):

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

Autres conseils

La colonne est obligatoire car les métadonnées indique au client d'ajouter des nouvelles lignes (ou de modifier les lignes), les valeurs de cette colonne doivent être fournies. Si vous ne modifions pas les données et ne nécessitent pas la cartographie dans les deux sens, quelque chose de plus léger comme un DataReader pourrait être plus approprié.

Voici quelques options:

Créer un « jeu de données typées » uniquement pour les champs que vous souhaitez utiliser.

ou

Modifiez la propriété NullValue du champ NOT NULL dans votre ensemble de données typé de la valeur par défaut « exception throw » à « vide ».

ou

Essayez ce que Patrick a suggéré de fixer les EnforceConstraints sur False.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top