質問

SQLTeam Webサイトを見ましたが、IDENTITY列があり、その例にはないため、新しい問題が発生しています。

SQL Server 2008とVS 2008があります。C#とテーブルUDTを使用してInsertPIF SPを実行しようとしていますが、例外が発生しています。 SQLTeamウェブサイトを見ました テーブルUDTを使用した例ですが、その例には私のようなID列はありません。

ただし、サンプルテーブルには、私のようなID列はありません。 私がやろうとしていることは簡単なはずです。私はこれの多くの異なるバリエーションを試しましたが、本質的に:

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

where

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

および入力:

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

私がやろうとしているのは、上記のSPを実行して、ParentTableに新しいレコードを挿入することです。例:

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

AppendDataセクションの前のC#コードの詳細を次に示します。

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

ParentTableに対してIDをオンに設定しましたが、この各セッションを実行する必要があるようです。例外:

テーブル変数で許可されていないID列への挿入。テーブル値パラメーター '@InputFileParam'のデータは、パラメーターのテーブルタイプに適合していません。

このSPを実行するにはどうすればよいですか

役に立ちましたか?

解決

ローランドは正しい軌道に乗っていると思います-IDENTITYカラムは間違いなく問題です。最終的なターゲットテーブルには既に自動的に入力されるIDENTITY列があるため、ユーザー定義のテーブルタイプで同じ列を指定しないことをお勧めします(また、テーブルタイプで主キーを宣言しないでください):

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

次に、C#コードで、1つの列を持つDataTableをセットアップします。

DataTable dt = new DataTable();

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

次に、DataTable <!> quot; dt <!> quot;に列を追加します。 -1つの文字列<!> quot; strRow <!> quot;のみ。

ユーザー定義のテーブルタイプで呼び出されるストアドプロシージャで、単に文字列を挿入するだけです:

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

それを行う必要があります、私は願っています! (これを自分でテストする時間がありませんでした)

マーク

他のヒント

さて、私は実際にまだTVPを扱ったことがないので、間違っている可能性があります。しかし、私の読書からは<!> amp;一般的なSSの背景、私はあなたの問題はこれだと考える

永続テーブルにはIdentity列があるため、SSはそれを処理したいと考えています。 Identity Insertをオンに設定できますが、それは良い考えではありません。...

試してみるべきことの1つは、SPに挿入する列を指定することです。

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

Tim Lentineが示唆したように(この答えを書いている間に)見るべきもう1つのことは、実際にサーバーにアクセスしているかどうかです。 DataTableのNumCols列をAutoIncrementとして定義しているため、次のC#コードで例外が発生している可能性があります。

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

<!> lt;編集<!> gt;

[送信]をクリックしたときに何を考えていたかわからない...

その場合は、DataTableを作成するときにAutoIncrementを省略してください。 列のデータ型が一貫している場合、TVPを<!> quot; theme <!> quot;として並べる場合、このプロパティは重要ではありません。 SSタイプとして。

<!> lt; / edit <!> gt;

代わりに、parseInputFileテーブルからエラーが発生していませんか? NumColsは識別フィールドとして定義されていますが、C#コードではレコードの値を1に設定しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top