我正在尝试将要插入的数据保存到本地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工具中手动提交才能看到更改。
感谢愿意提供帮助的人。
答案 0 :(得分:4)
如果您的解决方法(解决方案)是在ISQL中手动提交,则问题在于您在ISQL中有一个活动事务(并且一旦启动ISQL,就会启动一个事务)。此事务看不到ISQL中的事务启动后提交的事务所做的更改(即,程序中的更改)。
默认情况下,ISQL以SNAPSHOT隔离级别(在某种程度上等同于SQL标准REPEATABLE READ)启动事务。如果希望ISQL能够查看程序所做的更改,则需要放宽其隔离级别为READ COMMITTED,或者-如已经发现的那样-您需要显式提交(以便使用新事务)。 / p>
例如,将ISQL切换为使用READ COMMITTED,可以使用语句:
"
这只会更改当前会话的交易设置。
有关详细信息,请参见