C# 如果不手动运行commit命令,则无法查看数据库中的更改

C# 如果不手动运行commit命令,则无法查看数据库中的更改,c#,firebird,C#,Firebird,我正试图将插入的数据保存到本地Firebird数据库中 我试着在C代码中运行一个sql命令,包含commit插入数据后,但它似乎不起作用。信息已发送,但数据库未保存 这是我用来插入数据的代码 FbConnectionStringBuilder csb = new FbConnectionStringBuilder { DataSource = "localhost", Port = 3050,

我正试图将插入的数据保存到本地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工具中手动提交以查看更改

感谢所有愿意提供帮助的人。

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

默认情况下,ISQL使用快照隔离级别(这在某种程度上相当于SQL标准的可重复读取)启动事务。如果您希望ISQL能够看到您的程序所做的更改,那么您要么需要放松其隔离级别以读取COMMITTED,要么——正如您已经发现的那样——您需要显式提交(以便使用新事务)

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

设置事务读取提交记录\u版本;
这将仅更改当前会话的事务设置

有关详细信息,请参阅


非常感谢您的解释。我会尽量放松隔离级别。还感谢您发布的statement。只需添加一点信息,您必须在每次打开ISQL工具时运行上面的语句。@Adrian Yes,ISQL将始终默认为SNAPSHOT;我已经明确指出,它只适用于当前会话。是否有默认设置可以启用它?只是出于好奇。@Adrian不,ISQL中没有这方面的设置。请注意,
fbcommit…
部分代码是不必要的。如果在C#中执行而不开始事务,则事务将自动提交。如果您确实开始了一个事务,那么您应该使用
FbTransaction
对象进行提交,而不是执行提交语句。是的,我只是在尝试随机解决方案。谢谢,我会把它去掉的。