Datatable

17/08/2004 - 22:35 por Alfredo | Informe spam
Hola a todos...
Se me ha presentado el siguiente problema que no he podido
solucionar...estoy creando una tabla (DataTable)
dinamicamente...esta tabla tiene una columna que es
autonumerica. mi problema surge, porque necesito saber
cual es el valor que tomara la columna que es autonumerica
cuando le agrego una fila...no se si me he explicado.
Desde ya muchas gracias por la ayuda...

Preguntas similare

Leer las respuestas

#1 Alejandro Perez
17/08/2004 - 23:05 | Informe spam
Como estas Alfredo. A ver.. si lo que quieres saber es
cual es el valor que TOMARA el proximo registro a agregar,
lo que tienes que hacer es leer el valor del ultimo
registro y le sumas el valor de la propiedad
AutoIncrementStep.

Aqui te dejo un ejemplo completo que te hice del uso del
AutoIncrement en un datacolumn.

Bye!, avisame si era lo que necesitabas.

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


DataColumn colIdCliente = new DataColumn("IdCliente");
colIdCliente.DataType = System.Type.GetType
("System.Int32");
colIdCliente.AutoIncrement = true;
colIdCliente.AutoIncrementSeed = 0;
colIdCliente.AutoIncrementStep = 1;

DataTable dt = new DataTable("Cliente");
dt.Columns.Add(colIdCliente);
dt.Columns.Add("Nombre",typeof(string));

dt.Rows.Add(new string[] {null,"Juan"});
dt.Rows.Add(new string[] {null,"Pedro"});

MessageBox.Show(dt.Rows[0][0].ToString() + ": " + dt.Rows
[0][1].ToString());
MessageBox.Show(dt.Rows[1][0].ToString() + ": " + dt.Rows
[1][1].ToString());


Hola a todos...
Se me ha presentado el siguiente problema que no he


podido
solucionar...estoy creando una tabla (DataTable)
dinamicamente...esta tabla tiene una columna que es
autonumerica. mi problema surge, porque necesito saber
cual es el valor que tomara la columna que es


autonumerica
cuando le agrego una fila...no se si me he explicado.
Desde ya muchas gracias por la ayuda...

.

Respuesta Responder a este mensaje
#2 Vyacheslav Popov
18/08/2004 - 10:24 | Informe spam
Hola Alejandro, me temo de que el resultado no siempre
será el esperado ya que se incrementa el indice al
cacelar una operación. En mi humilde opinión la solución
más elegante es crear una tabla de claves.
Saludos.
Como estas Alfredo. A ver.. si lo que quieres saber es
cual es el valor que TOMARA el proximo registro a


agregar,
lo que tienes que hacer es leer el valor del ultimo
registro y le sumas el valor de la propiedad
AutoIncrementStep.

Aqui te dejo un ejemplo completo que te hice del uso del
AutoIncrement en un datacolumn.

Bye!, avisame si era lo que necesitabas.

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


DataColumn colIdCliente = new DataColumn("IdCliente");
colIdCliente.DataType = System.Type.GetType
("System.Int32");
colIdCliente.AutoIncrement = true;
colIdCliente.AutoIncrementSeed = 0;
colIdCliente.AutoIncrementStep = 1;

DataTable dt = new DataTable("Cliente");
dt.Columns.Add(colIdCliente);
dt.Columns.Add("Nombre",typeof(string));

dt.Rows.Add(new string[] {null,"Juan"});
dt.Rows.Add(new string[] {null,"Pedro"});

MessageBox.Show(dt.Rows[0][0].ToString() + ": " + dt.Rows
[0][1].ToString());
MessageBox.Show(dt.Rows[1][0].ToString() + ": " + dt.Rows
[1][1].ToString());


Hola a todos...
Se me ha presentado el siguiente problema que no he


podido
solucionar...estoy creando una tabla (DataTable)
dinamicamente...esta tabla tiene una columna que es
autonumerica. mi problema surge, porque necesito saber
cual es el valor que tomara la columna que es


autonumerica
cuando le agrego una fila...no se si me he explicado.
Desde ya muchas gracias por la ayuda...

.



.

Respuesta Responder a este mensaje
#3 Jose Alfredo
18/08/2004 - 11:43 | Informe spam
Hola!

Si tu estás creando una tabla no puedes accesar a la ultima fila creada
mediante su posición en el arreglo?


Saludos

Jose Alfredo

"Alfredo" schrieb im Newsbeitrag
news:7aca01c48499$c588dc00$
Hola a todos...
Se me ha presentado el siguiente problema que no he podido
solucionar...estoy creando una tabla (DataTable)
dinamicamente...esta tabla tiene una columna que es
autonumerica. mi problema surge, porque necesito saber
cual es el valor que tomara la columna que es autonumerica
cuando le agrego una fila...no se si me he explicado.
Desde ya muchas gracias por la ayuda...

Respuesta Responder a este mensaje
#4 Alejandro Perez
18/08/2004 - 16:14 | Informe spam
Como estas Vyacheslav, tienes toda la razon, en ese caso
(algun error al momento del insert), se incrementa de
igual manera el identity, pero con la solucion de una
tabla de claves no le veo utilidad entonces al row
AutoIncrement.

El problema en realidad es el manejo que le da ADO.NET a
las columnas AutoIncrement. ADO.NET nunca realiza
validaciones sobre los valores existentes en esa columna.
Que quiere decir esto? Que si tienes una columna con
algunos valores (1 y 2), y luego, estableces esa columna
como AutoIncrement con Seed de 1, y agregas dos registros,
estos dos registros tendran valor 1 y 2, es decir que
tendras dos registros con ID 1 y dos con ID 2. Extraño
verdad? :s.. Pero asi es... Segun Microsoft, esto es
porque el DataTable es diseñado para trabajar en un
ambiente desconectado y no tiene como fin principal el
merge con una tabla de una BD. ¿¿¿ :s ????

Ahora bien, a nuestro caso, podemos aprovechar esto para
solucionar el problema de Alfredo.

Si tu mencionas que necesitas saber el valor que tendra el
proximo registro, quiere decir que de alguna manera estas
agregando los registros uno a uno, y de esta manera puedes
entonces, manejar un posible error para entonces asignar
ese ID "perdido" al proximo registro a agregar.

Aqui dejo un ejemplo de lo que quiero decir, obviamente,
esto esta todo "alambrado", tu tendrias que implementar un
manejo de errores eficiente combinado con la recuperacion
del Identity:

//Se agrega un primer registro que tendra como identity 0
dt.Rows.Add(new string[] {null,"Andrea","04/10/2001"});

//Esta instruccion falla, por lo que el identity
se "pierde"
try{dt.Rows.Add(new string[] {null,"Jean
Carlos","FechaInvalida"});}
catch{}

//Se recupera el identity perdido asignandoselo
explicitamente.
dt.Rows.Add(new string[] {"1","Pedro","04/10/2001"});

//El autoincrement sigue funcionando sin problemas
dt.Rows.Add(new string[] {null,"Manuel","04/10/2001"});


Bye Bye!
Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela













Y para este caso, mi opinion es salvar este indice. Que
quiero decir con esto? Lo siguiente: Si la pregunta
es: "Como se cual es el proximo valor que tomara la
columna", es porque, de alguna manera, estoy agregando los
registros uno a uno, y, si es asi, de esta manera puedo
controlar, que al momento de ocurrir un error, el indice
de esa columna vuelva a ser consecutivo.. Es decir, algo
asi:




Hola Alejandro, me temo de que el resultado no siempre
será el esperado ya que se incrementa el indice al
cacelar una operación. En mi humilde opinión la solución
más elegante es crear una tabla de claves.
Saludos.
Como estas Alfredo. A ver.. si lo que quieres saber es
cual es el valor que TOMARA el proximo registro a


agregar,
lo que tienes que hacer es leer el valor del ultimo
registro y le sumas el valor de la propiedad
AutoIncrementStep.

Aqui te dejo un ejemplo completo que te hice del uso del
AutoIncrement en un datacolumn.

Bye!, avisame si era lo que necesitabas.

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


DataColumn colIdCliente = new DataColumn("IdCliente");
colIdCliente.DataType = System.Type.GetType
("System.Int32");
colIdCliente.AutoIncrement = true;
colIdCliente.AutoIncrementSeed = 0;
colIdCliente.AutoIncrementStep = 1;

DataTable dt = new DataTable("Cliente");
dt.Columns.Add(colIdCliente);
dt.Columns.Add("Nombre",typeof(string));

dt.Rows.Add(new string[] {null,"Juan"});
dt.Rows.Add(new string[] {null,"Pedro"});

MessageBox.Show(dt.Rows[0][0].ToString() + ": " + dt.Rows
[0][1].ToString());
MessageBox.Show(dt.Rows[1][0].ToString() + ": " + dt.Rows
[1][1].ToString());


Hola a todos...
Se me ha presentado el siguiente problema que no he


podido
solucionar...estoy creando una tabla (DataTable)
dinamicamente...esta tabla tiene una columna que es
autonumerica. mi problema surge, porque necesito saber
cual es el valor que tomara la columna que es


autonumerica
cuando le agrego una fila...no se si me he explicado.
Desde ya muchas gracias por la ayuda...

.



.



.

Respuesta Responder a este mensaje
#5 Vyacheslav Popov
18/08/2004 - 17:05 | Informe spam
Saludos Alejandoro, tienes mucha razon en sentido de que se pierde el
segnificado de claves autoincrementadas. Todo depende de la semantica o el
enfóque que le demos.

La técnica de la tabla con claves se usa principalmente para asignación de
códigos o números segnificativos.

Ej.:

//
// Creacion de tabla
DataSet dataSet = new DataSet();
dataSet.Tables.Add("Keys");

// Asignacion de columnas
DataColumn dc = dataSet.Tables["Keys"].Columns.Add("Tabla",
typeof(string) );
dc.MaxLength = 30;
dataSet.Tables["Keys"].Columns.Add("Key", typeof(int) );

// Especificacion de restricciones
dataSet.Tables["Keys"].Constraints.Add("PK_KEYS", dc, true);
//
public int GetKey (string Tabla)
{
DataRow dr = dataSet.Tables["Keys"].Rows.Find(Tabla);
dr["Key"] = Convert.ToInt23( dr["Key"] ) + 1;
return Convert.ToInt23( dr["Key"] );
}

public int GetCurrentKey (string Tabla)
{
DataRow dr = dataSet.Tables["Keys"].Rows.Find(Tabla);
return Convert.ToInt23( dr["Key"] );
}

public void MiFuncion()
{
MostrarClave( GetCurrenKey("MiTabla") + 1);
if ( loquesea )
dataSet.Tables["MiTabla"].Rows.Add( new object[] {
GetKey("MiTabla"), } );
}
Es un simple ejemplo de esta tecnica, con ella podemos saber en cualquer
momento por donde andamos.

"Alejandro Perez" escribió en el mensaje
news:81e801c4852d$b5627e50$
Como estas Vyacheslav, tienes toda la razon, en ese caso
(algun error al momento del insert), se incrementa de
igual manera el identity, pero con la solucion de una
tabla de claves no le veo utilidad entonces al row
AutoIncrement.

El problema en realidad es el manejo que le da ADO.NET a
las columnas AutoIncrement. ADO.NET nunca realiza
validaciones sobre los valores existentes en esa columna.
Que quiere decir esto? Que si tienes una columna con
algunos valores (1 y 2), y luego, estableces esa columna
como AutoIncrement con Seed de 1, y agregas dos registros,
estos dos registros tendran valor 1 y 2, es decir que
tendras dos registros con ID 1 y dos con ID 2. Extraño
verdad? :s.. Pero asi es... Segun Microsoft, esto es
porque el DataTable es diseñado para trabajar en un
ambiente desconectado y no tiene como fin principal el
merge con una tabla de una BD. ¿¿¿ :s ????

Ahora bien, a nuestro caso, podemos aprovechar esto para
solucionar el problema de Alfredo.

Si tu mencionas que necesitas saber el valor que tendra el
proximo registro, quiere decir que de alguna manera estas
agregando los registros uno a uno, y de esta manera puedes
entonces, manejar un posible error para entonces asignar
ese ID "perdido" al proximo registro a agregar.

Aqui dejo un ejemplo de lo que quiero decir, obviamente,
esto esta todo "alambrado", tu tendrias que implementar un
manejo de errores eficiente combinado con la recuperacion
del Identity:

//Se agrega un primer registro que tendra como identity 0
dt.Rows.Add(new string[] {null,"Andrea","04/10/2001"});

//Esta instruccion falla, por lo que el identity
se "pierde"
try{dt.Rows.Add(new string[] {null,"Jean
Carlos","FechaInvalida"});}
catch{}

//Se recupera el identity perdido asignandoselo
explicitamente.
dt.Rows.Add(new string[] {"1","Pedro","04/10/2001"});

//El autoincrement sigue funcionando sin problemas
dt.Rows.Add(new string[] {null,"Manuel","04/10/2001"});


Bye Bye!
Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela













Y para este caso, mi opinion es salvar este indice. Que
quiero decir con esto? Lo siguiente: Si la pregunta
es: "Como se cual es el proximo valor que tomara la
columna", es porque, de alguna manera, estoy agregando los
registros uno a uno, y, si es asi, de esta manera puedo
controlar, que al momento de ocurrir un error, el indice
de esa columna vuelva a ser consecutivo.. Es decir, algo
asi:




Hola Alejandro, me temo de que el resultado no siempre
será el esperado ya que se incrementa el indice al
cacelar una operación. En mi humilde opinión la solución
más elegante es crear una tabla de claves.
Saludos.
Como estas Alfredo. A ver.. si lo que quieres saber es
cual es el valor que TOMARA el proximo registro a


agregar,
lo que tienes que hacer es leer el valor del ultimo
registro y le sumas el valor de la propiedad
AutoIncrementStep.

Aqui te dejo un ejemplo completo que te hice del uso del
AutoIncrement en un datacolumn.

Bye!, avisame si era lo que necesitabas.

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


DataColumn colIdCliente = new DataColumn("IdCliente");
colIdCliente.DataType = System.Type.GetType
("System.Int32");
colIdCliente.AutoIncrement = true;
colIdCliente.AutoIncrementSeed = 0;
colIdCliente.AutoIncrementStep = 1;

DataTable dt = new DataTable("Cliente");
dt.Columns.Add(colIdCliente);
dt.Columns.Add("Nombre",typeof(string));

dt.Rows.Add(new string[] {null,"Juan"});
dt.Rows.Add(new string[] {null,"Pedro"});

MessageBox.Show(dt.Rows[0][0].ToString() + ": " + dt.Rows
[0][1].ToString());
MessageBox.Show(dt.Rows[1][0].ToString() + ": " + dt.Rows
[1][1].ToString());


Hola a todos...
Se me ha presentado el siguiente problema que no he


podido
solucionar...estoy creando una tabla (DataTable)
dinamicamente...esta tabla tiene una columna que es
autonumerica. mi problema surge, porque necesito saber
cual es el valor que tomara la columna que es


autonumerica
cuando le agrego una fila...no se si me he explicado.
Desde ya muchas gracias por la ayuda...

.



.



.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida