gpt4 book ai didi

c# - 无法将参数值从 Binary 转换为 Byte[]。 -- 带有 SQL 时间戳参数的 SqlDataSource

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:31 25 4
gpt4 key购买 nike

首先,不幸的是我无法更改数据库并寻找“时间紧迫”的解决方案。我意识到我要求的不是最佳实践,而是足够的免责声明...

  1. MS SQL Server
  2. C#/.NET 4.xx
  3. 网络表单
  4. dbo.MyTable -- 不允许应用程序直接访问表
  5. dbo.MyTable_[OP] CRUD 存储过程系列(_GET、_INSERT、_UPDATE 等)
  6. MyTable 有一个名为“ts”的时间戳列

在适当的情况下,CRUD 过程都包含一个输入/输出参数 @ts 以避免并发问题。

我正在使用 DevExpress WebForms GridView - 工作完美,不是问题。

GridView 使用的是 MS SqlDataSource。它的选择命令正在调用 MyTable_List 过程。它的插入命令调用 MyTable_Insert 过程。这两个都可以完美地工作。

更新不是。已经启动并完成了网络,试图弄清楚这是否可能。所以更新基本上是这样的:

SQL:

CREATE PROC MyTable_Update
@key int
@name varchar(100)
@ts timestamp output
AS
IF (SELECT TOP 1 1 FROM MyTable WHERE key = @key and ts = @ts) IS NULL
BEGIN
RAISEERROR('someone else changed this, reload, try again, 00, 00);
RETURN;
END
--[simple update the table logic]
SELECT @ts = ts FROM MyTable WHERE key = @key

数据源:

<asp:SqlDataSource id="ds" runat="server" ... OnUpdating="ds_Updating" UpdateCommand="MyTable_UPDATE" UpdateCommandType="StoredProcedure">
<UpdateParameters>
<asp:Parameter Name="key" Type="Int32" />
<asp:Parameter Name="name" Type="String" />
<asp:Parameter Direction="InputOutput" Name="ts" Type="String" DefaultValue="0" /> <!-- i know, bear with me -->
</UpdateParameters>
</asp:SqlDataSource>

C#:

protected void myGrid_StartRowEditing(object sender, [DevEx].ASPxStartRowEditingEventArgs e)
{
//get the timestamp value from the db for this row being edited
int key = (Int32)myGrid.GetRowValuesByKeyValue(e.EditingKeyValue, "key");
var ts = db.MyTable_Get(key).First().ts; //actually getting the ts from the database
Session["MyTable_ts"] = ts;
}

protected void ds_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
//override what was set in the aspx
var p = e.Command.Parameters["@ts"];
p.DbType = Binary;
p.Direction = ParameterDirection.InputOutput;
p.Size = 8;
var ts = (System.Data.Linq.Binary)Session["MyTable_ts"];
p.Value = ts;
}

最后,当我开始编辑网格中的一行时,StartRowEditing 触发,按预期将时间戳值从数据库保存到 session 变量中(显然 .NET 中的格式与 SQL 中的格式不同)。当我尝试提交更改(单击 DevEx 网格编辑器上的“更新”)时,ts_Updating 触发,所有代码无一异常(exception)地完成。然后当 SqlDataSource 触发实际更新时,它抛出“无法将参数值从a Binary to a Byte[]."到 DevEx 网格并通过网格的 UI 报告。

我如何(甚至可能吗?)将数据库时间戳值混洗到 session 中,然后通过 SqlDataSource 更新参数发送它?

再次,我意识到我可以通过写出所有 CSLA 或什至只使用 ObjectDataSource 并写出所有更新逻辑来克服这个问题,但是我时间紧迫,只需要完成并移动一些网格on -- 项目中有更大的鱼要炸。

谢谢!

最佳答案

想通了 - 太简单了,我忽略了它。 System.Data.Linq.Binary 的 ToArray() 将转换为 Byte[]。在函数的最后一行将 .ToArray() 添加到 ts 将转换为 SqlDataSource 可以传回数据库的适当类型,允许时间戳值匹配,通知数据库没有并发问题。

protected void ds_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
//override what was set in the aspx
var p = e.Command.Parameters["@ts"];
p.DbType = Binary;
p.Direction = ParameterDirection.InputOutput;
p.Size = 8;
var ts = (System.Data.Linq.Binary)Session["MyTable_ts"];
p.Value = ts.ToArray(); //Binary must be cast to an Array (of Byte)
}

关于c# - 无法将参数值从 Binary 转换为 Byte[]。 -- 带有 SQL 时间戳参数的 SqlDataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54142278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com