Questione : Aggiungendo i ruoli ai ruoli nel fornitore su ordinazione di insieme dei membri - un migliore senso? C#, SQL, Oracle, ASP.NET

Devo trovare un migliore senso conservare i ruoli ai ruoli nel nostro fornitore su ordinazione di mebership - a partire da rifgr ora, qui è la tabella: il

Currently del
ParentRoleID (FK del
RoleID (FK del

ID (PK) a aspnet_Roles.ID) a aspnet_Roles.ID), qui è i punti che sono usati per aggiungere un ruolo (denomineremo questo c-ruolo) ad un altro

- di ruolo (denomineremo questo p-ruolo) ottengono a tutto genitore corrente i ruoli del p-ruolo, i ruoli del genitore di tutto genitore, i ruoli del genitore di tutto genitore del genitore ed e così via ed e così via e mettono il releventdata in una tabella di dati (così come lo stessi per il c-ruolo.)la cancellazione del

- tutte entrate per il c-ruolo con un datatable di tutto parents

- di c-ruoli aggiunge la tabella ci siamo raccolti che abbiamo cancellato appena, con i nuovi dati riguardo al role

I del genitore speranti che ci sia qualcuno fuori là di chi ha affrontato questo prima, poichè avrei voluto trovare un migliore senso fare questo, come pure trovano un migliore senso per la funzionalità di strato di accesso di dati che ho compreso sotto - tutto funziona, io appena vogliono un dal più rapido e meno complicato e se possibile un'altra opzione se disponibile - ringraziamenti in anticipo per la vostra conoscenza!
class= > " libero " 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
 chiamata iniziare

        bool pubblico SetRoles (dtRoles di DataTable, roleId della stringa)
        {
            dtDeleteRoles di DataTable = GetParentRolesInRole (roleId);
            dtDeleteRoles.TableName = String.Format (“RolesInRoles„);
            CreatePrimaryKey (dtDeleteRoles, “identificazione„);
            dtRoles.TableName = String.Format (“RolesInRoles„);
            risultato di bool = UpdateTable (dtRoles, dtDeleteRoles);
            risultato di ritorno;
        }

// qui sotto è tutte le funzioni utilizzate in questa chiamata - chiunque 
// dimagrisce questo giù affatto, o trova un migliore senso?

        DataTable pubblico GetParentRolesInRole (roleId della stringa)
        {
            sqlCommand della stringa = (@ "
                SELEZIONARE RolesInRoles.RoleId, aspnet_Roles.RoleName, RolesInRoles.ParentRoleId 
                Da RolesInRoles 
                INTERNO UNIRE i aspnet_Roles
	                Su ParentRoleId = su aspnet_Roles.RoleId
                DOVE RolesInRoles.RoleId = “{0}„
                ");
            sqlCommand = stringa. Disposizione (sqlCommand, roleId);
            dbCommand di DbCommand = _database.GetSqlStringCommand (sqlCommand);
            _database.ExecuteDataSet di ritorno (dbCommand). Tabelle [0];
        }


        pubblico CreatePrimaryKey vuoto (DataTable dtbTable, strColumnName della stringa)
        {
            dcCol di DataColumn [] = nuovo DataColumn [1];
            dcCol [0] = dtbTable.Columns [strColumnName];
            dtbTable.PrimaryKey = dcCol;
        }


  bool pubblico UpdateTable (DataTable aggiunge, la cancellazione di DataTable)
        {
            usando (dbConn di DbConnection = _database.CreateConnection ())
            {
                dbConn.Open ();
                prova
                {
                    usando (dbTxn di DbTransaction = dbConn.BeginTransaction ())
                    {
                        prova
                        {
                            se (aggiungere. Rows.Count > 0)
                            {
                                UpdateInsertDataTable (aggiungere, dbTxn);
                            }
                            se (cancellazione. Rows.Count > 0)
                            {
                                per (int i = 0; cancellazione. Rows.Count - 1 del <= i; i++)
                                {
                                    cancellazione. File [i]. Cancellazione ();
                                }
                                DeleteDataTable (cancellazione, dbTxn);
                            }
                            dbTxn.Commit ();
                        }
                        fermo
                        {
                            dbTxn.Rollback ();
                            falso di ritorno;
                        }
                    }
                }
                infine
                {
                    dbConn.Close ();
                }
            }
            di ritorno allineare;
        }

  int riservato UpdateInsertDataTable (DataTable dtTable, txn di DbTransaction)
        {
            strInsert della stringa = “INSERTO IN„ + dtTable.TableName + “(";
            lo strUpdate della stringa = “AGGIORNAMENTO„ + dtTable.TableName + “SI È REGOLATO„;

            per (int i = 0; i <= dtTable.Columns.Count - 1; i++)
            {
                se (_database.DbProviderFactory.ToString (). Contiene (“Oracle„))
                {
                    strInsert = strInsert + dtTable.Columns [i] .ColumnName + “,„;
                    strUpdate = strUpdate + dtTable.Columns [i] .ColumnName + “=„ + _paramStart + dtTable.Columns [i] .ColumnName + “,„;
                }
                altrimenti
                {
                    strInsert = strInsert + “[„ + dtTable.Columns [i] .ColumnName + “],„;
                    strUpdate = strUpdate + “[„ + dtTable.Columns [i] .ColumnName + “] =„ + _paramStart + dtTable.Columns [i] .ColumnName + “,„;
                }
            }

            strInsert = valori di strInsert.Substring (0, strInsert.Length - 1) + ") (";
            per (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) + “DOVE„;
            foreach (colonna di DataColumn in dtTable.PrimaryKey)
            {
                strUpdate = strUpdate + column.ColumnName + “=„ + _paramStart + column.ColumnName + “E„;
            }
            strUpdate = strUpdate.Substring (0, strUpdate.Length - 5);

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

            per (int i = 0; i <= dtTable.Columns.Count - 1; i++)
            {
                Tipo di 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 | scriv il == a macchina DbType.AnsiString)) continuare;
                insertCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Formato = dtTable.Columns [i] .MaxLength;
                updateCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Formato = dtTable.Columns [i] .MaxLength;
            }
            GetIdsForTable (dtTable);

            UpdateDataSet di ritorno (dtTable.Select ("", ""), insertCommand, updateCommand, posizione di segnale minimo, txn, UpdateBehavior.Standard, 0); //DataViewRowState.ModifiedCurrent | DataViewRowState.Added
        }

      GetIdsForTable vuoto riservato (tabella di DataTable)
        {
            se (tabella. Columns.Contains (“identificazione„))
            {
                se (tabella. == delle colonne [“identificazione„] .AutoIncrement falso)
                {
                    //For ogni rapporto come DataRelation in table.ChildRelations 
                    rapporto di //. Annidato 
                    //Next 
                    idEnd di int = GetLatestId (table.TableName); //GetIdRefs (table.TableName, file. Lunghezza);
                    int identificazione = idEnd + 1; //idEnd - file. Lunghezza + 1;
                    foreach (fila di DataRow in tabella. File)
                    {
                        fila [“identificazione„] = identificazione;
                        identificazione += 1;
                    }
                }
            }

        }


 int riservato UpdateDataSet (i dataRows di DataRow [], il insertCommand di DbCommand, il updateCommand di DbCommand, il deleteCommand di DbCommand, il txn di DbTransaction, il comportamento di UpdateBehavior, il int updateBatchSize)
        {
            file di int;
            usando (adattatore di DbDataAdapter = _database.GetDataAdapter ())
            {
                se ((== UpdateBehavior.Transactional di comportamento) & posizione di segnale minimo del == del txn)
                {
                    usando (dbConn di DbConnection = _database.CreateConnection ())
                    {
                        dbConn.Open ();
                        prova
                        {
                            usando (dbTxn di DbTransaction = dbConn.BeginTransaction ())
                            {
                                prova
                                {
                                    DoUpdateDataSet (adattatore, il insertCommand, il updateCommand, il deleteCommand, il dbTxn, comportamento, updateBatchSize);
                                    file = adattatore. Aggiornamento (dataRows);
                                    dbTxn.Commit ();
                                }
                                fermo
                                {
                                    dbTxn.Rollback ();
                                    tiro;
                                }
                            }
                        }
                        infine
                        {
                            dbConn.Close ();
                        }
                    }
                }
                altrimenti
                {
                    DoUpdateDataSet (adattatore, il insertCommand, il updateCommand, il deleteCommand, il txn, comportamento, updateBatchSize);
                    file = adattatore. Aggiornamento (dataRows);
                }
            }
            file di ritorno;
        }

 DoUpdateDataSet vuoto statico riservato (l'adattatore di DbDataAdapter, il insertCommand di DbCommand, il updateCommand di DbCommand, il deleteCommand di DbCommand, il txn di DbTransaction, il comportamento di UpdateBehavior, il int updateBatchSize)
        {

            explicitAdapter = adattatore di IDbDataAdapter;
            se (txn! = posizione di segnale minimo)
            {
                se (insertCommand! = posizione di segnale minimo)
                    PrepareCommand (insertCommand, txn);
                se (updateCommand! = posizione di segnale minimo)
                    PrepareCommand (updateCommand, txn);
                se (deleteCommand! = posizione di segnale minimo)
                    PrepareCommand (deleteCommand, txn);
            }
            se (insertCommand! = posizione di segnale minimo)
            {
                insertCommand.CommandTimeout = 120;
                explicitAdapter.InsertCommand = insertCommand;
            }
            se (updateCommand! = posizione di segnale minimo)
            {
                updateCommand.CommandTimeout = 120;
                explicitAdapter.UpdateCommand = updateCommand;
            }
            se (deleteCommand! = posizione di segnale minimo)
            {
                deleteCommand.CommandTimeout = 120;
                explicitAdapter.DeleteCommand = deleteCommand;
            }

            se (updateBatchSize il ritorno del == 1);
            adapter.UpdateBatchSize = updateBatchSize;
            se (insertCommand! = posizione di segnale minimo)
                adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
            se (updateCommand! = posizione di segnale minimo)
                adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
            se (deleteCommand! = posizione di segnale minimo)
                adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
        }

        PrepareCommand vuoto statico riservato (ordine di DbCommand, txn di DbTransaction)
        {
            ordine. Transazione = txn;
            ordine. Collegamento = txn. Collegamento;
            ordine. Preparare ();
        }

   int riservato DeleteDataTable (DataTable dtTable, txn di DbTransaction)
        {
            strDelete della stringa = “cancellazione da„ + dtTable.TableName + “dove„;
            foreach (colonna di DataColumn in dtTable.PrimaryKey)
            {
                strDelete = strDelete + column.ColumnName + “=„ + _paramStart + column.ColumnName + “e„;
            }
            strDelete = strDelete.Substring (0, strDelete.Length - 5);
            deleteCommand di DbCommand = _database.GetSqlStringCommand (strDelete);
            //For ogni fila come Data.DataRow in dtTable.Rows 
            foreach (colonna di DataColumn in dtTable.PrimaryKey)
            {
                //db.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), fila. Articolo (column.ColumnName, DataRowVersion.Original)) 
                _database.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), column.ColumnName, DataRowVersion.Current);
            }
            UpdateDataSet di ritorno (dtTable.Select ("", "", DataViewRowState.Deleted), posizione di segnale minimo, posizione di segnale minimo, deleteCommand, txn, UpdateBehavior.Standard, 0);
        }
class= del

Risposta : Aggiungendo i ruoli ai ruoli nel fornitore su ordinazione di insieme dei membri - un migliore senso? C#, SQL, Oracle, ASP.NET

Le punte sono punte, potete soltanto rendere il trasferimento più rapido avendo sia un più grande tubo to/from l'immagazzinaggio che un allineamento più veloce di immagazzinaggio.  

Le fotografie istantanee sono in moto, voi possono persino programmarle.  Allora potete effettuare un sostegno sulla fotografia istantanea con il VM ancora che funziona.  Di nuovo, GUARDAR DA di degradazione di prestazione sul vostro allineamento di immagazzinaggio.

Potete assolutamente automatizzare l'arresto, l'esportazione ed il recupero.  Potete contare sui VM per venire sostegno finchè vostro scripting è buon e provato bene.

Praticamente tutto che vogliate è già nel rilascio 5.6 di XenServer.  Inoltre verificare StorageLink, che viene con impresa di XS e più ulteriormente aumentato queste funzioni.
Altre soluzioni  
 
programming4us programming4us