Question

J’ai consulté le site Web SQLTeam, mais j’ai maintenant un nouveau problème car j’ai une colonne IDENTITY et leur exemple ne le fait pas.

J'ai SQL Server 2008 et VS 2008. J'essaie d'exécuter le SP InsertPIF en utilisant C # et une table UDT, mais j'obtiens une exception. J'ai consulté un site Web SQLTeam exemple avec un tableau UDT, mais leur exemple n’a pas de colonne d’identité comme le mien.

Cependant, leur exemple de table n'a pas de colonne d'identité comme la mienne. Ce que j'essaie de faire devrait être simple. J'ai essayé de nombreuses variantes, mais essentiellement:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable SELECT strRow FROM @InputFileParam
GO

CREATE TABLE [dbo].[ParentTable](
    [ParentID] [int] IDENTITY(1,1) NOT NULL,
    [strInput] [varchar](8000) NULL,
PRIMARY KEY NONCLUSTERED 
(...)

et tapez:

CREATE TYPE [dbo].[parseInputFile] AS TABLE(
    [NumCols] [int] IDENTITY(1,1) NOT NULL,
    [strRow] [varchar](500) NOT NULL,
    PRIMARY KEY CLUSTERED 
(...)

Ce que je tente de faire est d’exécuter le SP ci-dessus pour insérer de nouveaux enregistrements dans le tableau parent. Exemple:

INSERT INTO ParentTable(strInput) VALUES ('A3|BB|C|DDD')
INSERT INTO ParentTable(strInput) VALUES ('A4|GOB|BLDY|GOOK')
INSERT INTO ParentTable(strInput) VALUES ('A5|Hello|My|Darling')

Voici plus de mon code C # avant la section AppendData:

DataTable dt = new DataTable();
String[] header = myStringArray[0].Split('|');

DataRow dr = dt.NewRow();
DataColumn dc = new DataColumn();
dc.DataType = typeof(Int32);
dc.ColumnName = “NumCols”;
dc.AutoIncrement=true;
dt.Columns.Add(dc);

DataColumn dc2 = new DataColumn();
dc2.DataType = typeof(string);
dc2.ColumnName = “strRow”;
dt.Columns.Add(dc2);
dr["NumCols"] = 1;
dr["strRow"] = "AA|BBB|CC|DD|E";
dt.Rows.Add(dr);

...
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "dbo.InsertPIF";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                SqlParameter param = cmd.Parameters.AddWithValue("@InputFileParam", SqlDbType.Structured);

        param.Value = dt;
        conn.Open();
        RowsAffected = cmd.ExecuteNonQuery();

J'ai activé l'identité pour ParentTable, mais il me semble que je dois l'exécuter à chaque session. Je ne sais donc pas comment supprimer l'exigence d'identité ou faire en sorte que l'identité reste active. Exception:

INSERT dans une colonne d'identité non autorisée sur les variables de table. Les données du paramètre de table '@InputFileParam' ne sont pas conformes au type de table du paramètre.

Comment puis-je exécuter ce SP?

Était-ce utile?

La solution

Je pense que Roland est sur la bonne voie - le problème réside certainement dans les colonnes IDENTITY. Étant donné que votre table cible ultime contient déjà une colonne IDENTITY qui sera automatiquement remplie pour vous, il est recommandé de ne pas spécifier la même colonne dans le type de table défini par l'utilisateur (et de ne pas déclarer de clé primaire sur le type de table):

CREATE TYPE [dbo].[parseInputFile] AS TABLE
    ([strRow] [varchar](500) NOT NULL)

Ensuite, dans votre code C #, configurez simplement un DataTable avec une seule colonne:

DataTable dt = new DataTable();

DataColumn dc = new DataColumn();
dc.DataType = typeof(string);
dc.ColumnName = “strRow”;
dt.Columns.Add(dc);

puis ajoutez vos colonnes à votre DataTable " dt " - avec seulement la chaîne & "; strRow &";

Dans votre procédure stockée appelée avec le type de table défini par l'utilisateur, insérez simplement vos chaînes:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
  INSERT INTO dbo.ParentTable(strInput)
    SELECT strRow FROM @InputFileParam
GO

Cela devrait le faire, j'espère! (je n'ai pas eu le temps de le tester moi-même)

Marc

Autres conseils

D'accord, je n'ai pas encore travaillé avec les télévisions, donc je peux me tromper - mais d'après ce que j'ai lu, & amp; contexte général SS, je pense que votre problème est le suivant:

Votre table permanente a une colonne Identity. SS veut donc la gérer pour vous. Vous pouvez définir l'insertion d'identité, mais ce n'est pas une bonne idée ....

Une chose à essayer est de spécifier la colonne à insérer dans votre SP:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable (strInput) SELECT strRow FROM @InputFileParam
GO

L’autre chose à examiner, comme Tim Lentine l’a suggéré (pendant que j’écrivais cette réponse), est de savoir si vous allez réellement sur le serveur. Puisque vous avez défini la colonne NumCols dans votre DataTable comme AutoIncrement, il se peut que vous obteniez votre exception dans le code C #, à l'adresse:

...
dr["NumCols"] = 1;
...

< modifier >

Je ne sais pas ce que je pensais quand j'ai cliqué sur Soumettre ...

Si tel est le cas, essayez d’omettre l’incrémentation automatique lorsque vous créez votre DataTable. Si les types de données de la colonne sont cohérents, cette propriété ne devrait pas avoir d’importance lorsque vous alignez le TVP comme étant & "Le même &"; en tant que type SS.

< / edit >

L'erreur provient-elle plutôt de la table parseInputFile? NumCols est défini comme un champ d'identification, mais dans le code C #, vous définissez la valeur de l'enregistrement sur 1.

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