Vra

Ek het na die SQLTeam-webwerf gekyk, maar het nou 'n nuwe probleem omdat ek 'n IDENTITEIT-kolom het en hul voorbeeld nie.

Ek het SQL Server 2008 en VS 2008.Ek probeer om die InsertPIF SP uit te voer met C# en 'n tabel UDT, maar kry 'n uitsondering.Ek het gekyk na 'n voorbeeld van SQLTeam -webwerf met 'n tabel UDT, maar hul voorbeeld het nie 'n identiteitskolom soos myne nie.

Hul voorbeeldtabel het egter nie 'n identiteitskolom soos myne nie.Wat ek probeer doen, moet eenvoudig wees.Ek het baie verskillende variasies hiervan probeer, maar in wese:

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

waar

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

en tik:

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

Wat ek probeer doen is om die bogenoemde SP uit te voer om nuwe rekords in die ouertabel in te voeg.Voorbeeld:

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')

Hier is meer van my C#-kode voor die AppendData-afdeling:

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();

Ek stel identiteit om aangeskakel te word vir die ParentTable, maar dit lyk of ek dit elke sessie moet uitvoer, so ek is nie seker hoe om identiteitsvereiste te verwyder of anders om identiteit aan te hou nie.Uitsondering:

INSERT in 'n identiteitskolom wat nie toegelaat word op tabelveranderlikes nie.Die data vir tabelwaarde-parameter '@InputFileParam' stem nie ooreen met die tabeltipe van die parameter nie.

Hoe voer ek hierdie SP uit?

Was dit nuttig?

Oplossing

Ek dink Roland is op die regte pad - die identiteit kolomme beslis is die probleem. Sedert jou uiteindelike doel tafel reeds 'n identiteit kolom wat automagically sal gevul word vir julle, sou ek aanbeveel nie spesifiseer dieselfde kolom in jou gebruiker-gedefinieerde tafel tipe (en ook nie verklaar 'n primêre sleutel op die tafel tipe):

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

Toe ek in jou C # kode, net die opstel van 'n DataTable met 'n enkele kolom:

DataTable dt = new DataTable();

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

en voeg dan jou kolomme om jou DataTable "dt" -. Met net die een string "strRow"

In jou gestoor processed wat dan kry geroep met jou gebruiker-gedefinieerde tafel tipe, steek net jou snare:

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

Dit moet dit doen, hoop ek! (Het nie die tyd om dit te toets moes myself)

Marc

Ander wenke

Goed, ek het eintlik nog nie met TVP's gewerk nie, so ek kan verkeerd wees - maar uit my leeswerk en algemene SS-agtergrond het ek dink jou probleem is dit:

Jou permanente tabel het 'n Identiteit-kolom, so SS wil dit vir jou hanteer.Jy kan stel Identity Insert aan, maar dit is nie 'n goeie idee nie....

Een ding om te probeer is om die kolom te spesifiseer om in jou SP in te voeg:

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

Die ander ding om na te kyk, soos Tim Lentine voorgestel het (terwyl ek hierdie antwoord geskryf het), is of jy werklik by die bediener uitkom of nie.Aangesien jy die NumCols-kolom in jou DataTable as AutoIncrement gedefinieer het, kan dit wees dat jy jou uitsondering in die C#-kode kry, by:

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

<wysig>

Weet nie wat ek gedink het toe ek Submit...

As dit die geval is, probeer om die AutoIncrement uit te laat wanneer jy jou DataTable skep.As die kolom datatipes konsekwent is, moet hierdie eienskap nie saak maak wanneer die TVP as "dieselfde" as die SS-tipe ingestel word nie.

< /wysig>

Kan die fout kom uit die parseInputFile tafel plaas? NumCols word gedefinieer as 'n identifiseer veld, maar in die C # kode wat jy die opstel van die waarde van die rekord aan 1.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top