Cuestión : ¿Agregando papeles a los papeles en abastecedor de encargo de la calidad de miembro - una mejor manera? C#, SQL, Oracle, ASP.NET

Necesito encontrar una mejor manera de ahorrar papeles a los papeles en nuestro abastecedor de encargo del mebership - en fecha rifgr ahora, aquí está la tabla: el

Currently del
ParentRoleID (FK del
RoleID (FK del

ID (PK) a aspnet_Roles.ID) a aspnet_Roles.ID), aquí es los pasos que se utilizan para agregar un papel (llamaremos este c-papel) a otro

- del papel (llamaremos este p-papel) consiguen a todo el padre actual el papeles del p-papel, papeles del padre de todo el padre, los papeles del padre de todo el padre del padre, y así sucesivamente y así sucesivamente, y ponen el releventdata en una tabla de los datos (así como iguales para el c-papel.)¡la cancelación del

- todas las entradas para el c-papel con un datatable de todo el parents

- de los c-papeles agrega la tabla que hemos recogido que acabamos de suprimir, junto con los nuevos datos referentes al role

I del padre esperando que hay alguien hacia fuera allí antes quién ha abordado esto, pues quisiera encontrar una mejor manera de hacer esto, tan bien como encuentran una mejor manera para la funcionalidad de la capa del acceso de datos que he incluido abajo - todo trabaja, yo apenas quieren un DAL más rápido, menos complicado, y si es posible otra opción si está disponible - las gracias por adelantado por su conocimiento!
class= > " claro " del
> del " codeSnippet " del class= del
class= " lineNumbers " del
class= del
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= " del id= " codeSnippet747118 del
 llamada el comenzar

        bool público SetRoles (dtRoles de DataTable, roleId de la secuencia)
        {
            dtDeleteRoles de DataTable = GetParentRolesInRole (roleId);
            dtDeleteRoles.TableName = String.Format (“RolesInRoles”);
            CreatePrimaryKey (dtDeleteRoles, “identificación”);
            dtRoles.TableName = String.Format (“RolesInRoles”);
            resultado del bool = UpdateTable (dtRoles, dtDeleteRoles);
            resultado de vuelta;
        }

// aquí debajo es todas las funciones usadas en esta llamada - cualquier persona 
¿// adelgaza esto abajo en absoluto, o encuentra una mejor manera?

        DataTable público GetParentRolesInRole (roleId de la secuencia)
        {
            sqlCommand de la secuencia = (@ "
                SELECCIONAR RolesInRoles.RoleId, aspnet_Roles.RoleName, RolesInRoles.ParentRoleId 
                De RolesInRoles 
                INTERNO ENSAMBLAR los aspnet_Roles
	                EN ParentRoleId = aspnet_Roles.RoleId
                DONDE RolesInRoles.RoleId = “{0}”
                ");
            sqlCommand = secuencia. Formato (sqlCommand, roleId);
            dbCommand de DbCommand = _database.GetSqlStringCommand (sqlCommand);
            _database.ExecuteDataSet de vuelta (dbCommand). Tablas [0];
        }


        público CreatePrimaryKey vacío (DataTable dtbTable, strColumnName de la secuencia)
        {
            dcCol de DataColumn [] = nuevo DataColumn [1];
            dcCol [0] = dtbTable.Columns [strColumnName];
            dtbTable.PrimaryKey = dcCol;
        }


  bool público UpdateTable (DataTable agrega, la cancelación de DataTable)
        {
            el usar (dbConn de DbConnection = _database.CreateConnection ())
            {
                dbConn.Open ();
                intento
                {
                    el usar (dbTxn de DbTransaction = dbConn.BeginTransaction ())
                    {
                        intento
                        {
                            si (agregar. Rows.Count > 0)
                            {
                                UpdateInsertDataTable (agregar, dbTxn);
                            }
                            si (cancelación. Rows.Count > 0)
                            {
                                para (internacional i = 0; cancelación. Rows.Count - 1 del <= i; i++)
                                {
                                    cancelación. Filas [i]. Cancelación ();
                                }
                                DeleteDataTable (cancelación, dbTxn);
                            }
                            dbTxn.Commit ();
                        }
                        retén
                        {
                            dbTxn.Rollback ();
                            falso de vuelta;
                        }
                    }
                }
                finalmente
                {
                    dbConn.Close ();
                }
            }
            de vuelta verdad;
        }

  internacional privada UpdateInsertDataTable (DataTable dtTable, txn de DbTransaction)
        {
            strInsert de la secuencia = “PARTE MOVIBLE EN” + dtTable.TableName + “(”;
            el strUpdate de la secuencia = “ACTUALIZACIÓN” + dtTable.TableName + “FIJÓ”;

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

            strInsert = valores de strInsert.Substring (0, strInsert.Length - 1) + ") (”;
            para (internacional 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) + “DONDE”;
            foreach (columna de DataColumn en dtTable.PrimaryKey)
            {
                strUpdate = strUpdate + column.ColumnName + “=” + _paramStart + column.ColumnName + “Y”;
            }
            strUpdate = strUpdate.Substring (0, strUpdate.Length - 5);

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

            para (internacional 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);
                ¡si (! (tipo == DbType.String | mecanografiar el == DbType.AnsiString)) continuar;
                insertCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Tamaño = dtTable.Columns [i] .MaxLength;
                updateCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Tamaño = dtTable.Columns [i] .MaxLength;
            }
            GetIdsForTable (dtTable);

            UpdateDataSet de vuelta (dtTable.Select ("", ""), insertCommand, updateCommand, falta de información, txn, UpdateBehavior.Standard, 0); //DataViewRowState.ModifiedCurrent | DataViewRowState.Added
        }

      GetIdsForTable vacío privado (tabla de DataTable)
        {
            si (tabla. Columns.Contains (“identificación”))
            {
                si (tabla. == de las columnas [“identificación”] .AutoIncrement falso)
                {
                    //For cada relación como DataRelation en table.ChildRelations 
                    relación de //. Jerarquizado 
                    //Next 
                    idEnd de la internacional = GetLatestId (table.TableName); //GetIdRefs (table.TableName, filas. Longitud);
                    internacional identificación = idEnd + 1; //idEnd - filas. Longitud + 1;
                    foreach (fila de DataRow en tabla. Filas)
                    {
                        fila [“identificación”] = identificación;
                        identificación += 1;
                    }
                }
            }

        }


 internacional privada UpdateDataSet los dataRows (de DataRow [], insertCommand de DbCommand, updateCommand de DbCommand, deleteCommand de DbCommand, txn de DbTransaction, comportamiento de UpdateBehavior, la internacional updateBatchSize)
        {
            filas de la internacional;
            el usar (adaptador de DbDataAdapter = _database.GetDataAdapter ())
            {
                si ((== UpdateBehavior.Transactional del comportamiento) y falta de información del == del txn)
                {
                    el usar (dbConn de DbConnection = _database.CreateConnection ())
                    {
                        dbConn.Open ();
                        intento
                        {
                            el usar (dbTxn de DbTransaction = dbConn.BeginTransaction ())
                            {
                                intento
                                {
                                    DoUpdateDataSet (el adaptador, insertCommand, updateCommand, deleteCommand, dbTxn, comportamiento, updateBatchSize);
                                    filas = adaptador. Actualización (dataRows);
                                    dbTxn.Commit ();
                                }
                                retén
                                {
                                    dbTxn.Rollback ();
                                    tiro;
                                }
                            }
                        }
                        finalmente
                        {
                            dbConn.Close ();
                        }
                    }
                }
                
                {
                    DoUpdateDataSet (el adaptador, insertCommand, updateCommand, deleteCommand, txn, comportamiento, updateBatchSize);
                    filas = adaptador. Actualización (dataRows);
                }
            }
            filas de vuelta;
        }

 DoUpdateDataSet vacío estático privado (el adaptador de DbDataAdapter, insertCommand de DbCommand, updateCommand de DbCommand, deleteCommand de DbCommand, txn de DbTransaction, comportamiento de UpdateBehavior, la internacional updateBatchSize)
        {

            explicitAdapter = adaptador de IDbDataAdapter;
            ¡si (txn! = falta de información)
            {
                ¡si (insertCommand! = falta de información)
                    PrepareCommand (insertCommand, txn);
                ¡si (updateCommand! = falta de información)
                    PrepareCommand (updateCommand, txn);
                ¡si (deleteCommand! = falta de información)
                    PrepareCommand (deleteCommand, txn);
            }
            ¡si (insertCommand! = falta de información)
            {
                insertCommand.CommandTimeout = 120;
                explicitAdapter.InsertCommand = insertCommand;
            }
            ¡si (updateCommand! = falta de información)
            {
                updateCommand.CommandTimeout = 120;
                explicitAdapter.UpdateCommand = updateCommand;
            }
            ¡si (deleteCommand! = falta de información)
            {
                deleteCommand.CommandTimeout = 120;
                explicitAdapter.DeleteCommand = deleteCommand;
            }

            si (updateBatchSize la vuelta del == 1);
            adapter.UpdateBatchSize = updateBatchSize;
            ¡si (insertCommand! = falta de información)
                adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
            ¡si (updateCommand! = falta de información)
                adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
            ¡si (deleteCommand! = falta de información)
                adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
        }

        PrepareCommand vacío estático privado (comando de DbCommand, txn de DbTransaction)
        {
            comando. Transacción = txn;
            comando. Conexión = txn. Conexión;
            comando. Prepararse ();
        }

   internacional privada DeleteDataTable (DataTable dtTable, txn de DbTransaction)
        {
            strDelete de la secuencia = “cancelación de” + dtTable.TableName + “donde”;
            foreach (columna de DataColumn en dtTable.PrimaryKey)
            {
                strDelete = strDelete + column.ColumnName + “=” + _paramStart + column.ColumnName + “y”;
            }
            strDelete = strDelete.Substring (0, strDelete.Length - 5);
            deleteCommand de DbCommand = _database.GetSqlStringCommand (strDelete);
            //For cada fila como Data.DataRow en dtTable.Rows 
            foreach (columna de DataColumn en dtTable.PrimaryKey)
            {
                //db.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), fila. Artículo (column.ColumnName, DataRowVersion.Original)) 
                _database.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), column.ColumnName, DataRowVersion.Current);
            }
            UpdateDataSet de vuelta (dtTable.Select ("", "", DataViewRowState.Deleted), falta de información, falta de información, deleteCommand, txn, UpdateBehavior.Standard, 0);
        }
class= del

Respuesta : ¿Agregando papeles a los papeles en abastecedor de encargo de la calidad de miembro - una mejor manera? C#, SQL, Oracle, ASP.NET

Los pedacitos son pedacitos, usted puede solamente hacer la transferencia más rápido teniendo una pipa más grande to/from el almacenaje, y un arsenal más rápido del almacenaje.  

Las fotos están en marcha, usted pueden incluso programarlos.  Entonces usted puede realizar un respaldo en la foto con la VM todavía que funciona.  Una vez más GUARDARSE de la degradación de funcionamiento en su arsenal del almacenaje.

Usted puede automatizar absolutamente la parada, la exportación y la recuperación.  Usted puede contar en las VM para venir respaldo mientras el su scripting sea bueno y probado bien.

Bonito mucho todo que usted quiere está ya en el lanzamiento 5.6 de XenServer.  También comprobar hacia fuera StorageLink, que viene con empresa de XS, y realza más lejos estas funciones.
Otras soluciones  
 
programming4us programming4us