【问题标题】:Getting multiple LastInserted IDs in MySQL?在 MySQL 中获取多个 LastInserted ID?
【发布时间】:2018-02-02 03:51:19
【问题描述】:

我决定更改代码以执行批处理作业,而不是为每个项目插入新查询,这将减少插入所有新项目所需的时间。

完成此操作后,我注意到我需要为新的 GameItem 类实例插入最后一个 ID 作为它的 ID,我该如何解决这个问题?

public static List<GameItem> CreateMultipleItems(ItemData data, PlayerData playerData, string ExtraData, int Amount, int GroupId = 0)
{
    if (data == null)
    {
        throw new InvalidOperationException("Data cannot be null.");
    }

    var items = new List<GameItem>();

    using (var dbConnection = Program.Server.DatabaseHandler.Connection)
    {
        var queries = new List<string> {"INSERT INTO `habbo_items` (base_item,user_id,room_id,x,y,z,wall_pos,rot,extra_data) VALUES "};

        for (var i = 0; i < Amount; i++)
        {
            queries.Add(string.Format("('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')", 
                MySqlHelper.EscapeString(data.Id.ToString()), 
                MySqlHelper.EscapeString(playerData.Id.ToString()),
                MySqlHelper.EscapeString("0"),
                MySqlHelper.EscapeString("0"),
                MySqlHelper.EscapeString("0"),
                MySqlHelper.EscapeString("0"),
                MySqlHelper.EscapeString(""),
                MySqlHelper.EscapeString("0"),
                MySqlHelper.EscapeString(ExtraData)
            ) + ",");

            var item = new GameItem(Convert.ToInt32(dbConnection.GetLastId()), 0, data.Id, ExtraData, 0, 0, 0, 0, playerData.Id, GroupId, 0, 0, "");

            if (GroupId > 0)
            {
                dbConnection.SetQuery("INSERT INTO `habbo_items_groups` (`id`, `group_id`) VALUES (@id, @gid)");
                dbConnection.AppendParameter("id", item.Id);
                dbConnection.AppendParameter("gid", GroupId);
                dbConnection.ExecuteNonQuery();
            }

            items.Add(item);
        }

        dbConnection.SetBatch(queries);
        dbConnection.ExecuteNonQuery();
    }

    return items;
}

【问题讨论】:

    标签: c# mysql .net database


    【解决方案1】:

    为此,您可以推送 ado.net DataTable 以插入 sql server。

    步骤一

    在 sql server 中创建自定义表值数据类型。

    第二步

    使用您的自定义数据类型参数创建存储过程,并从输出参数返回标识列值。

    在sql服务器中

    @@identity

    返回最后插入的标识列值

    第三步

    创建数据表并填充此数据表并从此数据表中设置参数值并发送到sql server进行插入操作

    注意:表值类型支持 Sql Server 2008 及以上版本

    【讨论】:

    • 你没有展示任何关于如何做到这一点的代码示例,你的步骤也不清楚..
    【解决方案2】:
    CREATE TABLE [dbo].[habbo_items](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [base_item] [nvarchar](50) NULL,
    [user_id] [int] NULL,
    [room_id] [int] NOT NULL,
    

    CONSTRAINT [PK_habbo_items] 主键集群 ( [编号] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) 在 [主要] 上

    create procedure sp_save(@habbo_items_TBL habbo_items_TBL readonly, @result int output)
    

    作为 插入 habbo_items(base_item,user_id,room_id) 从@habbo_items_TBL 中选择base_item、user_id、room_id 设置@result=@@IDENTITY 去

    DataTable dt = new DataTable("habbo_items_TBL");
        dt.Columns.Add("base_item", typeof(string));
        dt.Columns.Add("user_id", typeof(int));
        dt.Columns.Add("room_id", typeof(int));
    
        dt.Rows.Add("base item1", 1, 2);
        dt.Rows.Add("base item2", 1, 2);
        dt.Rows.Add("base item3", 2, 3);
    
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ConnectionString);
        SqlCommand cmd = new SqlCommand("sp_save", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@habbo_items_TBL", dt);
    
        SqlParameter outPutParameter = new SqlParameter();
        outPutParameter.ParameterName = "@result";
        outPutParameter.SqlDbType = System.Data.SqlDbType.Int;
        outPutParameter.Direction = System.Data.ParameterDirection.Output;
        cmd.Parameters.Add(outPutParameter);
    
        conn.Open();
        cmd.ExecuteNonQuery();
        Int32 result = Convert.ToInt32(outPutParameter.Value);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 2012-01-03
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2016-08-07
      • 2021-03-16
      • 2012-07-29
      相关资源
      最近更新 更多