我是(新的和)使用SQL CE数据库,该数据库稍后将连接到我们通过SerialPort向设备发送和接收信息的项目。该数据库将存储有关通信的每个部分的信息。在更新数据集并将更新的数据提交到数据库时,我有点困惑。
data = new DataSet();
adapter = new SqlCeDataAdapter("SELECT * FROM " + [table_name])
builder = new SqlCeCommandBuilder(adapter);
adapter.Fill(data, [table_name]);
data.Tables[table_name].Rows[identity_value][a_column] = a_column_value;
adapter.Update(data, [table_name]);
在运行此方法之前,我确保我在表中有一个标识值为1的记录。但是在调用adapter.Update()之前我得到There is no row at position 1
IndexOutOfRangeException。我假设我误解了如何使用和更新数据集。有什么建议吗?
我在尝试更新行之前尝试查看数据集但是调试器似乎没有让我进入数据集,有没有办法做到这一点?
答案 0 :(得分:0)
试试这个:
var rows = data.Tables[table_name].Select(String.Format("[Id] = {0}",identity_value));
if (rows.Length == 1)
{
rows[0][a_column] = a_column_value;
}
你正在解释错误的财产Rows
data.Tables[table_name].Rows[ROWINDEX][COLUMNINDEX]
ROWINDEX是数组索引而不是标识
建议:
如果您必须使用DataSet
,请使用SqlCeDataAdapter.FillSchema加载表格架构信息:
adapter.FillSchema(data.Tables[table_name], SchemaType.Mapped);
adapter.Fill(data, [table_name]);
这只会加载数据:
然后,如果DataTable
中至少有一列指定为主键列,则可以使用DataRowCollection.Find Method获取行:
DataRow foundRow = data.Tables[table_name].Rows.Find(identity_value);