Showing posts with label Access 2007. Show all posts
Showing posts with label Access 2007. Show all posts

Thursday, 27 January 2011

Infracción de concurrencia: DeleteCommand o UpdateCommand en C# o VB.NET

Si tienes este error:

Infracción de concurrencia: DeleteCommand o UpdateCommand afectó a 0 de los 1 registros esperados."


Ya sea agregando o editando un registro, es porque seguro esa tabla tiene un Id auto numérico y cuando intentas borrar o editar un registro recién guardado el nuevo Id no es retornado a menos de que lo hagas explícitamente, aqui hay un ejemplo de un registro recién agregado a un DataGridView:



Como puedes ver el Id auto numérico no es guardado

Yo intenté solucionarlo tratando de que sea lo mas sencillo posible y encontré que la mejor forma(en este caso para mi) fué, volver a cargar lo datos nuevamente después de agregarlo, algo así:

Pseudo-código:



Agregar_registro();
Recargar_registros(); // <-- Aqui se vuelve a actualizar



Esta es una manera que me funciona bien hasta los momentos si tienes una mejor por favor comentala

Publicado en tttony.blogspot.com

Tuesday, 25 January 2011

Convertir un numero entero en cadenas en Access

Supongamos que tienes una tabla con un campo numérico único con los siguientes valores:

11083623
11083721
11083832
11083952
11095589
11097893
11099432


Usando esta sentencia SQL:

SELECT * FROM table WHERE id = 11083832


Solo encontrarás esa fila con el id 11083832

Ahora bien, si sólo quieres buscar mas de una fila, por ej. que contenga: 11083, no es posible ya que es un numero y solo puedes usar los siguientes operadores: < > = <= >=, así que tendrás que convertir ese campo id en cadena en la consulta, de ésta manera:

SELECT * FROM table WHERE CStr(id) LIKE '%11083%'


Con eso puedes hacer búsquedas de más de un número

Publicado en tttony.blogspot.com

Sunday, 22 August 2010

Sistema de login en C# con Access 2007

He mejorado un poco el sistema y ademas lo puedes descargar como archivo de proyecto para VS2010

Sistema de login

Es facil de usar solo tienes que configurarlo dependiendo de como tengas la base de datos de los usuarios

NUEVO: agregada opcion de encriptacion de contraseña con Bcrypt

La contraseña de la base de datos login.accdb es: test

Ejecuta el proyecto pero modo Debug ya que la base de datos login.accdb esta en el directorio Debug e introduce estos datos:


Usuario: prueba
Contraseña: 5555

El codigo esta documentado


ACTUALIZADO 11/11/12


Publicado en tttony.blogspot.com

Thursday, 19 August 2010

Compactar base de datos Access 2007 en C# y VB.NET

Para compactar una base de datos Access en C#, primero agregas esta referencia a tu solucion:

Microsoft Office 12.0 Access Database Engine Object Library


Y con esta funcion compactas la base de datos

Codigo C#:

/* * Creado por tttony 2010 * http://tttony.blogspot.com/ * * POR FAVOR NO BORRES ESTE COMENTARIO */

public void compact()
{

try
{
/*
* http://techieyogi.blogspot.com/2009/11/how-to-compact-access-2007-database.html
*/
Microsoft.Office.Interop.Access.Dao.DBEngine objDbEngine = new Microsoft.Office.Interop.Access.Dao.DBEngine();

// Archivo temporal no debe existir
string strDbTmp = Application.StartupPath + @"\compacting__.accdb";
// path de la base de datos a compactar
string strDB = @"C:\db\access.accdb";

objDbEngine.CompactDatabase(strDB , strDbTmp, null, null, ";pwd=" + m_dataBasePassword);

if ((new FileInfo(strDbTmp)).Length == (new FileInfo(strDB)).Length)
{
// no fue compactada ya que tiene el mismo tamaño que antes
File.Delete(strDbTmp);
}
else // compactacion exitosa
{
// copia de seguridad IMPORTANTE!!!
File.Copy(strDB, strDB + ".nocompact_" + DateTime.Today.ToString().Replace("/", "_").Substring(0, 10));
// borrar original
File.Delete(m_dataBaseFile);
// mover la db compactada
File.Move(strDbTmp, m_dataBaseFile);
}

}
catch(Exception ex)
{
ErrorToLog(ex);
}

}


Codigo VB.NET:

' * Creado por tttony 2010 * http://tttony.blogspot.com/ * * POR FAVOR NO BORRES ESTE COMENTARIO


Public Sub compact()

Try
'
' * http://techieyogi.blogspot.com/2009/11/how-to-compact-access-2007-database.html
'

Dim objDbEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine()

' Archivo temporal no debe existir
Dim strDbTmp As String = Application.StartupPath + "\compacting__.accdb"
' path de la base de datos a compactar
Dim strDB As String = "C:\db\access.accdb"

objDbEngine.CompactDatabase(strDB, strDbTmp, Nothing, Nothing, ";pwd=" & m_dataBasePassword)

If (New FileInfo(strDbTmp)).Length = (New FileInfo(strDB)).Length Then
' no fue compactada ya que tiene el mismo tamaño que antes
File.Delete(strDbTmp)
Else
' compactacion exitosa
' copia de seguridad IMPORTANTE!!!
File.Copy(strDB, strDB & ".nocompact_" & DateTime.Today.ToString().Replace("/", "_").Substring(0, 10))
' borrar original
File.Delete(m_dataBaseFile)
' mover la db compactada
File.Move(strDbTmp, m_dataBaseFile)

End If
Catch ex As Exception
ErrorToLog(ex)
End Try

End Sub




Publicado en tttony.blogspot.com

Monday, 5 July 2010

Problemas con las fechas en Access en C# y VB.NET

Si han tenido problemas para buscar filas con determinadas fechas, la fecha debe ser con este formato: YYYY/MM/DD de lo contrario tendras resultados indeseables como los que he tenido, aqui les dejo esta funcion:

Codigo C#:

// Darle formato a la fecha
private string ToDBDate(DateTime dt)
{
return dt.Year + "/" + dt.Month + "/" + dt.Day;
}


Codigo VB.NET:

' Darle formato a la fecha
Private Function ToDBDate(dt As DateTime) As String

Return dt.Year & "/" & dt.Month & "/" & dt.Day

End Function


EL otro problema que surge es con sentencias BETWEEN

Codigo C#:

string sql = String.Format("SELECT * FROM table1 WHERE datetime BETWEEN #{0} 00:00:00# AND #{1} 23:59:59#", ToDBDate(fromDateTime), ToDBDate(toDateTime));


Codigo VB.NET:

Dim sql As String = String.Format("SELECT * FROM table1 WHERE datetime BETWEEN #{0} 00:00:00# AND #{1} 23:59:59#", ToDBDate(
fromDateTime), ToDBDate(toDateTime))


Asi el resultado sera el que buscas


Publicado en tttony.blogspot.com

Tuesday, 9 February 2010

Solucion al error


La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información de columna de clave.


Este error se produce cuando se esta actualizando un registro que no tiene un campo unico, lo que tienes que hacer es marcar como unico algun campo que normalmente es llamado ID y listo solucionado el problema



Publicado en tttony.blogspot.com