手动运行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