gpt4 book ai didi

c# - 如何在 C# 中执行表 SP

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:31 25 4
gpt4 key购买 nike

我查看了 SQLTeam 网站,但现在遇到了一个新问题,因为我有一个 IDENTITY 列,而他们的示例没有。

我有 SQL Server 2008 和 VS 2008。我正在尝试使用 C# 和表 UDT 执行 InsertPIF SP,但出现异常。我看过一个 SQLTeam 网站使用表 UDT 的示例,但他们的示例没有像我的那样的标识列。

但是,他们的示例表没有像我的那样的标识列。我想做的应该很简单。我已经尝试了很多不同的变体,但本质上:

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

然后输入:

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 打开,但似乎我必须在每个 session 中执行此操作,所以我不确定如何删除身份要求或保持身份在。异常:

INSERT 到表变量上不允许的标识列。表值参数“@InputFileParam”的数据不符合参数的表类型。

如何执行此 SP?

最佳答案

我认为 Roland 走在正确的轨道上 - IDENTITY 列绝对是问题所在。由于您的最终目标表已经有一个 IDENTITY 列,它将自动为您填充,我建议您不要在您的用户定义表类型中指定相同的列(也不要在表类型上声明主键):

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

然后在您的 C# 代码中,设置一个只有一列的数据表:

DataTable dt = new DataTable();

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

然后将您的列添加到数据表“dt”中 - 仅使用一个字符串“strRow”。

在您的存储过程中,然后使用您的用户定义的表类型调用,只需简单地插入您的字符串:

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

我希望这应该能做到! (还没有时间自己测试)

马克

关于c# - 如何在 C# 中执行表 SP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1002269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com