Pergunta : Adicionando papéis aos papéis no fornecedor feito sob encomenda da sociedade - uma maneira melhor? C#, SQL, Oracle, ASP.NET

Eu preciso de encontrar uma maneira melhor de conservar papéis aos papéis em nosso fornecedor feito sob encomenda do mebership - até à data do rifgr agora, está aqui a tabela: o

Currently do
ParentRoleID do
RoleID do

ID (PK) (FK a aspnet_Roles.ID) (FK a aspnet_Roles.ID), é aqui as etapas que são usadas para adicionar um papel (nós chamaremos este c-papel) a um outro este p-papel)

- do papel (nós chamaremos começ a todo o pai atual papéis do p-papel, papéis do pai de todo o pai, os papéis do pai de todo o pai do pai, e assim por diante e assim por diante, e põr o releventdata em uma tabela dos dados (assim como o mesmos para o c-papel.)a supressão do

- todas as entradas para o c-papel com um datatable de todo o parents

- dos c-papéis adiciona a tabela que nós coletamos que nós apenas suprimimos, junto com os dados novos a respeito do role

I am do pai esperando que há alguém para fora lá quem abordou isto antes, porque eu gostaria de encontrar uma maneira melhor de fazer isto, assim como encontram uma maneira melhor para a funcionalidade da camada do acesso de dados que eu incluí abaixo - tudo trabalha, mim apenas querem um DAL mais rápido, menos complicado, e se possível uma outra opção se disponível - agradecimentos adiantado para seu conhecimento!
class= > " desobstruído " do
> do " codeSnippet " do class= do
class= " lineNumbers " do
class= do
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
class= " do id= " codeSnippet747118 do
 chamada começar

        bool público SetRoles (dtRoles de DataTable, roleId da corda)
        {
            dtDeleteRoles de DataTable = GetParentRolesInRole (roleId);
            dtDeleteRoles.TableName = String.Format (“RolesInRoles”);
            CreatePrimaryKey (dtDeleteRoles, “identificação”);
            dtRoles.TableName = String.Format (“RolesInRoles”);
            resultado do bool = UpdateTable (dtRoles, dtDeleteRoles);
            resultado do retorno;
        }

// aqui abaixo é todas as funções usadas nesta chamada - qualquer um 
// slim este para baixo de todo, ou encontra uma maneira melhor?

        DataTable público GetParentRolesInRole (roleId da corda)
        {
            sqlCommand da corda = (@ "
                SELECIONAR RolesInRoles.RoleId, aspnet_Roles.RoleName, RolesInRoles.ParentRoleId 
                De RolesInRoles 
                INTERNO JUNTAR-SE a aspnet_Roles
	                Em ParentRoleId = em aspnet_Roles.RoleId
                ONDE RolesInRoles.RoleId = “{0}”
                ");
            sqlCommand = corda. Formato (sqlCommand, roleId);
            dbCommand de DbCommand = _database.GetSqlStringCommand (sqlCommand);
            _database.ExecuteDataSet do retorno (dbCommand). Tabelas [0];
        }


        público CreatePrimaryKey vago (DataTable dtbTable, strColumnName da corda)
        {
            dcCol de DataColumn [] = DataColumn novo [1];
            dcCol [0] = dtbTable.Columns [strColumnName];
            dtbTable.PrimaryKey = dcCol;
        }


  bool público UpdateTable (DataTable adiciona, o supressão de DataTable)
        {
            utilização (dbConn de DbConnection = _database.CreateConnection ())
            {
                dbConn.Open ();
                tentativa
                {
                    usar-se (dbTxn de DbTransaction = dbConn.BeginTransaction ())
                    {
                        tentativa
                        {
                            se (adicionar. Rows.Count > 0)
                            {
                                UpdateInsertDataTable (adicionar, dbTxn);
                            }
                            se (supressão. Rows.Count > 0)
                            {
                                para (int i = 0; supressão. Rows.Count do <= i - 1; i++)
                                {
                                    supressão. Fileiras [i]. Supressão ();
                                }
                                DeleteDataTable (supressão, dbTxn);
                            }
                            dbTxn.Commit ();
                        }
                        prendedor
                        {
                            dbTxn.Rollback ();
                            falso do retorno;
                        }
                    }
                }
                finalmente
                {
                    dbConn.Close ();
                }
            }
            do retorno retificar;
        }

  int confidencial UpdateInsertDataTable (DataTable dtTable, txn de DbTransaction)
        {
            strInsert da corda = “INSERÇÃO EM” + dtTable.TableName + “(”;
            o strUpdate da corda = “ATUALIZAÇÃO” + dtTable.TableName + “AJUSTOU-SE”;

            para (int i = 0; i <= dtTable.Columns.Count - 1; i++)
            {
                se (_database.DbProviderFactory.ToString (). Contem (“Oracle”))
                {
                    strInsert = strInsert + dtTable.Columns [i] .ColumnName + “,”;
                    strUpdate = strUpdate + dtTable.Columns [i] .ColumnName + “=” + _paramStart + dtTable.Columns [i] .ColumnName + “,”;
                }
                mais
                {
                    strInsert = strInsert + “[” + dtTable.Columns [i] .ColumnName + “],”;
                    strUpdate = strUpdate + “[” + dtTable.Columns [i] .ColumnName + “] =” + _paramStart + dtTable.Columns [i] .ColumnName + “,”;
                }
            }

            strInsert = strInsert.Substring (0, strInsert.Length - 1) + ") valores (”;
            para (int i = 0; i <= dtTable.Columns.Count - 1; i++)
            {
                strInsert = strInsert + _paramStart + dtTable.Columns [i] .ColumnName + “,”;
            }

            strInsert = strInsert.Substring (0, strInsert.Length - 1) + ")”;
            strUpdate = strUpdate.Substring (0, strUpdate.Length - 1) + “ONDE”;
            foreach (coluna de DataColumn em dtTable.PrimaryKey)
            {
                strUpdate = strUpdate + column.ColumnName + “=” + _paramStart + column.ColumnName + “E”;
            }
            strUpdate = strUpdate.Substring (0, strUpdate.Length - 5);

            insertCommand de DbCommand = _database.GetSqlStringCommand (strInsert);
            updateCommand de DbCommand = _database.GetSqlStringCommand (strUpdate);

            para (int i = 0; i <= dtTable.Columns.Count - 1; i++)
            {
                Tipo de DbType = GetDataType (dtTable.Columns [i] .DataType);
                _database.AddInParameter (insertCommand, dtTable.Columns [i] .ColumnName, tipo, dtTable.Columns [i] .ColumnName, DataRowVersion.Current);
                _database.AddInParameter (updateCommand, dtTable.Columns [i] .ColumnName, tipo, dtTable.Columns [i] .ColumnName, DataRowVersion.Current);
                se (! (tipo == DbType.String | datilografar o == DbType.AnsiString)) continuar;
                insertCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Tamanho = dtTable.Columns [i] .MaxLength;
                updateCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Tamanho = dtTable.Columns [i] .MaxLength;
            }
            GetIdsForTable (dtTable);

            UpdateDataSet do retorno (dtTable.Select ("", ""), insertCommand, updateCommand, zero, txn, UpdateBehavior.Standard, 0); //DataViewRowState.ModifiedCurrent | DataViewRowState.Added
        }

      GetIdsForTable vago confidencial (tabela de DataTable)
        {
            se (tabela. Columns.Contains (“identificação”))
            {
                se (tabela. == das colunas [“identificação”] .AutoIncrement falso)
                {
                    //For cada relação como DataRelation em table.ChildRelations 
                    relação de //. Aninhado 
                    //Next 
                    idEnd do int = GetLatestId (table.TableName); //GetIdRefs (table.TableName, fileiras. Comprimento);
                    int identificação = idEnd + 1; //idEnd - fileiras. Comprimento + 1;
                    foreach (fileira de DataRow na tabela. Fileiras)
                    {
                        fileira [“identificação”] = identificação;
                        identificação += 1;
                    }
                }
            }

        }


 int confidencial UpdateDataSet (os dataRows de DataRow [], insertCommand de DbCommand, updateCommand de DbCommand, deleteCommand de DbCommand, txn de DbTransaction, comportamento de UpdateBehavior, o int updateBatchSize)
        {
            fileiras do int;
            usar-se (adaptador de DbDataAdapter = _database.GetDataAdapter ())
            {
                se ((== UpdateBehavior.Transactional do comportamento) & zero do == do txn)
                {
                    usar-se (dbConn de DbConnection = _database.CreateConnection ())
                    {
                        dbConn.Open ();
                        tentativa
                        {
                            usar-se (dbTxn de DbTransaction = dbConn.BeginTransaction ())
                            {
                                tentativa
                                {
                                    DoUpdateDataSet (o adaptador, insertCommand, updateCommand, deleteCommand, dbTxn, comportamento, updateBatchSize);
                                    fileiras = adaptador. Atualização (dataRows);
                                    dbTxn.Commit ();
                                }
                                prendedor
                                {
                                    dbTxn.Rollback ();
                                    lance;
                                }
                            }
                        }
                        finalmente
                        {
                            dbConn.Close ();
                        }
                    }
                }
                mais
                {
                    DoUpdateDataSet (o adaptador, insertCommand, updateCommand, deleteCommand, txn, comportamento, updateBatchSize);
                    fileiras = adaptador. Atualização (dataRows);
                }
            }
            fileiras do retorno;
        }

 DoUpdateDataSet vago de estática confidencial (o adaptador de DbDataAdapter, insertCommand de DbCommand, updateCommand de DbCommand, deleteCommand de DbCommand, txn de DbTransaction, comportamento de UpdateBehavior, o int updateBatchSize)
        {

            explicitAdapter = adaptador de IDbDataAdapter;
            se (txn! = zero)
            {
                se (insertCommand! = zero)
                    PrepareCommand (insertCommand, txn);
                se (updateCommand! = zero)
                    PrepareCommand (updateCommand, txn);
                se (deleteCommand! = zero)
                    PrepareCommand (deleteCommand, txn);
            }
            se (insertCommand! = zero)
            {
                insertCommand.CommandTimeout = 120;
                explicitAdapter.InsertCommand = insertCommand;
            }
            se (updateCommand! = zero)
            {
                updateCommand.CommandTimeout = 120;
                explicitAdapter.UpdateCommand = updateCommand;
            }
            se (deleteCommand! = zero)
            {
                deleteCommand.CommandTimeout = 120;
                explicitAdapter.DeleteCommand = deleteCommand;
            }

            se (updateBatchSize o == 1) retorno;
            adapter.UpdateBatchSize = updateBatchSize;
            se (insertCommand! = zero)
                adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
            se (updateCommand! = zero)
                adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
            se (deleteCommand! = zero)
                adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
        }

        PrepareCommand vago de estática confidencial (comando de DbCommand, txn de DbTransaction)
        {
            comando. Transação = txn;
            comando. Conexão = txn. Conexão;
            comando. Preparar ();
        }

   int confidencial DeleteDataTable (DataTable dtTable, txn de DbTransaction)
        {
            strDelete da corda = “supressão de” + dtTable.TableName + “onde”;
            foreach (coluna de DataColumn em dtTable.PrimaryKey)
            {
                strDelete = strDelete + column.ColumnName + “=” + _paramStart + column.ColumnName + “e”;
            }
            strDelete = strDelete.Substring (0, strDelete.Length - 5);
            deleteCommand de DbCommand = _database.GetSqlStringCommand (strDelete);
            //For cada fileira como Data.DataRow em dtTable.Rows 
            foreach (coluna de DataColumn em dtTable.PrimaryKey)
            {
                //db.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), fileira. Artigo (column.ColumnName, DataRowVersion.Original)) 
                _database.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), column.ColumnName, DataRowVersion.Current);
            }
            UpdateDataSet do retorno (dtTable.Select ("", "", DataViewRowState.Deleted), zero, zero, deleteCommand, txn, UpdateBehavior.Standard, 0);
        }
class= do

Resposta : Adicionando papéis aos papéis no fornecedor feito sob encomenda da sociedade - uma maneira melhor? C#, SQL, Oracle, ASP.NET

Os bocados são bocados, você pode somente fazer transferência mais rápida tendo uma tubulação mais grande to/from o armazenamento, e uma disposição mais rápida do armazenamento.  

Os instantâneos são sobre - - voam, você podem mesmo programá-los.  Então você pode executar um apoio no instantâneo com o VM ainda que funciona.  Além disso, BEWARE da degradação de desempenho em sua disposição do armazenamento.

Você pode absolutamente automatizar a parada programada, a exportação e a recuperação.  Você pode contar nos VMs para vir apoio contanto que seu scripting for bom e testado bem.

Bonito muito tudo que você quer está já na liberação 5.6 de XenServer.  Igualmente verific para fora StorageLink, que vem com empresa de XS, e realça mais estas funções.
Outras soluções  
 
programming4us programming4us