none
Obtener UID Asincrono con el metodo Guid.NewGuid RRS feed

  • Pregunta

  • Tengo un problema al obtener codigos UID por medio del metodo Guid.NewGuid, tengo un proceso que realiza insert a una base de datos Sql server, es una cantidad grande de datos asi que decidi hacerlo async, el problema esta en que los UID generados por el metodo en algun momento llegan a duplicarse. 
    Como hago para que el metodo sea asyncrono?

    Funcion que retorna el UID

    public async Task<string> getUID()
            {
                string UID =  Guid.NewGuid().ToString().ToUpper();

                return UID;
            }


    public async Task insertInTable()
            {

                string UID = await getUID()

                Comando: $"insert into TABLE (Id) values ('{UID}')"

            }

    De antemano muchas Gracias por su ayuda.


    martes, 4 de febrero de 2020 13:25

Respuestas

Todas las respuestas

  • hola

    No entiendo como pueden duplicarse si usas el await

    Ademas porque no dejas que la DB genere el GUID usando

    defines la columna del tipo

    uniqueidentifier (Transact-SQL)

    y despues usas

    NEWID (Transact-SQL)

    para que sea la db quien genere el valor del Id

    Como compruebas que esta ducplicando si veo que ese comando no lo estas ejecutando

    Ademas deberias usar parametros, no se concatena en un string el valor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 4 de febrero de 2020 13:45
  • Hola Leandro,

    Este el el codigo completo.
    cada que lo ejecuto me da error de duplicate Primary Key.


    public async Task insertInTable(List<string> allTables, string tipoConexion)
            {

                MP_OptimizerEntities MO = new MP_OptimizerEntities();

                switch (tipoConexion)
                {
                    case "SQL":

                        Parallel.ForEach(allTables, async table =>
                        {
                            try
                            {
                                using (var SQLMonitorp = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnDB_MP"].ToString()))
                                {
                                    using (var cmdSQLMonitorP = new SqlCommand("Select * from " + table.ToString(), SQLMonitorp))
                                    {
                                        await SQLMonitorp.OpenAsync();

                                        using (var dr = await cmdSQLMonitorP.ExecuteReaderAsync())
                                        {
                                            if (await dr.ReadAsync())
                                            {
                                                using (var SQLOptimizer = new SqlConnection(ConfigurationManager.ConnectionStrings["MP_OPtimizerSql"].ToString()))
                                                {
                                                    using (var cmdSQLOptimizer = new SqlCommand($"INSERT INTO MPO_TRAININGDATA " +
                                                            $"(UUID , UUIDORGANIZATIONNODE, UUIDMODULE, UUIDRECORD, DATA,TRANSACTIONDATE,TRANSACTIONTIME, " +
                                                            $"ISFRAUD, RANDOM, SOURCE, TRANSACTIONID, TRANSACTIONDATA) VALUES (" +
                                                            $"'{Guid.NewGuid().ToString().ToUpper()}'," +
                                                            $"'a8842958-7bb6-4493-8a4b-d859c655eef7'," +
                                                            $"'D8C79BEF-937B-4EFE-A51A-20B977CCB14F'," +
                                                            $"'BFDEC28D-7E26-4696-B4AB-B42503B06A02'," +
                                                            $"'{dr["VWJETEXTO"].ToString()}'," +
                                                            $"'{dr["VWJEFECHA"].ToString()}'," +
                                                            $"'{dr["VWJEHORA"].ToString()}'," +
                                                            $"'{dr["VWJEFRAUD"].ToString()}'," +
                                                            $"'{dr["VWRANDOM"].ToString()}'," +
                                                            $"'{dr["VWORIGEN"].ToString()}'," +
                                                            $"'{dr["VWJENUMEVENTO"].ToString()}'," +
                                                            $"'{getJson(dr["VWJENUMEVENTO"].ToString(), dr["VWJETECOD"].ToString())}'", SQLOptimizer))
                                                    {

                                                        await SQLOptimizer.OpenAsync();

                                                        cmdSQLOptimizer.ExecuteNonQuery();
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                throw ex;
                            }
                        });
                        break;
                }

            }
    martes, 4 de febrero de 2020 14:05
  • Porque armas el command de esa forma, no se contaner en un string, debes usar parametros

    la estructura es algo como esto

    using (SqlConnection conn = new SqlConnection("<connection string>"))  
    {  
        conn.Open();  
     
        string query = @"INSERT INTO NombreTabla (campo1, campo2) 
    VALUES (@param1, @param2)"; SqlCommand cmd = new SqlCommand(query, conn); cmd.Parameters.AddWithValue("@param1", TextBox1.Text); cmd.Parameters.AddWithValue("@param2", Convert.ToInt32(Textbox2.Text)); cmd.ExecuteNonQuery(); }

    puedes usar el @ para armar un string multi-linea

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 4 de febrero de 2020 14:15
  • Leandro eres un Crack,
    use el NewId() en Sql y perfecto!

    ahora tengo otro inconveniente :(


    este es el error   (en cada una de las Task):

    System.Data.SqlClient.SqlException: 'Se agotó el tiempo de espera de ejecución. El período de tiempo de espera transcurrió antes de la finalización de la operación o el servidor no responde.'

    crees que es por la insersion asincrona?
    martes, 4 de febrero de 2020 15:58
  • hola

    >>SqlException: 'Se agotó el tiempo de espera de ejecución

    Puede que se este dando bloqueos en las operaciones contra la dbal usas Parallel.ForEach(...

    No estoy entendiendo que seria esto de  allTables, pero estas creando conexiones y readers en paralelo, esto puede llevar al limite la db en cantidad de conexiones y generar bloqueos

    slaudos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 4 de febrero de 2020 16:05
  • Entendido, Leandro muchas gracias.

    Saludos desde Guatemala.
    martes, 4 de febrero de 2020 16:48