我有一个存储过程,其中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。对这个问题的任何见解都会有所帮助。提前谢谢。
1条答案
按热度按时间7fyelxc51#
我使用了时间戳扩展方法。我最后做的是:
添加了timestamp类
声明了以下字节数组:
byte[] rowVersionInBytes = (Timestamp)rowVersion;
在SqlParameter
定义,我替换了行版本转换:这给了我正确的转换。感谢开发人员编写了timestamp.cs扩展,感谢@grax32为我指明了正确的方向。
更新:
或者我可以这样做:
BitConverter.GetBytes(Convert.ToUInt64(rowVersion)).Reverse().ToArray()
这给了我同样的结果。