微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用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 举报,一经查实,本站将立刻删除。