private static LastInsertId Insert(IAccessDb db, TableInfo ti, object data)
        {
            var           p    = db.Provider;
            List <object> args = null;

            var d = data.ToDictionary();

            if (ti.InsertSql == null)
            {
                var sb = new StringBuilder("Insert into");
                sb.AppendFormat(" {0} (", p.EscapeName(ti.Name));

                args = FillArgs(d, ti, p, sb);

                sb.Remove(sb.Length - 1, 1);

                sb.Append(") values(");

                for (var i = 0; i < args.Count; i++)
                {
                    sb.Append("@" + i + ",");
                }
                sb.Remove(sb.Length - 1, 1);
                sb.Append(")");
                ti.InsertSql = sb.ToString();
            }
            if (args == null)
            {
                args = FillArgs(d, ti, p);
            }

            var st = db.WithSql(ti.InsertSql, args.ToArray()) as SqlStatement;

            st.ReuseCommand = true;
            LastInsertId rez;

            try
            {
                rez = db.Provider.ExecuteInsert(st, ti.PrimaryKey);
            }
            finally
            {
                db.CloseConnection();
            }

            return(rez);
        }