作者:日全食x_354 | 来源:互联网 | 2023-01-13 15:17
我有这两个陈述:
db2.Execute(" UPDATE CLICKHISTORY SET " +
" DAYOFYEAR = " + dayOfYear + " , " +
" YEAR = " + year + " , " +
" MOnTH= " + month + " , " +
" DAY = " + day + " , " +
" BTNACOUNT = BTNACOUNT + 1 WHERE YYMMDD = " + yymmdd );
db2.Execute(" INSERT INTO CLICKHISTORY " +
" (YYMMDD,DAYOFYEAR,YEAR,MONTH,DAY,BTNACOUNT) " +
" VALUES ( " +
yymmdd + " , " +
dayOfYear + " , " +
year + " , " +
month + " , " +
day + " , " +
"1) WHERE changes() = 0");
我想要做的是在运行第二个语句之前检查第一个语句中是否change()= 0.
任何人都可以告诉我如何将这两个语句组合成一个,以便我可以检查changes()的值吗?
1> Steve Chambe..:
假设db2
是类型SQLite.SQLiteConnection
,您可以使用方法的返回值Execute
来查找受影响的行数 - 类似于:
int rowsAffected = db2.Execute("UPDATE...");
if (rowsAffected == 0) {
rowsAffected = db2.Execute("INSERT...");
}
2> qbik..:
通常,您可以使用分号组合sqlite语句;
.
但据我了解,这里真正的问题是:如何在SQLite中有条件地插入值?
您不能使用WHERE
与INSERT INTO table VALUES(...)
,但使用可以使用INSERT INTO table SELECT ...
语法来代替,并添加一个WHERE
条款来选择.
例
假设我有一张简单的表:scores (name varchar(20), score int)
.如果还没有更新,我想更新一行或插入新行.
var name = "my team";
var sql = $"update scores set score = score+1 where name = '{name}';"
+ $"insert into scores(name, score) select '{name}', 0 where changes() = 0" ;
var cmd = new SQLiteCommand(sql, conn);
cmd.ExecuteNonQuery();
根据您使用的驱动程序,使用的C#方法可能不同 - 我在这里使用System.Data.Sqlite.
您可能还想要了解如何在SQLite中执行Upsert.
@ Alan2 $""和括号是[C#字符串插值]的使用(https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interpolated-strings).它给出了与[string.Format()](https://msdn.microsoft.com/en-us/library/system.string.format(v = vs.110).aspx)相同的结果,但是在(IMO) )更人性化的阅读方式.