list<listitem>
アプリケーションに、ストアド プロシージャに渡すメソッドがあります。渡すテーブル型のデータ型を作成しましたlist<listitem>
。ここで、ストアド プロシージャをループして別のテーブルに挿入する必要があります。その目的のために、自動的に生成されるテーブル タイプに行 ID 列を作成しました。
テーブル型には 2 つの列があるため、外部から 2 つのパラメーターが渡されることが期待されますが、ID 列によって生成しています。値フォームを外部に渡さないようにする方法はありますか?
public void test(List<string> listItem) {
var table = new DataTable();
table.Columns.Add("col1", typeof(string));
foreach (string col1 in listItem) { table.Rows.Add(col1); }
SqlCommand cmd1 = new SqlCommand("TableTypeUpdateAnswers", conn);
cmd1.CommandType = CommandType.StoredProcedure;
SqlParameter sqlParam = cmd1.Parameters.AddWithValue("@tvpUpdateAnswers",table);
sqlParam.SqlDbType = SqlDbType.Structured ;
sqlParam.TypeName = "dbo.AnswerTableType";
conn.Open();
try
{ }
catch (Exception e)
{ }
}
テーブル タイプを作成する SQL は次のとおりです。
CREATE TYPE [dbo].[AnswerTableType] AS TABLE(
RowID int not null primary key identity(1,1),
[col1] [nvarchar](50) NULL
)
そして、ストアドプロシージャは次のとおりです。
ALTER PROCEDURE [dbo].[TestTableType]
@TVPUPDATEANSWERS DBO.ANSWERTABLETYPE READONLY
AS
DECLARE
@CURRENTROW INT,
@VANSID int ,
@ROWSTOPROCESS INT
BEGIN
SET @CURRENTROW=0
SELECT L.col1 FROM @TVPUPDATEANSWERS L;
SET @ROWSTOPROCESS=@@ROWCOUNT
WHILE @CURRENTROW<@ROWSTOPROCESS
BEGIN
SET @CURRENTROW=@CURRENTROW+1
(SELECT @VANSID = col1
FROM @TVPUPDATEANSWERS
WHERE ROWID=@CURRENTROW);
//do something with table type datatype
INSERT INTO DBO.table1(col3,col4)
VALUES(@VANSID ,@col4);
END
END