使用TVP的批量更新只能在SSMS中使用,而不能在C#

问题描述

使用VS2019和sql Server 2019时,从C#调用时我无法获得存储过程来更新所有预期的行,它仅更新1行,即最低值。

我正在使用TVP传递多行,我想使用此值更新RunnerOdds表。因此,当MarketId和SelectionId匹配时,我想用TVP中的值追加Odds列。

使用以下命令从SSMS可以正常工作

declare @NewTableParam OddsType
insert into @NewTableParam(MarketId,SelectionId,Odds)
values ('1.172222777',16732924,'1'),('1.172222777',10227602,35610986,'3'),16764874,'16'),35537128,'2'),34000814,'9')

exec usp_RunnerOddsUpdate @OddsLines = @NewTableParam

但是当我从C#运行时,我只会更新1行。

这是TVP:

CREATE TYPE [dbo].[OddsType] AS TABLE(
    [MarketId] [nvarchar](20) NOT NULL,[SelectionId] [bigint] NOT NULL,[Odds] [nvarchar](1000) NULL
)

这是程序:

ALTER PROCEDURE [dbo].[usp_RunnerOddsUpdate]
    @OddsLines OddsType READONLY
AS
BEGIN

    update ro
    set 
        ro.Odds += ',' + ol.Odds
    from 
        @OddsLines ol
    join RunnerOdds ro on
        ro.SelectionId = ol.SelectionId and
        ro.SelectionId = ol.SelectionId

END 

这是C#ado.net :(奇数是一个列表)

        var dt = odds.ToDataTable(); // convert list object to datatable for use with TVP

        using (sqlConnection conn = sqlServerConn.GetConnection)
        {
            conn.open();

            using (sqlCommand cmd = new sqlCommand("usp_RunnerOddsUpdate",conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                var param1 = cmd.Parameters.AddWithValue("@OddsLines",dt);
                param1.sqlDbType = sqlDbType.Structured;
                param1.TypeName = "OddsType"; // TVP

                // execute query
                int numberRecordsAffected = cmd.ExecuteNonQuery();

                if (numberRecordsAffected == 0)
                {
                    return false; // Failed to insert
                }
                else
                {
                    log.Info(string.Format("Updated {0} lines",numberRecordsAffected));
                    return true;
                }
            }
        }

这可能很简单,但我听不懂。有任何想法吗?

感谢阅读。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)