首页 > 解决方案 > 如果不手动运行 commit 命令,则无法查看数据库中的更改

问题描述

我正在尝试将要插入的数据保存到本地 Firebird 数据库中。

我试过在 C# 代码中运行一个 sql 命令,在commit;插入数据后包含,但它似乎不起作用。信息已发送,但数据库未保存它们。

这是我用于插入数据的代码。

FbConnectionStringBuilder csb = new FbConnectionStringBuilder
            {
                DataSource = "localhost",
                Port = 3050,
                Database = @"D:\db\DBUTENTI.FDB",
                UserID = "SYSDBA",
                Password = "masterkey",
                ServerType = FbServerType.Default
            };

            using (FbConnection myConn = new FbConnection(csb.ToString()))
            {
                if (myConn.State == ConnectionState.Closed)
                {
                    try
                    {
                        myConn.Open();
                        Console.WriteLine("CONNECTION OPENED");
                        string Id = txt_Id.Text;
                        string Utente = txt_User.Text;
                        string Password = txt_Password.Text;
                        FbCommand cmd = new FbCommand("insert into utenti(id,utente,password)values(@id, @utente, @password)", myConn);
                        cmd.Parameters.AddWithValue("id", Id);
                        cmd.Parameters.AddWithValue("utente", Utente);
                        cmd.Parameters.AddWithValue("password", Password);
                        cmd.ExecuteNonQuery();
                        myConn.Close();
                        Console.WriteLine("CONNECTION CLOSED");
                    }
                    catch (Exception exc)
                    {
                        Console.WriteLine(exc.Message);
                    }
                }
            }

代码运行时没有任何错误/异常,但我必须在 ISQL 工具中手动提交才能看到更改。

感谢任何愿意提供帮助的人。

标签: c#firebird

解决方案


如果您的解决方法(解决方案)是在 ISQL 中手动提交,那么问题是您在 ISQL 中有一个活动事务(并且在您启动 ISQL 后立即启动)。此事务无法看到 ISQL 中的事务启动后提交的事务的更改(即:程序中的更改)。

默认情况下,ISQL 以 SNAPSHOT 隔离级别启动事务(这在某种程度上相当于 SQL 标准 REPEATABLE READ)。如果您希望 ISQL 能够看到您的程序所做的更改,您需要将其隔离级别放松为 READ COMMITTED,或者 - 正如您已经发现的 - 您需要显式提交(因此使用新事务)。

例如,要将 ISQL 切换为使用 READ COMMITTED,您可以使用以下语句:

set transaction read committed record_version;

这只会更改当前会话的事务设置。

有关详细信息,请参阅


推荐阅读