Si vas a copiar

.. y pegar este post en tu web o blog personal, por favor te pido que coloques el link del post de donde lo copiastes:

Fuente:

Mostrando las entradas con la etiqueta Access 2007. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Access 2007. Mostrar todas las entradas

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

27 de enero de 2011 1 comentario:
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

Convertir un numero entero en cadenas en Access

25 de enero de 2011 No hay comentarios.:
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

Sistema de login en C# con Access 2007

22 de agosto de 2010 35 comentarios:
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

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

19 de agosto de 2010 2 comentarios:
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

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

5 de julio de 2010 3 comentarios:
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

Solucion al error

9 de febrero de 2010 No hay comentarios.:

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

Conectarse a una base de datos Access 2007

13 de enero de 2010 No hay comentarios.:
Estoy haciendo una aplicacion que se conecta con una base de datos Access 2007 pero este codigo no funciona ya que muestra este error:


El proveedor 'Microsoft.Jet.OLEDB.4.0' no esta registrado en el equipo local


CODIGO C#:


using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;

namespace PRY
{
   class clsDatabase
   {

       public void Connect()
       {

           OleDbConnection conn = new OleDbConnection();
           conn.ConnectionString = 
               @"Provider=Microsoft.Jet.OLEDB.4.0;" +
               @"Data source=C:\db\test.accdb";
           try
           {
               conn.Open();
               // Insert code to process data.
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message, ex.Source);
           }
           finally
           {
               conn.Close();
           }
       }
   }
}




Averiguando en internet me encontre que ahora existe una nueva version de conexion para las base de datos Access 2007 entonces quedaria de esta manera:



using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;

namespace PRY
{
   class clsDatabase
   {

       public void Connect()
       {

           OleDbConnection conn = new OleDbConnection();

           conn.ConnectionString =
               @"Provider=Microsoft.ACE.OLEDB.12.0;" +
               @"Data source=C:\db\test.accdb";
           try
           {
               conn.Open();
               // Insert code to process data.
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message, ex.Source);
           }
           finally
           {
               conn.Close();
           }
       }
   }
}



Como ven en letras negritas eso es lo que cambia y asi poder conectarse a la base de datos Access 2007, incluso sirve para otros componentes como el Excel 2007

Si no tienen instalado o no quieren intalar el Office 2007 intala este paquete que instalara los nuevos drivers de conexion para Access 2007


Otras maneras de conectarse con ACE OLEDB 12.0 dependiendo de la seguridad:

Seguridad Estandar

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccess2007file.accdb;Persist Security Info=False;


Con Contraseña en la base de datos
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccess2007file.accdb;Jet OLEDB:Database Password=MyDbPassword;


Con la funcionalidad DataDirectory
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\myAccess2007file.accdb;Persist Security Info=False;



Fuente: http://www.connectionstrings.com/access-2007


Publicado en tttony.blogspot.com

Buscar en el Blog



PUBLICIDAD