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)
创建一个可以代表 或 的包装对象SqlCeResultSet(SqlCeUpdatableRecord视情况而定)。然后编写一次“保存”代码,并将其应用为更新或插入,具体取决于发现记录是否已存在。
警告:这是未经测试的代码。
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