【问题标题】:How to combine two SQLite statements running in C#?如何组合在 C# 中运行的两个 SQLite 语句?
【发布时间】:2018-03-23 06:46:40
【问题描述】:

我有这两个说法:

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");

我想做的是在运行第二个语句之前检查第一个语句中的 changes() = 0 是否。

谁能告诉我如何将这两个语句组合在一起,以便我可以检查 changes() 的值?

【问题讨论】:

  • 第一条语句将更新表中的所有行。第二个不是有效的 SQL。
  • 我已经更新了第二个,并将进一步完善和检查。我所展示的只是一个例子。我需要做的是如果它不存在则插入一行,如果存在则更新。我对此进行了研究,如果更新不起作用,最简单的方法似乎是更新,然后插入
  • 你可以做case count(select ...) when 0 then insert else update,虽然这是额外的查询。这就是你要找的吗?
  • 每个 SQL 驱动程序都应该有一些方法来返回更新的行数(但我不知道你使用的是哪一个)。
  • 你是如何连接到数据库的?您可以发布您的连接代码以及您使用的库吗? Mono.Data.SQLite?

标签: c# .net sqlite xamarin xamarin.forms


【解决方案1】:

假设db2SQLite.SQLiteConnection 类型,您可以使用Execute 方法的返回值来找出受影响的行数 - 类似于:

int rowsAffected = db2.Execute("UPDATE...");
if (rowsAffected == 0) {
    rowsAffected = db2.Execute("INSERT...");
}

【讨论】:

    【解决方案2】:

    一般情况下,您可以使用分号; 组合sqlite 语句。

    但据我了解,这里真正的问题是:如何有条件地在 SQLite 中插入值?

    您不能将WHEREINSERT 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。

    您可能还想看看如何做Upsert in SQLite

    【讨论】:

    • 您好,感谢您的回答。您能解释一下 $" 的用法以及名称周围的括号吗?
    • @Alan2 $"" 和括号是C# string interpolation 的用法。它提供与string.Format() 相同的结果,但以(IMO)更易于阅读的方式。
    猜你喜欢
    • 2018-05-10
    • 2023-03-14
    • 2014-06-18
    • 1970-01-01
    • 2021-08-26
    • 2017-07-14
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多