我有一个包含已创建和已修改列的表。我只想插入一次创建的值,然后使其不可变。我知道如何以一种繁琐的方式完成这项工作(编写“DoesRecordExist()”方法,然后基于此更改查询和查询参数的数量),但肯定有一种更巧妙的方法来实现这一点。毕竟,这必须是一个常见的需求(如果您愿意,可以称之为“数据库模式”)。
我的代码是:
public void InsertUserSiteRecord(UserSite us)
{
using (SQLiteConnection conn = new SQLiteConnection(HHSUtils.GetDBConnection()))
{
conn.Open();
using (SQLiteCommand cmd = new SQLiteCommand(conn))
{
cmd.CommandText =
String.Format(
@"INSERT INTO UserSite (SiteNum, SerialNum, UserName, Created, Modified)
VALUES (@SiteNum, @SerialNum, @UserName, @Created, @Modified)");
cmd.Parameters.Add(new SQLiteParameter("SiteNum", us.SiteNum));
cmd.Parameters.Add(new SQLiteParameter("SerialNum", us.SerialNum));
cmd.Parameters.Add(new SQLiteParameter("UserName", us.UserName));
cmd.Parameters.Add(new SQLiteParameter("Created", us.Created));
cmd.Parameters.Add(new SQLiteParameter("Modified", us.Modified));
cmd.ExecuteNonQuery();
}
conn.Close();
}
}
...我想避免不得不做这样的事情:
public void InsertUserSiteRecord(UserSite us)
{
using (SQLiteConnection conn = new SQLiteConnection(HHSUtils.GetDBConnection()))
{
conn.Open();
using (SQLiteCommand cmd = new SQLiteCommand(conn))
{
if (!RecordExists(us.SiteNum, us.SerialNum, us.UserName))
{
cmd.CommandText =
String.Format(
@"INSERT INTO UserSite (SiteNum, SerialNum, UserName, Created, Modified)
VALUES (@SiteNum, @SerialNum, @UserName, @Created, @Modified)");
else
{
cmd.CommandText =
String.Format(
@"INSERT INTO UserSite (SiteNum, SerialNum, UserName, Modified)
VALUES (@SiteNum, @SerialNum, @UserName, @Modified)");
}
cmd.Parameters.Add(new SQLiteParameter("SiteNum", us.SiteNum));
cmd.Parameters.Add(new SQLiteParameter("SerialNum", us.SerialNum));
cmd.Parameters.Add(new SQLiteParameter("UserName", us.UserName));
if (!RecordExists(us.SiteNum, us.SerialNum, us.UserName))
{
cmd.Parameters.Add(new SQLiteParameter("Created", us.Created));
}
cmd.Parameters.Add(new SQLiteParameter("Modified", us.Modified));
cmd.ExecuteNonQuery();
}
conn.Close();
}
}
private bool RecordExists(String SiteNum, String SerialNum, String UserId)
{
// query the table to see if those three values exist in any record
}
是否有类似以下内容的SQL[ite]构造:
cmd.Parameters.AddOnlyIfColumnIsEmpty(new SQLiteParameter("Created", us.Created));
?或者,如何才能最好地解决这一问题?
2条答案
按热度按时间jhiyze9q1#
您需要检查记录是否存在;如果记录存在,则执行更新(不更改您创建的值),如果不存在,则执行插入。
假设您的表上有一个PK,那么您的原始代码将会给出一个重复的键错误。
ztigrdn82#
您可以使用
trigger
来实现这一点。请参阅此处有关触发器的SQLite文档:https://www.sqlite.org/lang_createtrigger.html基本上,您将创建一个
INSTEAD OF
触发器,然后相应地设置您的查询。从文档中:导致更新特定客户条目的Customer.cust_addr字段,该特定客户条目的Customer.cust_id等于$cust_id参数。请注意,分配给视图的值是如何作为触发器主体中特殊的“new”表中的字段提供的。
您需要做的就是将触发器设置为即使原始查询传入要更新的列也不更新该列。