Frage : Rollen Rollen im kundenspezifischen Mitgliedschafts-Versorger - eine bessere Weise hinzufügen? C#, SQL, Oracle, ASP.NET

Ich muss eine bessere Weise finden, Rollen zu den Rollen in unserem kundenspezifischen mebership Versorger zu speichern - ab rifgr jetzt, ist hier die Tabelle:

ID (PK)
RoleID (FK zu aspnet_Roles.ID)
ParentRoleID (FK zu aspnet_Roles.ID)

Currently, sind hier die Schritte, die verwendet werden, um eine Rolle (uns benennen diese Crolle) einem anderen Rolle (wir benennen diese Prolle)

- hinzuzufügen erhalten allem gegenwärtigen Elternteil Rollen der Prolle, Elternteilrollen alles Elternteils, Elternteilrollen alles Elternteilelternteils, und so weiter und so weiter und setzen das releventdata in eine Datentabelle (sowie die selben für die Crolle.)

- Löschung alle Eintragungen für die Crolle mit einem datatable alles Crollen parents

- addieren die Tabelle, die, wir, dass wir gerade löschten, zusammen mit den neuen Daten hinsichtlich des Elternteil role

I morgens hoffend gesammelt haben, dass es jemand heraus dort gibt, wem dieses, da ich eine bessere Weise finden möchte, dies zu tun, sowie finden eine bessere Weise für die Datenzugangs-Schichtfunktionalität, die ich vor unten eingeschlossen habe - alles arbeitet, ich wünschen gerade ein schnelleres, weniger schwieriges Dal angepackt hat, und wenn möglich eine andere, Wahl, wenn vorhanden - Dank im Voraus für Ihr Wissen!
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:
6:
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:
 Startaufruf

        allgemeines bool SetRoles (DataTable dtRoles, Schnur roleId)
        {
            DataTable dtDeleteRoles = GetParentRolesInRole (roleId);
            dtDeleteRoles.TableName = String.Format („RolesInRoles“);
            CreatePrimaryKey (dtDeleteRoles, „Identifikation“);
            dtRoles.TableName = String.Format („RolesInRoles“);
            bool Resultat = UpdateTable (dtRoles, dtDeleteRoles);
            Rückholresultat;
        }

// hier unter sind alle Funktionen, die in diesem Anruf - jedermann verwendet werden 
// nehmen dieses unten überhaupt ab oder finden eine bessere Weise?

        allgemeines DataTable GetParentRolesInRole (Schnur roleId)
        {
            Schnur sqlCommand = (@ "
                RolesInRoles.RoleId, aspnet_Roles.RoleName, RolesInRoles.ParentRoleId VORWÄHLEN 
                VON RolesInRoles 
                INNER aspnet_Roles sich ANSCHLIESSEN
	                AUF ParentRoleId = aspnet_Roles.RoleId
                WO RolesInRoles.RoleId = „{0}“
                ");
            sqlCommand = Schnur. Format (sqlCommand, roleId);
            DbCommand dbCommand = _database.GetSqlStringCommand (sqlCommand);
            Rückhol_database.ExecuteDataSet (dbCommand). Tabellen [0];
        }


        Öffentlichkeit leeres CreatePrimaryKey (DataTable dtbTable, Schnur strColumnName)
        {
            DataColumn [] dcCol = neues DataColumn [1];
            dcCol [0] = dtbTable.Columns [strColumnName];
            dtbTable.PrimaryKey = dcCol;
        }


  allgemeines bool UpdateTable (DataTable fügen hinzu, DataTable Löschung)
        {
            Anwendung (DbConnection dbConn = _database.CreateConnection ())
            {
                dbConn.Open ();
                Versuch
                {
                    Anwendung (DbTransaction dbTxn = dbConn.BeginTransaction ())
                    {
                        Versuch
                        {
                            wenn (hinzufügen. Rows.Count > 0)
                            {
                                UpdateInsertDataTable (, dbTxn hinzufügen);
                            }
                            wenn (Löschung. Rows.Count > 0)
                            {
                                für (int I = 0; <= I Löschung. Rows.Count - 1; i++)
                                {
                                    Löschung. Reihen [i]. Löschung ();
                                }
                                DeleteDataTable (Löschung, dbTxn);
                            }
                            dbTxn.Commit ();
                        }
                        Fang
                        {
                            dbTxn.Rollback ();
                            Rückholfalsches;
                        }
                    }
                }
                schließlich
                {
                    dbConn.Close ();
                }
            }
            Rückhol ausrichten;
        }

  privater int UpdateInsertDataTable (DataTable dtTable, DbTransaction txn)
        {
            Schnur strInsert = „EINSATZ IN“ + dtTable.TableName + „(“;
            Schnur strUpdate = „UPDATE“ + dtTable.TableName + „STELLTE“ ein;

            für (int I = 0; I <= dtTable.Columns.Count - 1; i++)
            {
                wenn (_database.DbProviderFactory.ToString (). Enthält („Oracle“))
                {
                    strInsert = strInsert + dtTable.Columns [i] .ColumnName + „,“;
                    strUpdate = strUpdate + dtTable.Columns [i] .ColumnName + „=“ + _paramStart + dtTable.Columns [i] .ColumnName + „,“;
                }
                sonst
                {
                    strInsert = strInsert + „[“ + dtTable.Columns [i] .ColumnName + „],“;
                    strUpdate = strUpdate + „[“ + dtTable.Columns [i] .ColumnName + „] =“ + _paramStart + dtTable.Columns [i] .ColumnName + „,“;
                }
            }

            strInsert = strInsert.Substring (0, strInsert.Length - 1) + ") Werte (“;
            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) + „WO“;
            foreach (DataColumn Spalte in dtTable.PrimaryKey)
            {
                strUpdate = strUpdate + column.ColumnName + „=“ + _paramStart + column.ColumnName + „UND“;
            }
            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 Art = GetDataType (dtTable.Columns [i] .DataType);
                _database.AddInParameter (insertCommand, dtTable.Columns [i] .ColumnName, Art, dtTable.Columns [i] .ColumnName, DataRowVersion.Current);
                _database.AddInParameter (updateCommand, dtTable.Columns [i] .ColumnName, Art, dtTable.Columns [i] .ColumnName, DataRowVersion.Current);
                wenn (! (Art == DbType.String | == DbType.AnsiString schreiben)) fortfahren;
                insertCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Größe = dtTable.Columns [i] .MaxLength;
                updateCommand.Parameters [_paramStart + dtTable.Columns [i] .ColumnName]. Größe = dtTable.Columns [i] .MaxLength;
            }
            GetIdsForTable (dtTable);

            RückholUpdateDataSet (dtTable.Select ("", ""), insertCommand, updateCommand, Null, txn, UpdateBehavior.Standard, 0); //DataViewRowState.ModifiedCurrent | DataViewRowState.Added
        }

      privates leeres GetIdsForTable (DataTable Tabelle)
        {
            wenn (Tabelle. Columns.Contains („Identifikation“))
            {
                wenn (Tabelle. Spalten [„Identifikation“] .AutoIncrement == falsch)
                {
                    //For jede Relation als DataRelation in table.ChildRelations 
                    //-Relation. Genistet 
                    //Next 
                    int idEnd = GetLatestId (table.TableName); //GetIdRefs (table.TableName, Reihen. Länge);
                    int Identifikation = idEnd + 1; //idEnd - Reihen. Länge + 1;
                    foreach (DataRow Reihe in der Tabelle. Reihen)
                    {
                        Reihe [„Identifikation“] = Identifikation;
                        Identifikation += 1;
                    }
                }
            }

        }


 privater int UpdateDataSet (DataRow [] dataRows, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand, DbTransaction txn, UpdateBehavior Verhalten, int updateBatchSize)
        {
            int-Reihen;
            Anwendung (DbDataAdapter Adapter = _database.GetDataAdapter ())
            {
                wenn ((Verhalten == UpdateBehavior.Transactional) u. txn == Null)
                {
                    Anwendung (DbConnection dbConn = _database.CreateConnection ())
                    {
                        dbConn.Open ();
                        Versuch
                        {
                            Anwendung (DbTransaction dbTxn = dbConn.BeginTransaction ())
                            {
                                Versuch
                                {
                                    DoUpdateDataSet (Adapter, insertCommand, updateCommand, deleteCommand, dbTxn, Verhalten, updateBatchSize);
                                    Reihen = Adapter. Update (dataRows);
                                    dbTxn.Commit ();
                                }
                                Fang
                                {
                                    dbTxn.Rollback ();
                                    Wurf;
                                }
                            }
                        }
                        schließlich
                        {
                            dbConn.Close ();
                        }
                    }
                }
                sonst
                {
                    DoUpdateDataSet (Adapter, insertCommand, updateCommand, deleteCommand, txn, Verhalten, updateBatchSize);
                    Reihen = Adapter. Update (dataRows);
                }
            }
            Rückholreihen;
        }

 privates statisches leeres DoUpdateDataSet (DbDataAdapter Adapter, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand, DbTransaction txn, UpdateBehavior Verhalten, int updateBatchSize)
        {

            IDbDataAdapter explicitAdapter = Adapter;
            wenn (txn! = Null)
            {
                wenn (insertCommand! = Null)
                    PrepareCommand (insertCommand, txn);
                wenn (updateCommand! = Null)
                    PrepareCommand (updateCommand, txn);
                wenn (deleteCommand! = Null)
                    PrepareCommand (deleteCommand, txn);
            }
            wenn (insertCommand! = Null)
            {
                insertCommand.CommandTimeout = 120;
                explicitAdapter.InsertCommand = insertCommand;
            }
            wenn (updateCommand! = Null)
            {
                updateCommand.CommandTimeout = 120;
                explicitAdapter.UpdateCommand = updateCommand;
            }
            wenn (deleteCommand! = Null)
            {
                deleteCommand.CommandTimeout = 120;
                explicitAdapter.DeleteCommand = deleteCommand;
            }

            wenn (== 1) Rückkehr updateBatchSize;
            adapter.UpdateBatchSize = updateBatchSize;
            wenn (insertCommand! = Null)
                adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
            wenn (updateCommand! = Null)
                adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
            wenn (deleteCommand! = Null)
                adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
        }

        privates statisches leeres PrepareCommand (DbCommand Befehl, DbTransaction txn)
        {
            Befehl. Verhandlung = txn;
            Befehl. Anschluss = txn. Anschluss;
            Befehl. Vorbereiten ();
        }

   privater int DeleteDataTable (DataTable dtTable, DbTransaction txn)
        {
            Schnur strDelete = „Löschung von“ + dtTable.TableName + „wo“;
            foreach (DataColumn Spalte in dtTable.PrimaryKey)
            {
                strDelete = strDelete + column.ColumnName + „=“ + _paramStart + column.ColumnName + „und“;
            }
            strDelete = strDelete.Substring (0, strDelete.Length - 5);
            DbCommand deleteCommand = _database.GetSqlStringCommand (strDelete);
            //For jede Reihe als Data.DataRow in dtTable.Rows 
            foreach (DataColumn Spalte in dtTable.PrimaryKey)
            {
                //db.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), Reihe. Einzelteil (column.ColumnName, DataRowVersion.Original)) 
                _database.AddInParameter (deleteCommand, column.ColumnName, GetDataType (column.DataType), column.ColumnName, DataRowVersion.Current);
            }
            RückholUpdateDataSet (dtTable.Select ("", "", DataViewRowState.Deleted), Null, Null, deleteCommand, txn, UpdateBehavior.Standard, 0);
        }

Antwort : Rollen Rollen im kundenspezifischen Mitgliedschafts-Versorger - eine bessere Weise hinzufügen? C#, SQL, Oracle, ASP.NET

Spitzen sind Spitzen, Sie kann die Übertragung indem Sie ein grösseres Rohr to/from die Lagerung und eine schnellere Speicherreihe schneller nur bilden haben.  

Schnappschüsse sind, Sie können sie sogar festlegen Schnell.  Dann können Sie eine Unterstützung auf dem Schnappschuß mit der noch laufenden VM durchführen.  Wieder von der Leistungsverminderung auf Ihrer Speicherreihe AUFPASSEN.

Sie können die Abschaltung, den Export und die Wiederaufnahme absolut automatisieren.  Sie können auf den VMs zählen, um zu kommen Unterstützung, solange Ihr scripting gut und gut geprüft ist.

Ziemlich genau alles, das Sie wünschen, ist bereits in der Freigabe 5.6 von XenServer.  StorageLink auch heraus überprüfen, das mit XS Unternehmen kommt, und erhöht weiter diese Funktionen.
Weitere Lösungen  
 
programming4us programming4us