Fråga : Tillfoga roller till roller i den beställnings- medlemskapfamiljeförsörjaren - ett bättre långt? C# SQL, Oracle, ASP.NET

Jag behöver att finna ett bättre långt till räddningroller till roller i vår beställnings- mebershipfamiljeförsörjare - som av rifgr nu, är här bordlägga:

Currently för
ParentRoleID (FK för
RoleID (FK för

ID (PK) till aspnet_Roles.ID) till aspnet_Roles.ID), är här kliver som är van vid tillfogar en roll (vi ska appell denna c-roll) till en annan

- för roll (vi ska appell denna p-roll) får alla av strömförälder roller av p-rollen, alla av förälder förälderroller, alla av förälderförälder roller för förälder, och så vidare och så vidare och sätter releventdataen in i data bordlägger (as well as samma för c-rollen.)borttagnings för

- alla av tillträden för c-rollen med ett datatable av denroller parents
- tillfogar allra bordlägga som vi har samlat, att vi tog precis bort, tillsammans med de nya datan som angår föräldern, förmiddagen för role

I där hoppas, är någon ut där vem har tacklat detta för, som jag skulle något liknande för att finna ett bättre långt för att göra detta, såväl som finner ett bättre för datan tar fram långt lagrarfunktionsduglighet att jag har inklusive nedanfört - allt fungerar, I önskar precis en mer snabb, mindre invecklad DAL och om möjligheten ett annat alternativ om tillgängligt - tack i förskott för din kunskap!
> för
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:
" codeBody " " notpretty class= " för starta appell offentlig bool SetRoles (DataTable dtRoles, stränger roleId), { DataTable dtDeleteRoles = GetParentRolesInRole (roleId); dtDeleteRoles.TableName = String.Format (”RolesInRoles”); CreatePrimaryKey (dtDeleteRoles, ”ID”); dtRoles.TableName = String.Format (”RolesInRoles”); boolresultat = UpdateTable (dtRoles, dtDeleteRoles); återgångt resultat; } Nedanföra // här är alla fungerar använt i denna appell - någon // bantar denna besegrar alls eller finner ett bättre långt? offentliga DataTable GetParentRolesInRole (stränga roleId), { stränga sqlCommand = (@ ", VÄLJ RolesInRoles.RoleId, aspnet_Roles.RoleName, RolesInRoles.ParentRoleId FRÅN RolesInRoles INRE SAMMANFOGA aspnet_Roles PÅ ParentRoleId = aspnet_Roles.RoleId VAR RolesInRoles.RoleId = ”{0}”, ”); sqlCommand = stränger. Formatera (sqlCommand, roleId); DbCommand dbCommand = _database.GetSqlStringCommand (sqlCommand); återgång _database.ExecuteDataSet (dbCommand). Bordlägger [0]; } offentliga utan laga kraft CreatePrimaryKey (dtbTable DataTable, stränger strColumnName), { DataColumn [] dcCol = nya DataColumn [1]; dcCol [0] = dtbTable.Columns [strColumnName]; dtbTable.PrimaryKey = dcCol; } offentlig bool UpdateTable (DataTable tillfogar, DataTable borttagnings), { använda (DbConnection dbConn = _database.CreateConnection ()) { dbConn.Open (); försök { använda (DbTransaction dbTxn = dbConn.BeginTransaction ()) { försök { om (tillfoga. Rows.Count > 0), { UpdateInsertDataTable (tillfoga, dbTxn); } om (borttagnings. Rows.Count > 0) { för (int i = 0; borttagnings. Rows.Count - 1 för <= i; i++) { borttagnings. Ror [I]. Borttagnings (); } DeleteDataTable (borttagnings, dbTxn); } dbTxn.Commit (); } fånga { dbTxn.Rollback (); gå falskt tillbaka; } } } slutligen { dbConn.Close (); } } återgångt true; } privat int UpdateInsertDataTable (dtTable, DbTransaction txn DataTable) { stränga strInsert = ”MELLANLÄGGET IN I” + dtTable.TableName + ”(”; stränga strUpdate = ”UPPDATERINGEN” + dtTable.TableName + ”UPPSÄTTNINGEN”; för (int i = 0; i <= dtTable.Columns.Count - 1; i++) { om (_database.DbProviderFactory.ToString (). Innehåller (”Oracle”)) { strInsert = strInsert + dtTable.Columns [I] .ColumnName + ”,”; strUpdate = strUpdate + dtTable.Columns [I] .ColumnName + ”=” + _paramStart + dtTable.Columns [I] .ColumnName + ”,”; } annars { strInsert = strInsert + ”[” + dtTable.Columns [I] .ColumnName + ”],”; strUpdate = strUpdate + ”[” + dtTable.Columns [I] .ColumnName + ”] =” + _paramStart + dtTable.Columns [I] .ColumnName + ”,”; } } strInsert = strInsert.Substring (0, strInsert.Length - 1) + ”) värderar (”; för (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) + ”VAR”; foreach (DataColumn kolonn i dtTable.PrimaryKey) { strUpdate = strUpdate + column.ColumnName + ”=” + _paramStart + column.ColumnName + ”OCH”; } strUpdate = strUpdate.Substring (0, strUpdate.Length - 5); DbCommand insertCommand = _database.GetSqlStringCommand (strInsert); DbCommand updateCommand = _database.GetSqlStringCommand (strUpdate); för (int i = 0; i <= dtTable.Columns.Count - 1; i++) { DbType typ = GetDataType (dtTable.Columns [I] .DataType); _database.AddInParameter (insertCommand, dtTable.Columns [I] .ColumnName, typ, dtTable.Columns [I] .ColumnName, DataRowVersion.Current); _database.AddInParameter (updateCommand, dtTable.Columns [I] .ColumnName, typ, dtTable.Columns [I] .ColumnName, DataRowVersion.Current); om (! (typ== DbType.String | typ== DbType.AnsiString)) fortsätta; insertCommand.Parameters [_paramStart + dtTable.Columns [I] .ColumnName]. Storleksanpassa = dtTable.Columns [I] .MaxLength; updateCommand.Parameters [_paramStart + dtTable.Columns [I] .ColumnName]. Storleksanpassa = dtTable.Columns [I] .MaxLength; } (dtTable) GetIdsForTable; återgång UpdateDataSet (dtTable.Select ("", ""), insertCommand, updateCommand, ogiltigt, txn, UpdateBehavior.Standard, 0); //DataViewRowState.ModifiedCurrent | DataViewRowState.Added } privata utan laga kraft GetIdsForTable (DataTable bordlägger), { om (bordlägga. Columns.Contains (”ID”)) { om (bordlägga. Falsk == för kolonner [”ID”] .AutoIncrement) { //For varje förhållande som DataRelation i table.ChildRelations // förhållande. Bygga bo //Next int-idEnd = GetLatestId (table.TableName); //GetIdRefs (table.TableName, ror. Längd); int ID = idEnd + 1; //idEnd - ror. Längd + 1; foreach (DataRow ror bordlägger in. Ror), { ro [”ID”] = ID; ID += 1; } } } } privat int UpdateDataSet (DataRow [] dataRows, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand, DbTransaction txn, UpdateBehavior uppförande, int updateBatchSize), { int ror; använda (DbDataAdapter adapter = _database.GetDataAdapter ()) { om ((uppförande== UpdateBehavior.Transactional) & ogiltig txn==) { använda (DbConnection dbConn = _database.CreateConnection ()) { dbConn.Open (); försök { använda (DbTransaction dbTxn = dbConn.BeginTransaction ()) { försök { DoUpdateDataSet (adapteren, insertCommand, updateCommand, deleteCommand, dbTxn, uppförande, updateBatchSize); ror = adapteren. Uppdatering (dataRows); dbTxn.Commit (); } fånga { dbTxn.Rollback (); kast; } } } slutligen { dbConn.Close (); } } } annars { DoUpdateDataSet (adapteren, insertCommand, updateCommand, deleteCommand, txn, uppförande, updateBatchSize); ror = adapteren. Uppdatering (dataRows); } } gå tillbaka ror; } privat statisk elektricitet utan laga kraft DoUpdateDataSet (den DbDataAdapter adapteren, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand, DbTransaction txn, UpdateBehavior uppförande, int updateBatchSize), { IDbDataAdapter explicitAdapter = adapter; om (txn! = ogiltigt) { om (insertCommand! = ogiltigt) PrepareCommand (insertCommand, txn); om (updateCommand! = ogiltigt) PrepareCommand (updateCommand, txn); om (deleteCommand! = ogiltigt) PrepareCommand (deleteCommand, txn); } om (insertCommand! = ogiltigt) { insertCommand.CommandTimeout = 120; explicitAdapter.InsertCommand = insertCommand; } om (updateCommand! = ogiltigt) { updateCommand.CommandTimeout = 120; explicitAdapter.UpdateCommand = updateCommand; } om (deleteCommand! = ogiltigt) { deleteCommand.CommandTimeout = 120; explicitAdapter.DeleteCommand = deleteCommand; } om (updateBatchSize == 1), retur; adapter.UpdateBatchSize = updateBatchSize; om (insertCommand! = ogiltigt) adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; om (updateCommand! = ogiltigt) adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; om (deleteCommand! = ogiltigt) adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; } privat statisk elektricitet utan laga kraft PrepareCommand (DbCommand befaller, DbTransaction txn), { befalla. Transaktion = txn; befalla. Anslutning = txn. Anslutning; befalla. Förbered sig (); } privat int DeleteDataTable (dtTable, DbTransaction txn DataTable) { stränga strDelete = ”borttagnings från” + dtTable.TableName + ”var”; foreach (DataColumn kolonn i dtTable.PrimaryKey) { strDelete = strDelete + column.ColumnName + ”=” + _paramStart + column.ColumnName + ”och”; } strDelete = strDelete.Substring (0, strDelete.Length - 5); DbCommand deleteCommand = _database.GetSqlStringCommand (strDelete); //For varje ror som Data.DataRow i dtTable.Rows foreach (DataColumn kolonn i dtTable.PrimaryKey) { //db.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), ror. Objekt (column.ColumnName, DataRowVersion.Original)) _database.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), column.ColumnName, DataRowVersion.Current); } återgång UpdateDataSet (dtTable.Select ("", "", DataViewRowState.Deleted), ogiltigt, ogiltigt, deleteCommand, txn, UpdateBehavior.Standard, 0); }
" klar "

Svar : Tillfoga roller till roller i den beställnings- medlemskapfamiljeförsörjaren - ett bättre långt? C# SQL, Oracle, ASP.NET

Bitar är bitar, du kan endast göra överföringen mer snabb genom att ha både ett större att leda i rör to/from lagringen och en snabbare lagringssamling.  

Kort är - - flyger på, dig kan även planlagd dem.  Därefter du kan utföra en reserv på kortet med det stilla springet för VM.  AKTA SIG av kapacitetsdegradering på din lagringssamling, igen.

Du kan absolut automatisera avstängningen, exporten och återställningen.  Du kan räkna på VMsna för att komma säkerhetskopia, så länge som ditt skriva är bra och väl testat.

Nätt mycket allt som du önskar, är redan i frigöraren 5.6 av XenServer.  Kontrollera också ut StorageLink, som kommer med XS-företag, och förhöjer vidare dessa fungerar.
Andra lösningar  
 
programming4us programming4us