代码之家  ›  专栏  ›  技术社区  ›  Dabblernl

如何将命令/SQL语句添加到强类型TableAdapter的更新/插入命令中?

  •  1
  • Dabblernl  · 技术社区  · 15 年前

    this question . 我有以下代码,这些代码使用强类型数据集对SQLite数据库执行。

            messagesAdapter.Update(messages);//messages is a DataTable
            var connection = messagesAdapter.Connection;
            var retrieveIndexCommand= connection.CreateCommand();
            retrieveIndexCommand.CommandText = @"Select last_insert_rowid()";
            connection.Open();
            var index = retrieveIndexCommand.ExecuteScalar();
            connection.Close();
    

    这不起作用,因为最后一个_inser_rowid()总是返回零。这是由于需要在TableAdapter的update命令所使用的相同连接期间调用它。如何更改TableAdapter的insert或update命令,使其返回索引?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Alex LE    15 年前

    如果要插入一行,可以使用以下命令:

    // cast if necessary
    using (var insert = (SQLiteCommand)this.Adapter.InsertCommand.Clone()) { 
        insert.CommandText += "; SELECT last_insert_rowid()";
        foreach (SQLiteParameter parameter in insert.Parameters) {
            parameter.Value = row[parameter.SourceColumn];
        }
    }
    var index = Convert.ToInt32(insert.ExecuteScalar());
    

    您还可以使用它插入多行,并将您的ID分配给每个行:

    using (var insert = (SQLiteCommand)this.Adapter.InsertCommand.Clone())
    {
        insert.CommandText += "; SELECT last_insert_rowid()";
        // this filter only added rows
        foreach (MyDataSet.MessageRow row in messages.GetChanges(DataRowState.Added))
        {
            foreach (SQLiteParameter parameter in insert.Parameters)
            {
                parameter.Value = row[parameter.SourceColumn];
            }
            // use the name of your rowid column
            row.ID = Convert.ToInt32(insert.ExecuteScalar());
            row.AcceptChanges();
        }
    }
    // then you can perfom the other updates
    messagesAdapter.Update(messages);
    

    注意:请确保打开/关闭连接