c# - 如果不手动运行 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 工具中手动提交才能看到更改。
感谢任何愿意提供帮助的人。
解决方案
如果您的解决方法(解决方案)是在 ISQL 中手动提交,那么问题是您在 ISQL 中有一个活动事务(并且在您启动 ISQL 后立即启动)。此事务无法看到 ISQL 中的事务启动后提交的事务的更改(即:程序中的更改)。
默认情况下,ISQL 以 SNAPSHOT 隔离级别启动事务(这在某种程度上相当于 SQL 标准 REPEATABLE READ)。如果您希望 ISQL 能够看到您的程序所做的更改,您需要将其隔离级别放松为 READ COMMITTED,或者 - 正如您已经发现的 - 您需要显式提交(因此使用新事务)。
例如,要将 ISQL 切换为使用 READ COMMITTED,您可以使用以下语句:
set transaction read committed record_version;
这只会更改当前会话的事务设置。
有关详细信息,请参阅
推荐阅读
- sql - Join 或 Where 子句的 IF 条件条件
- amazon-web-services - AWS DynamoDB 查询和排序
- c++ - C++ - 尝试在类中使用全局时“不是类或命名空间”
- angular - 从 Angular 5 中的 url 下载图像
- c# - 如何将 .NET aspx 文件从一台计算机上的项目移动到另一台计算机上的同一项目
- python - 如何在 Python 中显示熊猫系列?
- android - 如何在 OpenGL ES 2.0 中渲染透明纹理
- kubernetes - 资源使用自定义代码、Kubernetes、Service Fabric 的经验法则
- azure - azure data factory - 如何修剪 CopyData 的空白
- java - 返回类的名称,它是 Pair<>