如果不手动运行commit命令,将无法看到数据库中的更改

时间:2019-04-01 12:56:23

标签: c# firebird

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

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

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

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工具中手动提交才能看到更改。

感谢愿意提供帮助的人。

1 个答案:

答案 0 :(得分:4)

如果您的解决方法(解决方案)是在ISQL中手动提交,则问题在于您在ISQL中有一个活动事务(并且一旦启动ISQL,就会启动一个事务)。此事务看不到ISQL中的事务启动后提交的事务所做的更改(即,程序中的更改)。

默认情况下,ISQL以SNAPSHOT隔离级别(在某种程度上等同于SQL标准REPEATABLE READ)启动事务。如果希望ISQL能够查看程序所做的更改,则需要放宽其隔离级别为READ COMMITTED,或者-如已经发现的那样-您需要显式提交(以便使用新事务)。 / p>

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

"

这只会更改当前会话的交易设置。

有关详细信息,请参见