(Ayuda) Base de Datos C# - Enlazarla y Parametros

#1
Buen día gente de ba-k. El motivo de crear este tema es debido a que ya llevo varios dias con unos problemas que no he podido resolver con un programa en C# que va a ser utilizado como punto de almacén, ya busque por varios lados y nada...Los problemas son los siguientes:

1.- Mi programa es un proyecto escolar realmente, pero sera entregado a una persona ajena con instalador y todo eso
Forzozamente tiene que ir enlazada a una base de datos de Access en la cual se van a registrar los productos de entrada y salida, ya conseguí enlazarla de esta manera
Código:
DataTable tmpEntrada = new DataTable();
        string CnnStr = @" Provider=Microsoft.ACE.OLEDB.12.0; " +
         "Data Source=C:\\Users\\BET00\\Desktop\\prprpç\\Proyecto\\almacen\\almacen\\bin\\Debug\\almacen.accdb; " +
         "Jet OLEDB:Database Password=; Persist Security Info=False;";
Hasta aqui todo bien con el hecho de enlazarla, pero el problema viene cuando se le instale en el computador a la persona, quiero poder enlazarla sin necesidad de asignarle una ruta, habia leido de usar un comando PATH o algo asi pero aun no doy con algo en concreto :(

2.- Ahora el otro problema que tengo es con los parametros...En un formulario doy de alta unos productos, y al momento de querer agregarlos a un ListView me marca el siguiente error:

Y aquí el código donde están los parámetros.
Código:
void generaColumnas()
        {
            lvEntrada.Clear();
            lvEntrada.View = View.Details;
            lvEntrada.Columns.Add("", 0, HorizontalAlignment.Left);
            lvEntrada.Columns.Add("Id ", 100, HorizontalAlignment.Left);
            lvEntrada.Columns.Add("Producto", 240, HorizontalAlignment.Left);
            lvEntrada.Columns.Add("Cantidad", 60, HorizontalAlignment.Right);
            lvEntrada.Columns.Add("Precio", 60, HorizontalAlignment.Right);
            lvEntrada.Columns.Add("Total", 80, HorizontalAlignment.Right);
        }
        void mostrarEntrada()
        {
            try
            {
                double varIVA = 0;
                double varTOTAL = 0;
                lvEntrada.Items.Clear();
                for (int i = 0; i < tmpEntrada.Rows.Count; i++)
                {
                    lvEntrada.Items.Add(tmpEntrada.Rows[i]["id"].ToString());
                    lvEntrada.Items[i].SubItems.Add(tmpEntrada.Rows[i]["id_articulo"].ToString());
                    lvEntrada.Items[i].SubItems.Add(tmpEntrada.Rows[i]["articulo"].ToString());
                    lvEntrada.Items[i].SubItems.Add(String.Format("{0:N}",
                        Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"])));
                    lvEntrada.Items[i].SubItems.Add(String.Format("{0:C}",
                        Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])));
                    lvEntrada.Items[i].SubItems.Add(String.Format("{0:C}",
                        (Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]) *
                        Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]))));
                    varTOTAL += Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]) *
                        Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]);
                    varIVA += (Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]) *
                        Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])) -
                        ((Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]) *
                        Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])) / (1.16));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        bool agregarArticulo(string prmId, double prmCantidad, double prmPrecioCompra, double prmIVA)
        {
            try
            {
                string varId = "";
                string varNombre = "";
                System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection(CnnStr);
                cnn.Open();
                string strSQL = "select articulo from articulos " +
                    "where id_articulo='" + prmId + "'";
                System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(strSQL, cnn);
                System.Data.OleDb.OleDbDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    varId = prmId;
                    varNombre = dr["articulo"].ToString(); ;
                    //agregamos la venta a la tabla temporal
                    DataRow row = tmpEntrada.NewRow();
                    row["id_articulo"] = varId;
                    row["articulo"] = varNombre;
                    row["cantidad"] = prmCantidad;
                    row["precio_compra"] = prmPrecioCompra;
                    row["iva"] = prmIVA;
                    tmpEntrada.Rows.Add(row);
                }
                else
                {
                    MessageBox.Show("El articulo no existe", "Error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return (false);
                }
                dr.Close();
                cnn.Close();

                return (true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return (false);
            }
        }
        bool grabarEntrada(string prmFechaEntrada, string prmFechaFactura, string prmFolioFactura,
         string prmNombreProveedor, string prmUserLogin)
        {
            try
            {
                System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection(CnnStr);
                cnn.Open();
                System.Data.OleDb.OleDbTransaction tran = cnn.BeginTransaction();
                System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand();
                cmd.Connection = cnn;
                cmd.Transaction = tran;
                //insertamos el registro de la Entrada
                try
                {
                    cmd.CommandText = "insert into entradas(fecha_entrada,fecha_factura,folio_factura,proveedor,user_login) " +
                        " values (#" + prmFechaEntrada + "#,#" + prmFechaFactura + "#,'" +
                        prmFolioFactura + "','" + prmNombreProveedor + "','" + prmUserLogin + "')";
                    cmd.ExecuteNonQuery();
                    //obtenemos el folio
                    int _FolioEntrada = 0;
                    cmd.CommandText = "select @@identity";
                    _FolioEntrada = Convert.ToInt32(cmd.ExecuteScalar());
                    //insertamos el detalle de laentrada
                    for (int i = 0; i < tmpEntrada.Rows.Count; i++)
                    {
                        string _IdArticulo = Convert.ToString(tmpEntrada.Rows[i]["id_articulo"]);
                        double _Cantidad = Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]);
                        double _IVA = Convert.ToDouble(tmpEntrada.Rows[i]["iva"]);
                        double _PrecioCompra = Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]);
                        double _CostoPromedio = 0;
                        //insertamos el articulo
                        cmd.CommandText = "insert into entradas_detalle(id_entrada,id_articulo,cantidad,precio_compra,iva) " +
                            "values(" + _FolioEntrada + ",'" + _IdArticulo + "'," + _Cantidad + "," +
                            _PrecioCompra + "," + _IVA + ")";
                        cmd.ExecuteNonQuery();
                        //actualizamosexistencias
                        cmd.CommandText = "update articulos set " +
                            " existencia=existencia + " + _Cantidad + "" +
                            " where id_articulo='" + _IdArticulo + "'";
                        cmd.ExecuteNonQuery();
                        //establecemos el costo promedio
                        cmd.CommandText = "select avg(precio_compra) " +
                            " from entradas_detalle " +
                            " where id_articulo='" + _IdArticulo + "'";
                        _CostoPromedio = Convert.ToDouble(cmd.ExecuteScalar());
                        cmd.CommandText = "update articulos set " +
                            " costo_promedio=" + _CostoPromedio + "" +
                            " where id_articulo='" + _IdArticulo + "'";
                        cmd.ExecuteNonQuery();
                    }
                    //finalizamos la transaccion
                    tran.Commit();
                    cnn.Close();
                    MessageBox.Show("Entrada grabada correctamente",
                    "Información del Sistema", MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
                    return (true);
                }
                catch (System.Data.OleDb.OleDbException errEntrada)
                {
                    tran.Rollback();
                    cnn.Close();
                    MessageBox.Show(errEntrada.Message);
                    return (false);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return (false);
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                if (agregarArticulo(txtIdArticulo.Text,
                    Convert.ToDouble(txtCantidad.Text),
                    Convert.ToDouble(txtPrecioCompra.Text),
                    0.16))
                {
                    mostrarEntrada();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnGrabar_Click(object sender, EventArgs e)
        {
            if (grabarEntrada(dtpFechaEntrada.Value.ToShortDateString(),
 dtpFechaFactura.Value.ToShortDateString(),
 txtFolioFactura.Text, txtNombreProveedor.Text,"admin")) {
     this.Close();
}
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Desea Salir?", "Salir", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == System.Windows.Forms.DialogResult.Yes)
            {
                this.Close();
            }
        }

        private void txtIdArticulo_TextChanged(object sender, EventArgs e)
        {

        }

        private void txtFolioFactura_TextChanged(object sender, EventArgs e)
Espero y me puedan ayudar gente, se los agradeceria mucho, sin mas por el momento les mando un saludo :)
Gracias de antemano!!
 

maweeVR

Bovino maduro
#2
primero corrije lo de la ruta, como va a ir en el instalador indica que se va a colocar el archivo *.accdb en la misma ruta que el ejecutable de tu aplicacion, con la instruccion Directory.GetCurrentDirectory() puedes obtener la ruta exacta de los archivos en tu carpeta de aplicacion.

String Ruta = Directory.GetCurrentDirectory() +@"\almacen.accdb;";
DataTable tmpEntrada = new DataTable();
string CnnStr = @" Provider=Microsoft.ACE.OLEDB.12.0; " +
"Data Source="+Ruta +
"Jet OLEDB:Database Password=; Persist Security Info=False;";

Espero te sirva, salu2
 

ProfesiorX

Bovino adolescente
#3
Bueno, de hecho no necesitas poner la ruta a tu base de datos, a menos que guardes la base de datos en un directorio DIFERENTE al de tu aplicacion, pero si tu base de datos la colocas en el mismo directorio de tu aplicacion, entonces tu cadena de conexion quedaria asi:

Código:
            CnnStr = @" Provider=Microsoft.ACE.OLEDB.12.0; " +
             "Data Source=almacen.accdb; " +
             "Jet OLEDB:Database Password=; Persist Security Info=False;";
Ahora respecto al otro error, el problema lo tienes en tu cadena de consulta, el campo articulo_id al parecer es autonumerico, no texto, y tu lo estas encerrando con '' como si fuera texto. Modifica tu cadena de consulta de esta manera:

Código:
                string strSQL = "select articulo from articulos " +
                    "where id_articulo=" + prmId;
Y ya no te marcara error, sin embargo, no es recomendable hacer concatenacion de cadenas cuando haces consultas SQL, porque eso abre la posibilidad para vulnerabilidad de inyeccion SQL, lo mas recomendable es usar consultas parametrizadas, de esa forma garantizas que los parametros se inserten de manera correcta sin peligro de inyecccion de codigo SQL.

Entonces lo mas correcto seria lo siguiente:

Código:
                System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection(CnnStr);
                cnn.Open();

                // Usa consultas parametrizadas
                string strSQL = "select articulo from articulos " +
                    "where id_articulo=@id_articulo";
                System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(strSQL, cnn);

                // Usa consultas parametrizadas
                System.Data.OleDb.OleDbParameter parametro = 
                    new System.Data.OleDb.OleDbParameter("@id_articulo", prmId);
                cmd.Parameters.Add(parametro);

                System.Data.OleDb.OleDbDataReader dr = cmd.ExecuteReader();
Saludos :)
 
#4
Muchas gracias a ambos por sus respuestas ya no me da problema con eso del a ruta para la base de datos :D
Pero respecto al segundo problema de los parametros ya meti este codigo
string strSQL = "select articulo from articulos " +
"where id_articulo=" + prmId;
Y nada ;( aun sigue sin funcionar, aun asi muchas gracias a ambos :D
 

ProfesiorX

Bovino adolescente
#5
Dices que no funciona, pero en todo caso que error te marca, ¿es el mismo o es otro error? ¿ya probaste el segundo codigo con consultas parametrizadas?

A mi parecer, creo que es error con tu tabla y la sintaxis de tu SQL, deberias subir el proyecto completo, si es que se puede, asi podriamos encontrar la fuente de tu error.

Saludos :)
 
#6
Dices que no funciona, pero en todo caso que error te marca, ¿es el mismo o es otro error? ¿ya probaste el segundo codigo con consultas parametrizadas?

A mi parecer, creo que es error con tu tabla y la sintaxis de tu SQL, deberias subir el proyecto completo, si es que se puede, asi podriamos encontrar la fuente de tu error.

Saludos :)
Sip exactamente el miso error, ya intente de las dos maneras y nada aun, aqui te dejo el link del proyecto, espero no ser mucha molestia :(
http://www.mediafire.com/?wvz2o6bb3wsv11q

Saludos :D
 

ProfesiorX

Bovino adolescente
#7
Tu archivo fue borrado por violacion a los terminos de servicio de mediafire , asi que no lo pude bajar ¿pues que subiste? XD

Parece que el destino no quiere que te ayudemos,

Pues ojala y lo puedas subir de otra manera

Saludos :)
 

ProfesiorX

Bovino adolescente
#10
Bueno, por fin despues de estar batallando con el programa, hemos encontrado cual es el error, y es una tonteria.

Tal como sospechaba, es un error en tu tabla, bueno, mas correctamente con el nombre de un campo.

En tu tabla el nombre del campo articulo de tu tabla articulos tiene acento en la i, y en tu consulta, no tienes ningun acento.

Vi ademas otros campos de tu tabla que tienen acentos, mi recomentacion es que en los nombres de los campos no utilices acentos para evitarte problemas como este.

Saludos y suerte con tu proyecto :)
 
Arriba