如何将timestamp值参数从c#传递到sql

zaq34kh6  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(426)

我有一个存储过程,其中rowversion的类型是timestamp

CREATE PROCEDURE GetCoverages
    @PageStart INT = 0,
    @PageSize INT = 50000,
    @RowVersion TIMESTAMP = NULL
AS
    SELECT
        * 
    FROM
        Coverages cov
    WHERE
        @RowVersion IS NULL OR cov.RowVersion > @RowVersion
    ORDER BY 
        RowVersion 
        OFFSET @PageStart ROWS
        FETCH NEXT @PageSize ROWS ONLY   
GO

在c端,我有以下代码:

var rowVersionParam = new SqlParameter()
            {
                ParameterName = "@RowVersion",
                SqlDbType = SqlDbType.Timestamp,
                Direction = ParameterDirection.Input,
                Value = rowVersion != null ? BitConverter.GetBytes(Convert.ToInt64(rowVersion)) : (object)DBNull.Value
            };

            var prms = new SqlParameter[]
            {
                new SqlParameter("@PageStart", index),
                new SqlParameter("@PageSize", pageSize),
                rowVersionParam
            };

            var coverages = await outerRingDb.Set<SpCoverages>()
                                                .FromSqlRaw("EXEC GetCoverages @PageStart, @PageSize, @RowVersion", prms)
                                                .ToListAsync(cancellationToken);

在我的c代码中,rowversion的类型是 ulong? (可以为null)并且当我将它包括在参数集合中时,我将它转换为字节数组( byte[] )使用 BitConverter . 在调试模式下,我看到 rowVersion 参数设置为50353967。
我遇到的问题是,当我从表中获取最新的rowversion(即0x000000000300572f)时(此表用作记录保管器,用于存储上次同步时的最新rowversion),当我运行调试运行代码时,c#执行存储过程并告诉我没有记录。
当我像这样直接执行存储过程时:

EXEC GetCoverages 0, 50000, 0x000000000300572F`

sql server返回结果。
我不确定我在这里做错了什么,也不确定c如何将我的时间戳值传递给sql server。对这个问题的任何见解都会有所帮助。提前谢谢。

7fyelxc5

7fyelxc51#

我使用了时间戳扩展方法。我最后做的是:
添加了timestamp类
声明了以下字节数组: byte[] rowVersionInBytes = (Timestamp)rowVersion;SqlParameter 定义,我替换了行版本转换:

var rowVersionParam = new SqlParameter()
        {
            ParameterName = "@RowVersion",
            SqlDbType = SqlDbType.Timestamp,
            Direction = ParameterDirection.Input,
            Value = rowVersion != null ? rowVersionInBytes : (object)DBNull.Value
        };

这给了我正确的转换。感谢开发人员编写了timestamp.cs扩展,感谢@grax32为我指明了正确的方向。
更新:
或者我可以这样做: BitConverter.GetBytes(Convert.ToUInt64(rowVersion)).Reverse().ToArray() 这给了我同样的结果。

相关问题