SQL Server CE:如果存在更新,否则插入

Posted

技术标签:

【中文标题】SQL Server CE:如果存在更新,否则插入【英文标题】:SQL Server CE : if exist update else insert 【发布时间】:2012-09-23 07:40:35 【问题描述】:

如果 SQL Server CE 数据库表中尚不存在行,我如何INSERT 行,如果存在则UPDATE 它?

我尝试了很多 SQL 查询并不断出错。这不起作用。

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

更新

我发现这对我有用。欢迎任何其他好的建议。

    INSERT INTO Table1 VALUES (...)
    SELECT (........)
    WHERE NOT Exists (SELECT ........)
    -- INSERT with Default value if not exist. Next, UPDATE it
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'

【问题讨论】:

您是否期望有任何并发​​性的可能性,或者该数据库是否适用于单用户应用程序? @MartinSmith,这是一款单用户移动应用。 另见:***.com/questions/728373/… 【参考方案1】:

我知道你已经标记了 sql 和 sql-server-ce 但如果你愿意使用 c# 代码来解决这个问题.. :

使用 c# 和结果集,这是我使用 SQL CE 为我的移动应用程序所做的:

            // UpdateRow is a struct/class to hold the data for each row
            // SqlCeConn = connection string for db

            SqlCeCommand cmd = new SqlCeCommand("Table1", SqlCeConn);
            cmd.CommandType = CommandType.TableDirect;
            cmd.IndexName = "Column1";

            using (SqlCeResultSet rsltSet = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable))
            
                if (UpdateRow.Column1> 0) // or != "" if it's string etc 
                
                    if (rsltSet.Seek(DbSeekOptions.FirstEqual, UpdateRow.Column1))
                        FoundRecord = true;
                
                rsltSet.Read();

                if (FoundRecord)
                
                    // Update
                    rsltSet.SetInt32(1, UpdateRow.Column1);
                    rsltSet.SetInt32(2, UpdateRow.Column2);

                    // etc

                    rsltSet.Update();
                
                else
                
                    // Insert new record
                    SqlCeUpdatableRecord record = rsltSet.CreateRecord();
                    record.SetInt32(0, UpdateRow.Column1);
                    record.SetInt32(1, UpdateRow.Column2);

                    // etc
                    rsltSet.Insert(record, DbInsertOptions.PositionOnInsertedRow);
                
            
            cmd.Dispose();
        
        catch (Exception e)
        
            // Deal with exception

        

【讨论】:

以上是关于SQL Server CE:如果存在更新,否则插入的主要内容,如果未能解决你的问题,请参考以下文章

sql server 判断记录存在更新不存在插入

SQL 查询 - 如果存在则更新,否则插入

SQL:如果存在则更新,否则插入...但对于具有不同值的多行

如果存在,我需要更新,否则使用 Linq 插入 SQL

在 Sql Server CE 中缩小或压缩?

在 SQL Server 上插入更新存储过程