数据库
首页 > 数据库> > 手动运行commit命令无法看到数据库中的更改

手动运行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 Tool中手动提交才能看到更改.

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

解决方法:

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

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

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

set transaction read committed record_version;

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

有关详细信息,请参见

> Firebird 2.5 Language Reference, Transaction Statements
> ISQL, Transaction Handling

标签:firebird,c
来源: https://codeday.me/bug/20191024/1922762.html