C# 数据库在insert语句上被锁定
我在尝试插入sqlite数据库时遇到问题。我有两张像这样的桌子:C# 数据库在insert语句上被锁定,c#,database,sqlite,C#,Database,Sqlite,我在尝试插入sqlite数据库时遇到问题。我有两张像这样的桌子: CREATE TABLE user(UId INTEGER PRIMARY KEY ASC AUTOINCREMENT ,name VARCHAR(100) UNIQUE,phoneNumber INTEGER UNIQUE); 及 我可以插入到用户表中,而不会出现以下问题: INSERT INTO user (name, phoneNumber) VALUES(@name,@phoneNumber) public v
CREATE TABLE user(UId INTEGER PRIMARY KEY ASC AUTOINCREMENT ,name VARCHAR(100) UNIQUE,phoneNumber INTEGER UNIQUE);
及
我可以插入到用户表中,而不会出现以下问题:
INSERT INTO user (name, phoneNumber) VALUES(@name,@phoneNumber)
public void Add(Transaction trans,User user)
{
_conn.Open();
string SQL = "INSERT INTO 'transaction' (loan, trackUser) VALUES(@loan,@userID);";
string checkUserSQL = "SELECT EXISTS(SELECT 1 FROM user WHERE UId = @UId) LIMIT 1;";
SQLiteCommand checkUserCommand = new SQLiteCommand(checkUserSQL,_conn);
checkUserCommand.Parameters.Add(new SQLiteParameter("@UId", user.UId));
var reader = checkUserCommand.ExecuteReader();
reader.Read();
var check = reader.GetBoolean(0);
if (!check)
{
throw new UserDoesNotExcistException();
}
SQLiteCommand transCommand = new SQLiteCommand(SQL, _conn);
transCommand.Parameters.Add(new SQLiteParameter("@loan",trans.Loan));
transCommand.Parameters.Add(new SQLiteParameter("@userID",user.UId));
transCommand.ExecuteNonQuery();
_conn.Close();
}
但当我尝试添加事务时,我的数据库被锁定。我是这样做的:
INSERT INTO user (name, phoneNumber) VALUES(@name,@phoneNumber)
public void Add(Transaction trans,User user)
{
_conn.Open();
string SQL = "INSERT INTO 'transaction' (loan, trackUser) VALUES(@loan,@userID);";
string checkUserSQL = "SELECT EXISTS(SELECT 1 FROM user WHERE UId = @UId) LIMIT 1;";
SQLiteCommand checkUserCommand = new SQLiteCommand(checkUserSQL,_conn);
checkUserCommand.Parameters.Add(new SQLiteParameter("@UId", user.UId));
var reader = checkUserCommand.ExecuteReader();
reader.Read();
var check = reader.GetBoolean(0);
if (!check)
{
throw new UserDoesNotExcistException();
}
SQLiteCommand transCommand = new SQLiteCommand(SQL, _conn);
transCommand.Parameters.Add(new SQLiteParameter("@loan",trans.Loan));
transCommand.Parameters.Add(new SQLiteParameter("@userID",user.UId));
transCommand.ExecuteNonQuery();
_conn.Close();
}
select语句,用于检查用户exicst在运行时是否没有问题,但在
transCommand.ExecuteNonQuery()时是否有问题代码>数据库被锁定。我是否以错误的方式绑定了forign密钥,或者为什么我的数据库被锁定?在同一连接上启动另一个读卡器之前,您应该先关闭上一个读卡器。尝试在检查后插入一个读卡器.Close()
,并记住也要关闭transCommand
读卡器。您真的应该使用语句将它们包装在中,以使事情更整洁,减少对资源清理的担忧。不过,transCommand不是一个阅读器吗?我已经尝试在创建transcommand之前添加reader.close,但是它仍然被锁定。您得到的错误到底是什么?它总是在第一次运行此方法时,还是在您已经运行过一次之后transCommand
仍然是一个需要关闭的命令对象。但我似乎在transCommand上找不到关闭命令?确切的错误是:“System.Data.SQLite.dll中发生了类型为'System.Data.SQLite.SQLiteException'的未经处理的异常。其他信息:数据库已锁定”您是对的,我以为您正在运行执行读取器。您是否通过不处理或关闭命令对象或连接而将其锁定在其他位置?如何打开连接(连接字符串)?