Also, zuerst dynamisch die Parameter der Stored Procedures auslesen.Dabei wird die ermittelte ParameterCollection im Applicationscache gespeichert und zuküftig auch von dort immer geholt.
1: private static void DiscoverParameters(SqlCommand command, string spName)
2: {
3: //CacheKey
4: string CacheKey = string.Concat("SP_", spName);
5:
6: //Check if SP is in Cache
7: if (System.Web.HttpContext.Current.Cache[CacheKey] == null)
8: {
9: SqlCommandBuilder.DeriveParameters(command);
10: SqlParameterCollection paramCollection = command.Parameters;
11:
12: //SqlParameter Array
13: SqlParameter[] sqlParam = new SqlParameter[paramCollection.Count];
14: paramCollection.CopyTo(sqlParam, 0);
15:
16: System.Web.HttpRuntime.Cache[CacheKey] = sqlParam;
17: }
18: else
19: {
20: //Read from Cache
21: SqlParameter[] sqlParam = (SqlParameter[])
22: CacheHelperWeb.GetApplicationCacheElement(CacheKey);
23:
24: //Add to Command
25: for (int i = 0; i < sqlParam.Length; i++)
26: {
27: SqlParameter item = (SqlParameter)
28: ((ICloneable)sqlParam[i]).Clone();
29: command.Parameters.Add(item);
30: }
31: }
32: }
Dann mit Werten befüllen. Es wird eine for Schleife verwendet da bei Collections sich etwas schneller als eine foreach Schleife verhält.
1: private static void FillParametersValues(SqlCommand command,
2: params object[] parameterValues)
3: {
4: int index = 0;
5: int count=command.Parameters.Count;
6:
7: for (int i=0;i<count;i++)
8: {
9: if ((command.Parameters[i].Direction == ParameterDirection.Input)||
10: (command.Parameters[i].Direction == ParameterDirection.InputOutput))
11: {
12: command.Parameters[i].Value = parameterValues[index];
13: index++;
14: }
15: }
16: }
und die Zugriffsmethode:
1: public static void ExecuteNonQueryIntern(string storedProcedureName,
2: params object[] parameterValue)
3: {
4:
5: using (SqlConnection connection = new SqlConnection(CONNECTIONSTRING))
6: {
7:
8: using (SqlCommand command = new SqlCommand
9: (storedProcedureName,connection))
10: {
11: command.CommandType = CommandType.StoredProcedure;
12:
13: DiscoverParameters(command, storedProcedureName);
14: FillParametersValues(command, parameterValue);
15:
16:
17: command.ExecuteNonQuery();
18: command.Parameters.Clear();
19: }
20: }
21: }
Jetzt nur noch Errorhandling und Logging einbauen und fertig. Analog kann das ganze auch für ExecuteScalar oder ExecuteReader angewandt werden. War doch ganz einfach oder?
Hier noch ein Zugriffsbeispiel:
ExecuteNonQueryIntern("SP_UpdateData",1893,"Max","Mustermann");
Keine Kommentare:
Kommentar veröffentlichen