使用c#和sql提交数据库后的错误结果

clj7thdc  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(384)

我们所有的积垢都有 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个以上的类属性,那就太费时了。另外,有些属性不是由用户输入的,而是从数据库中检索的,取决于输入的另一个属性。
我想知道你们中的一些人是否也遇到了这个问题。任何帮助都将不胜感激。谢谢您。
(已编辑)

u5i3ibmn

u5i3ibmn1#

你需要更好地解释你正在尝试做什么,以及你的程序背后的实际代码是什么

contextBase.Samples.FromSql

至少,根据你的(不完整的)描述,以下似乎是相关的。

从基复制到父级。

我尝试过手动设置返回值,例如。 query.Code = data.Code 但是如果我有10个以上的类属性,那就太费时了。
请阅读此处已建议的解决方案。你将最终定义一个 Map 扩展和使用

query.Map(data);

以上应该可以解决您的实际问题,但您的问题中还有其他不一致之处,可能会影响结果。

sql语句 procCRUD 是存储过程:

SET @SQL = 'SELECT TOP 1 * FROM Sample '
    EXEC SP_EXECUTESQL @SQL
END
GO

在存储过程的末尾,您正在管理一个select来返回正确的值,但是-据我所知-您缺少正确的where条件,比如 WHERE ID=@ID (或 Status='Float' ,我不知道你的应用程序逻辑)。
顺便说一下,你应该 Commit() 在一个开始的谈话之后,但这在你的问题中没有表现出来。

xam8gpfp

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没有这样的特性。

相关问题