我们所有的积垢都有 CommitTransaction()
在返回方法的结果之前结束。例如,我们有一个方法 Create()
如果没有具有 Status: 'Float'
. 否则,它将选择该记录并更新其内容。
这是在数据库中签入的。问题是,该方法返回的是以前的数据,而不是更新的数据:
public class Sample
{
public int ID {get; set;}
public string Code {get;set;}
public decimal Total {get; set;}
}
在 Create()
, Code
以及 Total
由应更新数据库中数据的用户输入。
例如
ID | Code | Total
1 | CodeName | 100
用户更新
Code : 'Code1'
Total : 200
但是方法仍然返回
Code : 'CodeName '
Total : 100
但如果签入数据库,它已经
ID | Code | Total
1 | Code1 | 200
我观察到只有当 CommitTransaction()
不建议删除,但也需要正确的数据返回。
这是一个简化的 Create()
:
private string procCRUD = "procCreate @ID={0},@Code={1},@Total={2}";
public Sample Create(Sample data)
{
IQueryable<ComponentType> query = contextBase.Samples.FromSql(procCRUD,"create",data.ID, data.Code, data.Total); // contextBase.Samples is the DbContext
commit(); // this commits the transaction
return query;
}
proccrud是一个存储过程:
DROP PROCEDURE IF EXISTS procCreate
GO
CREATE PROCEDURE procCreate
@proc varchar(20) = 'create',
@ID bigint = 0,
@Code varchar(20)= NULL,
@Total int= 0
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL varchar(MAX)
SET @SQL = ''
IF (@proc='create') BEGIN
IF (NOT EXISTS(SELECT ID FROM Sample WHERE Status='Float'))
BEGIN
INSERT INTO Sample(Code, Total) VALUES( @Code, @Total)
SET @ID = @@IDENTITY;
END
ELSE
BEGIN
SELECT @ID=ID FROM Sample WHERE Status='Float'
UPDATE Sample SET
Code = @Code
,Total = @Total
WHERE ID=@ID
END
END
SET @SQL = 'SELECT TOP 1 * FROM Sample '
EXEC SP_EXECUTESQL @SQL
END
GO
我尝试过手动设置返回值,例如。 query.Code = data.Code
但是如果我有10个以上的类属性,那就太费时了。另外,有些属性不是由用户输入的,而是从数据库中检索的,取决于输入的另一个属性。
我想知道你们中的一些人是否也遇到了这个问题。任何帮助都将不胜感激。谢谢您。
(已编辑)
2条答案
按热度按时间u5i3ibmn1#
你需要更好地解释你正在尝试做什么,以及你的程序背后的实际代码是什么
至少,根据你的(不完整的)描述,以下似乎是相关的。
从基复制到父级。
我尝试过手动设置返回值,例如。
query.Code = data.Code
但是如果我有10个以上的类属性,那就太费时了。请阅读此处已建议的解决方案。你将最终定义一个
Map
扩展和使用以上应该可以解决您的实际问题,但您的问题中还有其他不一致之处,可能会影响结果。
sql语句
procCRUD
是存储过程:在存储过程的末尾,您正在管理一个select来返回正确的值,但是-据我所知-您缺少正确的where条件,比如
WHERE ID=@ID
(或Status='Float'
,我不知道你的应用程序逻辑)。顺便说一下,你应该
Commit()
在一个开始的谈话之后,但这在你的问题中没有表现出来。xam8gpfp2#
你的描述没有任何意义。根据你的说法,你:
做一个选择
提交事务
返回值
不知道返回的值和数据库中的值不匹配吗?
如果要在运行更新或插入操作时检索值,sql中唯一可靠的语法是输出:https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql
从受insert、update、delete或merge语句影响的每一行返回信息或基于这些信息的表达式。这些结果可以返回给处理应用程序,用于确认消息、存档和其他此类应用程序需求。结果也可以插入到表或表变量中。此外,您可以在嵌套的insert、update、delete或merge语句中捕获output子句的结果,并将这些结果插入到目标表或视图中。
例如,如果你想得到你刚插入的东西的主键,
OUTPUT Inserted.ID
是唯一可靠工作的方法。不幸的是,大多数非mssql dbms没有这样的特性。