SQLCE - Upsert(更新或插入) - 如何使用常用方法准备行?

joe*_*not 8 .net c# sql-server-ce

以下是伪代码:

SqlCeResultSet myResultSet = cmd.ExecuteResultSet(Options...etc);
bool found = myResultSet.Seek();
if found {
    //do an Update
    myResultSet.Read() //make current

    //At this point we have a cursor positioned at a row to be edited
    myResultSet.SetString(1, "value for col 1");
    myResultSet.SetString(2, "value for col 2");
    //... etc... 
    myResultSet.SetString(100, "value for col 100");
    //i want to replace above with: CommonMethodToFillRowData(someRow)

    //finally update
    myResultSet.Update();

} else {
    //do an insert
    SqlCeUpdatableRecord myRec = myResultSet.CreateRecord();
    //set primaryKey
    myRec.SetInt32(0, pkValue);

    //At this point we have a cursor positioned at a row to be edited   
    myRec.SetString(1, "value for col 1");
    myRec.SetString(2, "value for col 2");
    //... etc...
    myRec.SetString(100, "value for col 100");
    //i want to replace above with: CommonMethodToFillRowData(someRow)

    //finally insert
    myResultSet.Insert(myRec);
}
Run Code Online (Sandbox Code Playgroud)

从上面可以看,如果我有100列准备,它必须重复两次; 我想要的是一些CommonMethodToFillRowData(); 但是我用这种方法的参数类型是什么?

CommonMethodToFillRowData(SqlCeResultSet or SqlCeUpdatableRecord ? parmRow) {
    parmRow.SetInt32(col1, value1)
    parmRow.SetString(col2, value2)
    ...etc.
    parmRow.SetString(100, "value for col 100");
}
Run Code Online (Sandbox Code Playgroud)

直接引用SqlCeUpdatableRecord上的MSDN doco类: - >表示来自数据源的一行可更新值.SqlCeResultSet对象包含一个或多个UpdatableRecords.

如果是这种情况,为什么我不能直接访问SqlCeResultSet中的单个UpdatableRecord,一旦我通过Seek()定位光标?

如果可能,那将使我能够使用:

CommonMethodToFillRowData(SqlCeUpdatableRecord parmRow) {
   //end of story
}
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 3

创建一个可以代表 或 的包装对象SqlCeResultSetSqlCeUpdatableRecord视情况而定)。然后编写一次“保存”代码,并将其应用为更新或插入,具体取决于发现记录是否已存在。

警告:这是未经测试的代码。

public void SavingMyData()
{
    SqlCeResultSet resultSet = cmd.ExecuteResultSet(Options...etc);
    SqlCeWrapper wrapper = new SqlCeWrapper(resultSet);

    wrapper.SetInt32(0, pkValue, true); // Primary Key = true
    wrapper.SetString(1, "value for col 1");
    wrapper.SetString(2, "value for col 2");
    wrapper.SetString(100, "value for col 100");
    wrapper.Commit();
}

...

public class SqlCeWrapper
{
    private readonly bool _found;
    private readonly SqlCeResultSet _resultSet;
    private readonly SqlCeUpdatableRecord _newRecord;

    public SqlCeWrapper(SqlCeResultSet resultSet)
    {
        _resultSet = resultSet;

        _found = resultSet.Seek();
        if (_found)
            resultSet.Read();
        else
            _newRecord = resultSet.CreateRecord();
    }

    public void SetInt32(int ordinal, int value, bool isPrimary = false)
    {
        if (_found && !isPrimary)
            _resultSet.SetInt32(ordinal, value);
        else if (!_found)
            _newRecord.SetInt32(ordinal, value);
    }

    public void SetString(int ordinal, string value, bool isPrimary = false)
    {
        if (_found && !isPrimary)
             _resultSet.SetString(ordinal, value);
        else if (!_found)
            _newRecord.SetString(ordinal, value);
    }

    public void Commit()
    {
        if (_found)
            _resultSet.Update();
        else
            _resultSet.Insert(_newRecord);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您不使用 .NET 4,则必须删除可选参数。您还可以根据需要添加其他SetX()方法。SqlCeWrapper