【问题标题】:How to Add a command/SQL statement to a strongly typed TableAdapter's Update/Insert command?如何在强类型 TableAdapter 的更新/插入命令中添加命令/SQL 语句?
【发布时间】:2010-01-25 20:19:19
【问题描述】:

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();

这不起作用,因为 last_inser_rowid() 总是返回零。这是因为它需要在 TableAdapter 的 Update 命令使用的同一连接期间调用。如何更改 TableAdapter 的插入或更新命令以使其返回索引?

【问题讨论】:

    标签: database command strongly-typed-dataset


    【解决方案1】:

    如果你要插入一行,你可以使用这个:

    // 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);
    

    注意:请务必打开/关闭您的连接

    【讨论】:

    • 我只尝试了单行方法,它有效!我需要将代码添加到部分 MessagesTableAdapter 类中,您可以通过在数据集设计器中双击它来编辑它。而且您忘记在 Clone 操作之后向 SQLiteCommand 添加强制转换,因为这会返回一个对象。也许您可以让您的回答反映此评论?谢谢!
    • 完成,一些提供者的 Clone 方法返回了正确的类型,不客气!
    猜你喜欢
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2021-06-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多