質問
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に設定しています。