Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将值传递给表值参数时忽略标识列_C#_.net_Sql Server_Database_Table Valued Parameters - Fatal编程技术网

C# 将值传递给表值参数时忽略标识列

C# 将值传递给表值参数时忽略标识列,c#,.net,sql-server,database,table-valued-parameters,C#,.net,Sql Server,Database,Table Valued Parameters,我尝试将值传递给存储过程的表值参数,如下所示: DataTable Entries = new DataTable(); Entries.Columns.Add("InfoID", typeof (int)); Entries.Columns.Add("InfoValue", typeof (string)); foreach(FormInfoValue entry in FormEntries) { Entries.Rows.Add(entry.InfoID, entry.InfoVa

我尝试将值传递给存储过程的表值参数,如下所示:

DataTable Entries = new DataTable();
Entries.Columns.Add("InfoID", typeof (int));
Entries.Columns.Add("InfoValue", typeof (string));
foreach(FormInfoValue entry in FormEntries) {
    Entries.Rows.Add(entry.InfoID, entry.InfoValue);
}
DataSet res = ExecuteStoredProcedure("SaveData", new SqlParameter[] {
    new SqlParameter() {
        DbType = DbType.String, ParameterName = "@FormID", Value = FormID
    },
    new SqlParameter() {
        SqlDbType = SqlDbType.Structured, ParameterName = "@InfoValues", Value = Entries
    },
    new SqlParameter() {
        DbType = DbType.Int32, ParameterName = "@UserID", Value = Security.SessionControl.GetSession().UserID
    }
});
return int.Parse(res.Tables[0].Rows[0][0].ToString());
DECLARE @FormData TABLE (
    ID INT IDENTITY(1,1) NOT NULL,
    InfoID INT NULL,
    InfoValue NVARCHAR(MAX) NULL
    )
INSERT INTO @FormData(InfoID,InfoValue) SELECT [InfoID],[InfoValue] FROM @InfoValues
        WHILE (1 = 1)
        BEGIN
            EXEC [dbo].OpenKeys
            SELECT TOP 1 @iid = [ID], @id = InfoID, @value = InfoValue FROM @FormData WHERE [ID] > @iid ORDER BY [ID]
            -- Exit loop if no more info values
            IF @@ROWCOUNT = 0 BREAK;

            INSERT INTO [InfoValues]([InfoID],[Value],[UserID],[DateAdded],[DateUpdated]) 
            VALUES(@id,[dbo].ENCRYPTDATA(@value),@UserID,GETDATE(), GETDATE()); 
            SET @retID = SCOPE_IDENTITY();
            INSERT INTO EVMap(EntryID, ValueID) VALUES(@EntryID, @retID)
        END
但问题是表值参数@InfoValues有一个额外的列,即identity。我在存储过程的逻辑中使用该列。但在C语言中,它抛出了一个例外:在@InfoValues中有3列而不是2列。如何通过忽略此表值参数中的标识列来传递值

更新

我尝试使用临时表作为解决方案,如下所示:

DataTable Entries = new DataTable();
Entries.Columns.Add("InfoID", typeof (int));
Entries.Columns.Add("InfoValue", typeof (string));
foreach(FormInfoValue entry in FormEntries) {
    Entries.Rows.Add(entry.InfoID, entry.InfoValue);
}
DataSet res = ExecuteStoredProcedure("SaveData", new SqlParameter[] {
    new SqlParameter() {
        DbType = DbType.String, ParameterName = "@FormID", Value = FormID
    },
    new SqlParameter() {
        SqlDbType = SqlDbType.Structured, ParameterName = "@InfoValues", Value = Entries
    },
    new SqlParameter() {
        DbType = DbType.Int32, ParameterName = "@UserID", Value = Security.SessionControl.GetSession().UserID
    }
});
return int.Parse(res.Tables[0].Rows[0][0].ToString());
DECLARE @FormData TABLE (
    ID INT IDENTITY(1,1) NOT NULL,
    InfoID INT NULL,
    InfoValue NVARCHAR(MAX) NULL
    )
INSERT INTO @FormData(InfoID,InfoValue) SELECT [InfoID],[InfoValue] FROM @InfoValues
        WHILE (1 = 1)
        BEGIN
            EXEC [dbo].OpenKeys
            SELECT TOP 1 @iid = [ID], @id = InfoID, @value = InfoValue FROM @FormData WHERE [ID] > @iid ORDER BY [ID]
            -- Exit loop if no more info values
            IF @@ROWCOUNT = 0 BREAK;

            INSERT INTO [InfoValues]([InfoID],[Value],[UserID],[DateAdded],[DateUpdated]) 
            VALUES(@id,[dbo].ENCRYPTDATA(@value),@UserID,GETDATE(), GETDATE()); 
            SET @retID = SCOPE_IDENTITY();
            INSERT INTO EVMap(EntryID, ValueID) VALUES(@EntryID, @retID)
        END

这种方法有效吗?

我当然不能测试它,但它至少可以解析。下面是一个使用输出而不是循环的示例。这假设一些变量已经定义,并且您将@InfoValues作为表值参数接收

EXEC[dbo].OpenKeys 插入[InfoValues] [InfoID] ,[价值] ,[UserID] ,[已添加日期] ,[日期更新] OUTPUT@EntryID-我假设这是在代码中的其他地方设置的 ,INSERTED.RetID-或InfoValues中标识的任何列 输入EVMapEntryID、ValueID 选择InfoID ,[dbo].ENCRYPTDATAInfoValue ,@UserID-我假设这是在代码中的其他地方设置的 ,GETDATE ,GETDATE 来自@InfoValues
为什么不将您的过程更改为使用行号而不是标识?@SeanLange为此,我想我需要更改很多代码。我可以使用包含主键的临时表吗?首先将数据插入临时表,然后在处理过程中使用它?这是可能的。如果不知道你的过程做什么,很难说什么是最好的/最简单的方法。@SeanLange我用存储过程代码更新了我的问题。看一看。据我所知,你需要这个ID的唯一原因是跟踪你的循环?如果是这样的话,你最好使用光标,那么这个ID就不需要了。非常感谢@SeanLange。你是救命恩人