Usando una clase y constructor dedicados para inicializar el procedimiento almacenado para la transacción SQL -- # campo con optimization campo con asp.net campo con sql-server camp codereview Relacionados El problema

Using a Dedicated Class & Constructor to initialize Stored Procedure for SQL Transaction


1
vote

problema

Español

Intentaré ser tan conciso como puedo:

El objetivo: Tratando de universalizar una sección específica de un proyecto, que está tratando con las transacciones de la base de datos SQL.

Para ayudarlo con su respuesta, he pegado lo siguiente (solo para hacer referencia):

  • Un código de uso: 9988776655544330 devuelve un DataTable

  • Clase: SQLDBInteraction es otra clase: responsable de la etapa final (transacción de SQL)

En este código a continuación, estoy construyendo lo que llamo: "Meta Data de los procedimientos almacenados". Esa clase es la que sostiene todos los SQL DB SPS.

HTSPs3 (HT son los alias de la compañía) está sujeta a cada SP requerido) Los parámetros. HTSPs La clase contiene otra clase secundaria. Para todos los nombres SP , solo tiene 9988777655544337 s para cada nombre .

  9988776655544339  

El problema es: ¿Cómo inicializo al contratista? ¿Cuál es la forma correcta de tener su simple personalizado 99887766555443310 "" Metadata "? Actualmente he completado la implementación del método a continuación (aparte de ese problema).

usage

Este es un método que devuelve DataTable1 Mientras se usa el DataTable2 clase / constructor.

  DataTable3  

actualización

Las últimas líneas del Código anterior están tratando de implementar la asignación de parámetros, por lo que ya no se requerirá que use:

DataTable4 (que es DataTable5 ).

y en su lugar, realmente me gustaría poder usar DataTable6 ya que ya se usa para la mayoría de los pasos requeridos para interactuar con la base de datos.

Así es como dejaré caer algún uso innecesario de variables adicionales, mientras que al mismo tiempo quería asignar SQLCMD ( 99887776655443317 ) con la estructura - DataTable8 real DataTable9 En lugar de usar las cadenas que representan su nombre (por ejemplo, SQLDBInteraction020 - ( 99887766555443321 ).

etapa final - transacción sql

El SQLDBInteraction2 clase que realiza la transacción:

  SQLDBInteraction3  

Realmente lo apreciaré si alguien encontrará lo que estoy haciendo mal con la parte de los parámetros del procedimiento almacenado asignados al comando SQL.

Original en ingles

I will try to be as concise as I can:

The goal: trying to universalize a specific section of a project, that is dealing with the SQL database transactions.

To assist you with your answer, I've pasted the following (just for reference):

  • a usage code: GetTestOfTablTime() returns a DataTable

  • class: SQLDBInteraction is another class - responsible for the final(SQL transaction) stage

In this code below, I am constructing what I call: "Stored Procedure's Meta Data". That class is the one that holds all of the SQL Db SPs.

HTSPs (HT is the company's aliases) is holding each SP required) parameters. HTSPs class contains another sub Class. For all SPs Names, it only has const strings for each SP name.

public sealed class HTSPs {  //so for example this is one of the members of this class - a stored procedure //its mission: get evnents with specified id OF specified userId in spec' month, year..      public sealed class GetTimesWithCustomerNames     {         //if I DO need Constructor for its parameters how do I properly format the constructor?         public GetTimesWithCustomerNames()         {             Userid.ParameterName = ParNameUserid;             Month.ParameterName = ParNameMonth;             Year.ParameterName = ParNameYear;             EventId.ParameterName = ParNameReasonid;          }          const string ParNameUserId = "@userId",                      ParNameMonth = "@month",                      ParNameYear = "@year",                      ParNameEventId = "@eventId";          public static SqlParameter Userid = new SqlParameter();         public static SqlParameter Month = new SqlParameter();         public static SqlParameter Year = new SqlParameter();         public static SqlParameter EventId = new SqlParameter();                 } } 

The issue is: how do I initialize the contractor? What is the proper way to have your simple customized StoredProcedure "MetaData"? I've currently completed the implementation of the method below (apart from that issue).

USAGE

This is a method that returns DataTable while using the HTSPs class / constructor.

using SPTime = HT_DBSchema.HTSPs.GetTimesWithCustomerNames;  private DataTable GetTestOfTablTime() {     SQLDBInteraction.DataContainer DC_Time = new SQLDBInteraction.DataContainer();      SQLDBInteraction.SqlParamList parmsTime = new SQLDBInteraction.SqlParamList();     Dictionary<SqlParameter, int> SqlCmdParDict = new Dictionary<SqlParameter, int>();     parmsTime.SqlCmd.CommandType = CommandType.StoredProcedure;     parmsTime.SqlCmd.CommandText = AppDb.MetaSqlSProc.Time.Name;     parmsTime.SP_Name = AppDb.MetaSqlSProc.Time.Name;     parmsTime.TableName = AppDb.MetaSqlTable.Time.Name;      //While folowing implementation Does Work I comented it out to try using the SP Struct     //ParmsTTime.SP_Params.Add(new SqlParameter(SPTime.ParNameMonth, 9));     //ParmsTTime.SP_Params.Add(new SqlParameter(SPTime.ParNameReasonid, 1));     //ParmsTTime.SP_Params.Add(new SqlParameter(SPTime.ParNameYear, 2012));     //ParmsTTime.SP_Params.Add(new SqlParameter(SPTime.ParNameUserid, 3571));       //here's where I'm currently stuck, in section below. trying to assign values for the SqlCommand     parmsTime.SqlCmd.Parameters.AddWithValue(SPTime.ParNameMonth, 9);     parmsTime.SqlCmd.Parameters.AddWithValue(SPTime.ParNameYear, 2012);     parmsTime.SqlCmd.Parameters.AddWithValue(SPTime.ParNameReasonid, 1);     SPTime.Userid.Direction = ParameterDirection.Input;     SPTime.Userid.SqlValue = 3571;     return DC_Time.LocalTbl_V3(ParmsTime);  } 

UPDATE

The last lines of the code above is trying to implement the parameters assignment, thus it will no longer be required to use:

SQLDBInteraction.SqlParamList.SP_Params (which is List<SqlParameter>).

And instead, I would really like to be able to use SQLDBInteraction.SqlParamList.SqlCmd.Parameters as it is already used for most of the required steps to interact with the database.

This is how I will drop some unnecessary usage of extra variables while at the same time I wanted to assign SqlCmd (parmsTime.SqlCmd.Parameters.Add(......)) with the struct - SPTime Real SqlParameters instead of using the strings that represents their name (e.g. parameter.name - (SPTime.ParNameMonth, someValue)).

Final stage- SQL transaction

The SQLDBInteraction class that does the transaction:

public class SQLDBInteraction {     public class SqlParamList     {         public SqlCommand SqlCmd = new SqlCommand();         public List<SqlParameter> SP_Params = new List<SqlParameter>();         public String SP_Name;         public string TableName;         public string SelectCommand;         ///public SqlCommandType SelectedCmdType;     }      public class DataContainer     {         public DataTable LocalTbl_V3(SqlParamList Params)         {             SqlConnection sqlConnection;             DataTable Usrs = new DataTable(Params.TableName);             SqlDataAdapter sqlDataAdapter;              using (sqlConnection = new SqlConnection(WebConfigurationManager.ConnectionStrings["HTConn"].ConnectionString))             {                 sqlConnection.Open();                  using (Params.SqlCmd.Connection = sqlConnection)                 {                     using (sqlDataAdapter = new SqlDataAdapter(Params.SqlCmd.CommandText, sqlConnection))                     {                         if (sqlDataAdapter.SelectCommand.Parameters.Count > 0 == false)                         {                             sqlDataAdapter.SelectCommand = Params.SqlCmd;                             sqlDataAdapter.Fill(Usrs);                         }                     }                 }             }             return Usrs;         } 

I will really appreciate it if someone will find what am I doing wrong with the part of the stored procedure's parameters assigned to the SQL command.

           
         
         

Lista de respuestas

1
 
vote

Tal vez estás tratando de hacer algo así

  public interface DbProc {     public SqlCommand GetCommand(); }  public class MyProc : DbProc {     private SqlCommand _cmd;      public const string COMMAND_TEXT = "spc_MyProc";     public const string PARAM1 = "@Param1";     public const string PARAM2 = "@Param2";              public MyProc(int param1, string param2)     {         _cmd = new SqlCommand(COMMAND_TEXT);         _cmd.CommandType = CommandType.StoredProcedure;         _cmd.Parameters.AddWithValue(PARAM1, param1);         _cmd.Parameters.AddWithValue(PARAM2, param2);     }      public SqlCommand GetCommand()     {         return _cmd;     } }  public class Db {     public DataTable ExecuteProc(DbProc proc)     {         SqlCommand cmd = proc.GetCommand();         ConfigureCommand(cmd);         // execute the command into a data table         return result;     }      // Set the common settings for all commands     private void ConfigureCommand(SqlCommand cmd)     {         cmd.CommandTimeout = 10000;                 } }   
 

Maybe you are trying to do something like this

public interface DbProc {     public SqlCommand GetCommand(); }  public class MyProc : DbProc {     private SqlCommand _cmd;      public const string COMMAND_TEXT = "spc_MyProc";     public const string PARAM1 = "@Param1";     public const string PARAM2 = "@Param2";              public MyProc(int param1, string param2)     {         _cmd = new SqlCommand(COMMAND_TEXT);         _cmd.CommandType = CommandType.StoredProcedure;         _cmd.Parameters.AddWithValue(PARAM1, param1);         _cmd.Parameters.AddWithValue(PARAM2, param2);     }      public SqlCommand GetCommand()     {         return _cmd;     } }  public class Db {     public DataTable ExecuteProc(DbProc proc)     {         SqlCommand cmd = proc.GetCommand();         ConfigureCommand(cmd);         // execute the command into a data table         return result;     }      // Set the common settings for all commands     private void ConfigureCommand(SqlCommand cmd)     {         cmd.CommandTimeout = 10000;                 } } 
 
 
 
 
0
 
vote

Solo para darle idea de cómo se vería su código si usa el marco de la entidad:

  using (var db = new HpDatabaseContext()) {     return db.GetTimesWithCustomerNames(userId, month, year, reasonId).ToArray(); }   
 

Just to give you idea how your code would look like if you use Entity Framework:

using (var db = new HpDatabaseContext()) {     return db.GetTimesWithCustomerNames(userId, month, year, reasonId).ToArray(); } 
 
 
   
   
-1
 
vote

Esto es aventualmente lo que estoy usando (al menos ahora)

... Como lo hará, supongo .. Siempre sea, más desarrollos.

Marcaré esto como la respuesta pronto, aunque todavía es muy bienvenido a publicar comentarios, o mejor aún, su versión mejorada.

De todos modos, este es un ejemplo de cómo se almacena un procedimiento almacenado en mi espacio de nombres "DBSchema"

      public static class RobSelect_Update_tblTC_CPA_ByDDL_paramNames     {         static SqlParameter aDepartment, bUid, cMonth, dYear, eUpdateFirst;          public static List<SqlParameter> SqlParlstCPA(string SelectedDepartmentID, string SelectedUserID, string SelectedMonth, string selectedYear, string AbitValuIfUpdateFirst)         {             aDepartment = new SqlParameter( a_UsrDepartment, SelectedDepartmentID);             bUid = new SqlParameter(b_UsrID, SelectedUserID);             cMonth = new SqlParameter(c_Month, SelectedMonth);             dYear = new SqlParameter(d_Year, selectedYear);             eUpdateFirst = new SqlParameter(e_Updateit_bit, AbitValuIfUpdateFirst);               List<SqlParameter> RetSqlParLst  = new List<SqlParameter>();             RetSqlParLst.Add(aDepartment);             RetSqlParLst.Add(bUid);             RetSqlParLst.Add(cMonth);             RetSqlParLst.Add(dYear);             RetSqlParLst.Add(eUpdateFirst);              return RetSqlParLst;         }         static readonly string a_UsrDepartment = "@Department",                      b_UsrID = "@Uid",                      c_Month = "@month",                      d_Year = "@year",                      e_Updateit_bit = "@updateItFirst";     }   
 

this is aventually what i am using (atleast For now)

...as there will ,i guess.. always be, further developments.

i will mark this as the answer soon , though you are still very welcome to post comments, or better yet, your improved version .

anyways this is an example for how a stored procedure is stored in my "DbSchema" namespace

    public static class RobSelect_Update_tblTC_CPA_ByDDL_paramNames     {         static SqlParameter aDepartment, bUid, cMonth, dYear, eUpdateFirst;          public static List<SqlParameter> SqlParlstCPA(string SelectedDepartmentID, string SelectedUserID, string SelectedMonth, string selectedYear, string AbitValuIfUpdateFirst)         {             aDepartment = new SqlParameter( a_UsrDepartment, SelectedDepartmentID);             bUid = new SqlParameter(b_UsrID, SelectedUserID);             cMonth = new SqlParameter(c_Month, SelectedMonth);             dYear = new SqlParameter(d_Year, selectedYear);             eUpdateFirst = new SqlParameter(e_Updateit_bit, AbitValuIfUpdateFirst);               List<SqlParameter> RetSqlParLst  = new List<SqlParameter>();             RetSqlParLst.Add(aDepartment);             RetSqlParLst.Add(bUid);             RetSqlParLst.Add(cMonth);             RetSqlParLst.Add(dYear);             RetSqlParLst.Add(eUpdateFirst);              return RetSqlParLst;         }         static readonly string a_UsrDepartment = "@Department",                      b_UsrID = "@Uid",                      c_Month = "@month",                      d_Year = "@year",                      e_Updateit_bit = "@updateItFirst";     } 
 
 
 
 

Relacionados problema

2  Fórmula Haversine en SQL  ( Haversine formula in sql ) 
Esta es una implementación de la haversine fórmula en Microsoft Transact SQL. ¿Cómo puedo simplificar la función? en1 Aquí hay una prueba de la func...

3  ¿Es necesario reemplazar este cursor en SQL Server 2005?  ( Is it necessary to replace this cursor in sql server 2005 ) 
el problema Tengo un cursor que estoy tratando de reemplazar (tal vez innecesariamente) en un intento por limpiar un procedimiento almacenado. Esencialmen...

5  Conseguir distinta de dos columnas  ( Get distinct of two columns ) 
Quiero obtener #ifndef __RUNES_MACROS_H #define __RUNES_MACROS_H #include <string.h> #include <constants.h> /* * Miscellaneous macros used by Runes */ ...

8  Devuelve el Top 5 de cada tipo de registro  ( Return the top 5 of each kind of record ) 
Tengo este código de trabajo actualmente, pero es extremadamente lento. Estoy hablando casi una hora para ejecutar, si se ejecuta en absoluto (nuestro servido...

2  Implementación T-SQL TOTP (RFC6238 SHA2_256)  ( T sql totp rfc6238 sha2 256 implementation ) 
Usando mi Función anterior Como base que he subido lo siguiente: create function dbo.Totp ( @key varbinary(8000) , @timeStep int = 90 ) returns tab...

3  Diseño de relación para la base de datos de almacenes de autopartes  ( Relationship design for auto parts store database ) 
Estoy creando una base de datos de diseño para una tienda de autopartes (esta es una escuela de proyectos). Por el momento, no estoy seguro de si el modelo de...

7  Equipos de listado por distancia total y bonificación  ( Listing teams by total distance and bonus ) 
Tuve que escribir una consulta de SQL recientemente para hacer algunas unes y sumas, y al final me di cuenta de que casi he escrito un libro de cuentos. Conoz...

3  Paginación personalizada en ASP.NET Aplicación web  ( Custom paging in asp net web application ) 
Tengo un código siguiente para hacer una paginación personalizada desde una aplicación web ASP.NET. puntos de interés usa los botones de enlace como se...

0  Creación de múltiples objetos del extracto de SQL Server  ( Creating multiple objects from sql server extract ) 
He creado una solución prototipo simplificada como una especie de prueba de concepto antes de comenzar un programa más grande. Aquí están los datos de prueb...

6  Top usuarios de Bodged Python de NYC  ( Top python badged users from nyc ) 
i bifurcado este explorador de datos de Stackexchange (SEDE) Consulta de otro, y lo hizo un poco más complejo. Estoy buscando comentarios sobre mi estilo, a...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos