Introducción
El objetivo de este articulo será el de demostrar con un ejemplo simple como hacer uso de ado.net para trabajar de forma simple con los datos, realizando operación de CRUD (Create, Read, Update and Delete) .
Si bien esta aplicación de ejemplo hace uso del código desarrollado directamente en el propio formulario, se vera que el uso de funciones en la estructurada ordena el código dejándolo mas legible, permitiendo además mover la funcionalidad de lugar si en el futuro hiciera falta sin afectar el funcionamiento.
La aplicación de ejemplo solo cuenta con un formularios, que observaran en esta imagen
1 – Obtener información
Si se analiza el código se vera que es por medio de ingreso de un id valido en el campo que corresponde y mediante la acción de la tecla Enter se realiza la búsqueda.
[C#]
private void txtId_KeyPress(object sender, KeyPressEventArgs e) { if((int)e.KeyChar == (int)Keys.Enter) { // // Validaciones // errProvider.SetError(txtId, ""); int Id = 0; if (!int.TryParse(txtId.Text, out Id)) { errProvider.SetError(txtId, "El Id debe ser un valor numerico"); return; } if (!Exists(Id)) { errProvider.SetError(txtId,"El Id ingresado no existe."); return; } Obtener(Id); } } private void Obtener(int Id) { string sql = @"SELECT Id ,NombreCompleto ,Direccion ,FechaNacimiento FROM Contactos WHERE Id = @Id"; using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", Id); conn.Open(); SqlDataReader reader = command.ExecuteReader(); if (reader.Read()) { txtNombre.Text = Convert.ToString(reader["NombreCompleto"]); txtDireccion.Text = Convert.ToString(reader["Direccion"]); dtpFechaNanimiento.Value = Convert.ToDateTime(reader["FechaNacimiento"]); } } } private bool Exists(int Id) { string sql = @"SELECT COUNT(*) FROM Contactos WHERE Id = @Id"; using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", Id); conn.Open(); int count = Convert.ToInt32(command.ExecuteScalar()); if (count == 0) return false; else return true; } }
[VB.NET]
Private Sub txtId_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) If AscW(e.KeyChar) = CInt(Keys.Enter) Then ' ' Validaciones ' errProvider.SetError(txtId, "") Dim Id As Integer = 0 If Not Integer.TryParse(txtId.Text, Id) Then errProvider.SetError(txtId, "El Id debe ser un valor numerico") Return End If If Not Exists(Id) Then errProvider.SetError(txtId, "El Id ingresado no existe.") Return End If Obtener(Id) End If End Sub Private Sub Obtener(Id As Integer) Dim sql As String = "SELECT Id" & _ ",NombreCompleto" & _ ",Direccion" & _ ",FechaNacimiento " & _ "FROM Contactos " & _ "WHERE Id = @Id" Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim command As New SqlCommand(sql, conn) command.Parameters.AddWithValue("Id", Id) conn.Open() Dim reader As SqlDataReader = command.ExecuteReader() If reader.Read() Then txtNombre.Text = Convert.ToString(reader("NombreCompleto")) txtDireccion.Text = Convert.ToString(reader("Direccion")) dtpFechaNanimiento.Value = Convert.ToDateTime(reader("FechaNacimiento")) End If End Using End Sub Private Function Exists(Id As Integer) As Boolean Dim sql As String = "SELECT COUNT(*) " & _ "FROM Contactos " & _ "WHERE Id = @Id" Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim command As New SqlCommand(sql, conn) command.Parameters.AddWithValue("Id", Id) conn.Open() Dim count As Integer = Convert.ToInt32(command.ExecuteScalar()) If count = 0 Then Return False Else Return True End If End Using End Function
En esta sección de código se observara la recuperación de una entidad en base al id ingresado por el usuario.
En el evento KeyPress del textbox que presenta al Id se detecta la presión de la tecla Enter como medio para indicar la búsqueda de un contacto.
Entre las validaciones a realizar se verifica que el id ingresado sea numérico, también se valida que el registro exista en la base de datos, para ello es que se realiza la primer consulta que esta encapsulada en la función Exists(), esta tomara el id ingresado y ejecutara una consulta que devolverá el numero de registros que coincidan en este caso con el id ingresado, si el valor es cero entonces el registro no existe.
El método ExecuteScalar() del objeto SqlCommand es ideal para estos casos ya que devolver el valor del primer registro y la primer columna, como en este caso solo hay un valor pues se hizo uso de la función SQL Count() devolverá dato simple.
Una vez validada la existencia se procede a recuperar el registro, para ello la función de Obtener() cumplirá la misión, requiriendo que se le pase como parámetro el id del registro a obtener
Como se observa este tiene una estructura similar a la Exists() solo que no usa el ExcecuteScalar(), sino que obtiene un SqlReader, usando ExecuteReader() del objeto SqlCommand.
En este caso se sabe con anticipación que solo será devuelto un registro no hace falta hacer un loop por cada registro, por lo general se utiliza la sentencia “while”, en este caso el if cumple la función perfectamente para posicionar el cursor del reader a la primer posición, y poder realizar la lectura, entonces el if cumple básicamente dos funciones:
- permite validad que hay registros que leer, si por algún fallo no hubiera registro al llegar al if pasaría por false.
- al ejecutar el Read() del objeto SqlReader, posiciona el cursos para su lectura
Por ultimo se iguala el valor de cada campo de la consulta, realizando la conversión de tipos y asignadla a los respectivos controles.
Como se habrá observado hasta aquí y también se notaran en los ejemplos siguientes, los pasos para usar los objetos de ado.net son bastante repetitivos:
1- Se crea un objeto SqlConnection para establecer la conexión hacia la base de datos
2- Se crea el objeto SqlCommand, para establecer la consulta que se realizara, y se le asignan a este los parámetros si es que hacen falta
3- en este punto existirá un bifurcación
3a- Si se usa un DataReader, se podrá ejecutar directamente mediante el ExecuteReader()
3b- Si se usa un DataSet o DataTable, será necesario utilizar un SqlDataAdapter, para realizar el Fill() del objeto a cargar con los datos provenientes de la consulta.
2 - Insertar nuevo registro
La operación de insertar registro tiene algunas particularidades que necesitas ser detalladas.
Tanto la operación de insertar o actualizar será ejecutada mediante el mismo botón a nivel de interfaz del usuario, para ello es que se identifica si el id que se define existe o no (usando la función Exists(), antes comentada), esto podrá ser visto en el evento Click del botón Guardar.
El primer punto que hay que aclarar es que en este primer ejemplo no se hace uso de un campo autonumérico (o Identity) para el id de la tabla. Es por ello que se deberá obtener por medio de código cual será el próximo numero identificador a utilizar.
Para esta operación es que existe la función MaxId(), la cual hace uso de otra función SQL, en este caso MAX() que retornada el valor máximo existente en la tabla para un determinado campo que indiquemos. En este caso por tratarse de un valor simple, nuevamente se usa el ExecuteScalar() del SqlCommand.
[C#]
private void btnGuardar_Click(object sender, EventArgs e) { // // Validaciones // int Id = 0; if (!string.IsNullOrEmpty(txtId.Text)) { if (!int.TryParse(txtId.Text, out Id)) { MessageBox.Show("El Id debe ser un valor numerico"); return; } } if (Exists(Id)) { bool result = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value); if (result) MessageBox.Show("El registro se ha actualizado correctamente."); } else { bool result = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value); if (result) MessageBox.Show("El registro se ha insertado correctamente."); } } private bool Insert(string nombre, string direccion, DateTime fechaNacimiento) { string sql = @"INSERT INTO Contactos (Id ,NombreCompleto ,Direccion ,FechaNacimiento) VALUES (@Id, @Nombre, @Direccion, @FechaNacimiento)"; using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { int NextId = MaxId() + 1; SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", NextId); command.Parameters.AddWithValue("Nombre", nombre); command.Parameters.AddWithValue("Direccion", direccion); command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento); conn.Open(); int rowsAffected = command.ExecuteNonQuery(); if (rowsAffected > 0) return true; else return false; } } private static int MaxId() { string sql = @"SELECT MAX(Id) FROM Contactos"; using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); conn.Open(); return Convert.ToInt32(command.ExecuteScalar()); } }
[VB.NET]
Private Sub btnGuardar_Click(sender As Object, e As EventArgs) ' ' Validaciones ' Dim Id As Integer = 0 If Not String.IsNullOrEmpty(txtId.Text) Then If Not Integer.TryParse(txtId.Text, Id) Then MessageBox.Show("El Id debe ser un valor numerico") Return End If End If If Exists(Id) Then Dim result As Boolean = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value) If result Then MessageBox.Show("El registro se ha actualizado correctamente.") End If Else Dim result As Boolean = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value) If result Then MessageBox.Show("El registro se ha insertado correctamente.") End If End If End Sub Private Function Insert(nombre As String, direccion As String, fechaNacimiento As DateTime) As Boolean If Not ValidateForm() Then Return False End If Dim sql As String = "INSERT INTO Contactos (Id" & _ ",NombreCompleto" & _ ",Direccion" & _ ",FechaNacimiento)" & _ "VALUES (@Id, " & _ "@Nombre, " & _ "@Direccion, " & _ "@FechaNacimiento)" Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim NextId As Integer = MaxId() + 1 Dim command As New SqlCommand(sql, conn) command.Parameters.AddWithValue("Id", NextId) command.Parameters.AddWithValue("Nombre", nombre) command.Parameters.AddWithValue("Direccion", direccion) command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento) conn.Open() Dim rowsAffected As Integer = command.ExecuteNonQuery() If rowsAffected > 0 Then ClearControls() Return True Else Return False End If End Using End Function Private Function MaxId() As Integer Dim sql As String = "SELECT MAX(Id)" & _ "FROM Contactos" Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim command As New SqlCommand(sql, conn) conn.Open() Return Convert.ToInt32(command.ExecuteScalar()) End Using End Function
En el método Insert() se observara que la consulta hace uso de parámetros para asignar los valores, es por ello que el objeto SqlCommand posee la propiedad Parameters, y en esta se hace uso de la forma rápida por medio de método AddWithValue(), definiendo el nombre del parámetro y el valor.
Además se hace uso de otra del las funciones del SqlCommand el ExecuteNonQuery(), este es útil ante consultas SQL de actualización, o sea no retornan un conjunto de datos. Este método si devolver un valor entero que indicara la cantidad de registros afectados, si este devuelve cero quiere decir que no se actualizaron registro, en este ejemplo esto indicaría un fallo en la aplicación ya que siempre al menos un registro debe ser insertado de forma correcta.
3 – Actualizar registro existente
La operación de actualización es bastante similar a la operación anterior de insert, salvando la diferencia que cambia completamente la sentencia sql utilizada.
Al igual que con el insert, se hacen uso de parámetros para asignar los valores a la consulta, salvo que este necesita contar con el id del registro que se quiere actualizar y será utilizado en la sección del WHERE que permitirá identificar que registro afectar con los cambios.
[C#]
private void btnGuardar_Click(object sender, EventArgs e) { // // Validaciones // int Id = 0; if (!string.IsNullOrEmpty(txtId.Text)) { if (!int.TryParse(txtId.Text, out Id)) { MessageBox.Show("El Id debe ser un valor numerico"); return; } } if (Exists(Id)) { bool result = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value); if (result) MessageBox.Show("El registro se ha actualizado correctamente."); } else { bool result = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value); if (result) MessageBox.Show("El registro se ha insertado correctamente."); } } private static bool Update(int id, string nombre, string direccion, DateTime fechaNacimiento) { string sql = @"UPDATE Contactos SET NombreCompleto = @Nombre ,Direccion = @Direccion ,[FechaNacimiento] = @FechaNacimiento WHERE Id = @Id"; using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", id); command.Parameters.AddWithValue("Nombre", nombre); command.Parameters.AddWithValue("Direccion", direccion); command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento); conn.Open(); int rowsAffected = command.ExecuteNonQuery(); if (rowsAffected > 0) return true; else return false; } }
[VB.NET]
Private Sub btnGuardar_Click(sender As Object, e As EventArgs) ' ' Validaciones ' Dim Id As Integer = 0 If Not String.IsNullOrEmpty(txtId.Text) Then If Not Integer.TryParse(txtId.Text, Id) Then MessageBox.Show("El Id debe ser un valor numerico") Return End If End If If Exists(Id) Then Dim result As Boolean = Update(Id, txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value) If result Then MessageBox.Show("El registro se ha actualizado correctamente.") End If Else Dim result As Boolean = Insert(txtNombre.Text, txtDireccion.Text, dtpFechaNanimiento.Value) If result Then MessageBox.Show("El registro se ha insertado correctamente.") End If End If End Sub Private Function Update(id As Integer, nombre As String, direccion As String, fechaNacimiento As DateTime) As Boolean If Not ValidateForm() Then Return False End If Dim sql As String = "UPDATE Contactos SET " & _ "NombreCompleto = @Nombre" & _ ",Direccion = @Direccion" & _ ",[FechaNacimiento] = @FechaNacimiento " & _ "WHERE Id = @Id" Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim command As New SqlCommand(sql, conn) command.Parameters.AddWithValue("Id", id) command.Parameters.AddWithValue("Nombre", nombre) command.Parameters.AddWithValue("Direccion", direccion) command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento) conn.Open() Dim rowsAffected As Integer = command.ExecuteNonQuery() If rowsAffected > 0 Then Return True Else Return False End If End Using End Function
4 – Eliminar registro
Eliminar un registro es una operación bastante simple, con solo proporcionar el identificador para definir la sección del WHERE en la sintaxis de eliminación es suficiente.
En el ejemplo se realiza una operación previa que valida que id exista, pero también se podría haber obviado esta validación utilizando el valor proporcionado por el usuario.
[C#]
private void btnEliminar_Click(object sender, EventArgs e) { // // Validaciones // errProvider.SetError(txtId, ""); int Id = 0; if (!int.TryParse(txtId.Text, out Id)) { errProvider.SetError(txtId, "El Id debe ser un valor numerico"); return; } if (!Exists(Id)) { errProvider.SetError(txtId, "El Id ingresado no existe."); return; } // // Elimino contacto // bool result = Delete(Id); if (result) { MessageBox.Show("El registro se ha eliminado correctamente."); ClearControls(); } } public bool Delete(int Id) { string sql = @"DELETE FROM Contactos WHERE Id = @Id"; using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", Id); conn.Open(); int rowsAffected = command.ExecuteNonQuery(); if (rowsAffected > 0) return true; else return false; } }
[VB.NET]
Private Sub btnEliminar_Click(sender As Object, e As EventArgs) ' ' Validaciones ' errProvider.SetError(txtId, "") Dim Id As Integer = 0 If Not Integer.TryParse(txtId.Text, Id) Then errProvider.SetError(txtId, "El Id debe ser un valor numerico") Return End If If Not Exists(Id) Then errProvider.SetError(txtId, "El Id ingresado no existe.") Return End If ' ' Elimino contacto ' Dim result As Boolean = Delete(Id) If result Then MessageBox.Show("El registro se ha eliminado correctamente.") ClearControls() End If End Sub Public Function Delete(Id As Integer) As Boolean Dim sql As String = "DELETE FROM Contactos " & _ "WHERE Id = @Id" Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim command As New SqlCommand(sql, conn) command.Parameters.AddWithValue("Id", Id) conn.Open() Dim rowsAffected As Integer = command.ExecuteNonQuery() If rowsAffected > 0 Then Return True Else Return False End If End Using End Function
Acerca de los ejemplos
Para poder ejecutar correctamente los ejemplo necesitar Visual Studio 2008 y Sql Server Express instalado y corriendo localmente.
[C#]
|
[VB.NET]
|
Hola leandro, te felicito excelente ejemplo.
ResponderEliminarExcelente Ejemplo Leandro!!!!!!!!
ResponderEliminarMe sirvió mucho para aclarar dudas.
Muchas Gracias.
Saludos Leandro... Gracias por el ejemplo... Me podrias ayudar sino es mucha molestia con el codigo del ejemplo??? Un link para descargarlo??? Muchas gracias de antemano...
ResponderEliminarhola Julio
ResponderEliminarte refieres al ejemplo del articulo ? si es asi alli mismo al final del mismo estan las carpetas (de color amarillo) que te llevaran a la pagina de descarga
saludos
Muchas gracias, abri la pagina en otro navegador y pude ver las carpetitas... Gracias..
ResponderEliminarHola Leandro, disculpa nuevamente la molestia, tengo .NET 2010 no pasa lo que guardo a la base de SQL, me podrias ayudar con eso??? Me sale una advertencia: Warning 1 function 'Update' shadows an overloadable member declared in the base class 'Control'. If you want to overload the base method, this method must be declared 'Overloads'. C:\Users\Julio\Desktop\[vb.net] WinAdoNET\WinAdoNET\Contactos.vb 277 19 WinAdoNET
ResponderEliminarGracias y perdon por la molestia...
hola julitocristiano
ResponderEliminardisculpa la tardanza en la respuesta
Te comento, no es grave el problema, pero no lo habia visto antes.
Resulta que si sigues el arbol de herencia de un formularios ,este hereda de la clase Forms que a su vez hereda de ContainerControl, el cual lo hace de ScrollableControl y por ultimo este de Control.
Resulta que este ultimo, o sea "Control" define el metodo Update(), usado para realizar un repintado, por lo tanto seria bueno si cambias el nombre de este metodo, para que no colisione con el existente.
Por ahi usar un UpdateContacto(), con eso deberia alcanzar.
saludos
donde se declararon los parametros que esta utilizando @nombre por ejemplo
ResponderEliminardonde se declaran los parametros @nombre, etc
ResponderEliminarhola K-loca
ResponderEliminarcomo veras en la query se declara algo como esto
string sql = @"INSERT INTO Contactos (Id
,NombreCompleto
,Direccion
,FechaNacimiento)
VALUES (@Id,
@Nombre,
@Direccion,
@FechaNacimiento)";
y el parametro luego esta debajo
en el command cuando se haces
command.Parameters.AddWithValue("Nombre", nombre);
por ahi no queda claro pero si usas
command.Parameters.AddWithValue("@Nombre", nombre);
o sea poniendo el @ tambien es valido, poner o no el @ es opcional
saludos
lo que pasa es que modifique este metodo para una aplicacion
ResponderEliminarmia
Private Function Insert(nombre As String, direccion As String, fechaNacimiento As DateTime) As Boolean
29.
If Not ValidateForm() Then
30.
Return False
31.
End If
32.
33.
Dim sql As String = "INSERT INTO Contactos (Id" & _
34.
",NombreCompleto" & _
35.
",Direccion" & _
36.
",FechaNacimiento)" & _
37.
"VALUES (@Id, " & _
38.
"@Nombre, " & _
39.
"@Direccion, " & _
40.
"@FechaNacimiento)"
41.
42.
43.
Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
44.
Dim NextId As Integer = MaxId() + 1
45.
46.
Dim command As New SqlCommand(sql, conn)
47.
command.Parameters.AddWithValue("Id", NextId)
48.
command.Parameters.AddWithValue("Nombre", nombre)
49.
command.Parameters.AddWithValue("Direccion", direccion)
50.
command.Parameters.AddWithValue("FechaNacimiento", fechaNacimiento)
51.
52.
conn.Open()
53.
54.
Dim rowsAffected As Integer = command.ExecuteNonQuery()
55.
56.
If rowsAffected > 0 Then
57.
ClearControls()
58.
Return True
59.
Else
60.
Return False
61.
62.
End If
pero me dice que la variable escalar @RPIndirecto no ha sido declarada aunque yo deje su metodo igual colo cambie las variables de su ejemplo por las mias
63.
End Using
64.
65.
End Function
hola
ResponderEliminarpero si has dejado el codigo tan cual lo pones aqui, no veo ningun campo o parametro de nombre: RPIndirecto
es mas no veo escrito RPIndirecto por ninguna lado en ese codigo
estas segura que es en ese codigo donde falla, no sera en otro sitio ?
realiza una busqueda en el codigo para localizar donde usar la palabra "RPIndirecto" y ver si codigo pasa por alli cuando falla
saludos
Hola buenas tardes Leandro le escribo por que tengo un problema estoy trabajando con un datatagridView1 con comboboxcell.
ResponderEliminarpuede hacer que guardara lo que esta contenido en las columnas del datagrid a mi tabla en la BD , asi mismo segui un consejo que le dio a mi compañero de mandar a guardar las filas cada vez que se que se realiza un loop y lo hago de esta forma
For Each row As DataGridViewRow In DataGridView1.Rows
For Each col As DataGridViewColumn In DataGridView1.Columns
Dim comboboxCell As DataGridViewComboBoxCell = TryCast(row.Cells(col.Index), DataGridViewComboBoxCell)
' Dim renglon As DataGridViewComboBoxCell = TryCast(row.Cells(row.Index), DataGridViewComboBoxCell)
If comboboxCell.Selected Then
'For fila As Integer = row.Index To DataGridView1.SelectedRows.Count - 1
' For j = 0 To DataGridVie w1.Rows.GetLastRow(DataGridViewElementStates.Displayed)
'result = Insertar_plan_Tratamiento(Me.TextBox2.Text, Me.TextBox1.Text, Me.TextBox3.Text, row.Cells(0).Value.ToString(), row.Cells(1).Value.ToString(), row.Cells(2).Value.ToString(), row.Cells(3).Value.ToString(), row.Cells(4).Value.ToString(), row.Cells(5).Value.ToString(), row.Cells(6).Value.ToString(), row.Cells(7).Value.ToString(), row.Cells(8).Value.ToString(), row.Cells(9).Value.ToString(), row.Cells(10).Value.ToString(), row.Cells(11).Value.ToString())
result = Insertar_plan_Tratamiento(Me.TextBox2.Text, Me.TextBox1.Text, Me.TextBox3.Text, DataGridView1.Rows(0).Cells(0).Value.ToString(), DataGridView1.Rows(0).Cells(1).Value.ToString, DataGridView1.Rows(0).Cells(2).Value.ToString, DataGridView1.Rows(0).Cells(3).Value.ToString(), DataGridView1.Rows(0).Cells(4).Value.ToString, DataGridView1.Rows(0).Cells(5).Value.ToString, DataGridView1.Rows(0).Cells(6).Value.ToString, DataGridView1.Rows(0).Cells(7).Value.ToString, DataGridView1.Rows(0).Cells(8).Value.ToString, DataGridView1.Rows(0).Cells(9).Value.ToString, DataGridView1.Rows(0).Cells(10).Value.ToString, DataGridView1.Rows(0).Cells(11).Value.ToString())
result = Insertar_plan_Tratamiento(Me.TextBox2.Text, Me.TextBox1.Text, Me.TextBox3.Text, DataGridView1.Rows(1).Cells(0).Value.ToString(), DataGridView1.Rows(1).Cells(1).Value.ToString, DataGridView1.Rows(1).Cells(2).Value.ToString, DataGridView1.Rows(0).Cells(3).Value.ToString(), DataGridView1.Rows(1).Cells(4).Value.ToString, DataGridView1.Rows(0).Cells(5).Value.ToString, DataGridView1.Rows(1).Cells(6).Value.ToString, DataGridView1.Rows(1).Cells(7).Value.ToString, DataGridView1.Rows(1).Cells(8).Value.ToString, DataGridView1.Rows(1).Cells(9).Value.ToString, DataGridView1.Rows(1).Cells(10).Value.ToString, DataGridView1.Rows(1).Cells(11).Value.ToString())
el problema ahora es que algunas corridas result toma el valor de falso (y portanto no puedo guardar) aunque yo haya elejido esas filas y le mande a la bd su cadena de inserción se salta la operación y me manda al siguiente paso ¿Cual puede ser mi error? de antemano gracias
If result1 Then
If result Then
MsgBox("Se ha registrado correctamente", MsgBoxStyle.Information, "RENDO")
End If
Else
End If
'Next
End If
Next
Next
'Next
' End If
Catch
End Try
hola K-loca
ResponderEliminaralgo que noto no estar correcto es que haces un loop por las columans cuando no lo necesitas, solo deberias recorrer las filas y tomar de forma fija las columnas, como bien lo haces cuando usas
Cells(0), Cells(1), etc, si haces esto porque usar un for de las columnas, justamente no lo necesitas
ademas usas esto
DataGridView1.Rows(0)
o sea accedes simpre a la primer fila para tomar la info, cuando deberias usar
row.Cells(0).Value.ToString(),
row.Cells(1).Value.ToString(),
etc
de esta forma si cambias de fila por cada ciclo del for
saludos
Estimado Leandro,
ResponderEliminarAntes que nada quería agradecer tu esfuerzo por compartir tus habilidades y experiencias con otros.
Te quería consultar algo, a todas luces elemental, que sin embargo me tiene lleno de dudas. De tal manera que no solo se trata de "Copy & Paste" sin que hay que entender de que se trata.
En la Función "Exists" en la sentencia de SQL se usa "Select Count(*) From Contactos WHERE Id = @Id" Mi pregunta es: ¿Porqué se usa el "Count"? Yo probé la función solo con el * y me funciona perfectamente.
Sin duda su razón tendrá pero yo no lo he comprendido.
Gracias de antemano
Antes que nada, quisera expresarte mi agradecimiento por el notable esfuerzo que haces al compartir tus habilidades y experiencias con otros.
ResponderEliminarMi consulta, a todas luces elemental, es que en la función "Exists" usás la sentecia: ""SELECT COUNT(*) FROM Contactos WHERE Id = @Id" Pregunto: ¿Porqué se usa el "Count(*)"? Yo la usé "SELECT * FROM Contactos WHERE Id = @Id" e igual me funcionó sin problemas. Gracias de antemano por todo.
hola rvaldez
ResponderEliminarEn el metoso Exist() uso el COUNT porque necesito que me devuelva la cantidad de coincidencia que hay con respecto al filtro definodo en el WHERE
habras notado que esa funcion hace uso del ExecuteScalar() para recuperar el valor, bien esta lo que hace es tomar el valor del primer registro y la primer columna de la consulta
Si en ti caso da la casualidad que justo en la primer fila y primer columna se devuelve un valor numerico entonces tomara ese como resultado
quizas me equivoque pero la priemr columna de tu tabla no sera un id o codigo ? porque si es asi puede que funcione porque esta tomando ese valor numerico, pero no esta correcto, funciono pero de casualidad, no porque lo hace de forma correcta
recuerda que el Existe no siempre tiene que devolver un cero o uno, podrias el filtro devolver 0 o un valor distinto como ser 3 o mas, por dar un numero, en este caso no se usa pero se podria necesitar devolver la cantidad de coincidencias
saludos
ola amigo solo una cosa lo que pasa que yo tengo una base de datos de rentas de carros es una tarea y el profe me dijo que para no meter la informacio directo en la bd tengo que hacer un programa en c# y yo no se no me podrias ayudar que dices si quieres te mando la bd que tengo y la checas para que veas como funciona
ResponderEliminarhola eliut
ResponderEliminarpero si tu profesor te asigno la tarea de realizar un desarrollo en c#, la idea, no es que aprendas a programar en este lenguaje ?
se que recien te inicias y parace todo complejo, pero digo el profesor no aporto material o alguna explicacion del tema, solo te dio la orden de desarollarlo y eso es todos
desde mi lugar puedo darte consejos y material, pero no es mi ideologia realizar la tarea o desarrollo de otras personas, me gusta que aprendan el lenguaje que yo mismo uso todos los dias, y si hace falta proporcionar algun tip o camino a seguir
quizas deberias plantearle la situacion al profesor y que te recomiende material para empezar a aprender, o que se ponga las pilas y enseñe a programar
saludos
si mira lo que pasa que el profesor si nos dijo como utilizar el workbens mas o menos y nos dijo que que hicieramos un proyecto de hacer una base de datos en ese programa pero despues nos dijo que hicieramos aplicacion en cualquier otro lenguaje como ya te dije c# algo asi entonces el detalle es que yo casi en c# casi no lo del programa en worbens ya lo tengo mi base pero las alicaciones no las tengo y no se como hacerlo pero nos dijo que la clase es baase de datos y el no los va a ensenar a programar y ahy es donde patino
ResponderEliminarhola eliut
ResponderEliminarhay algunas partes que no quedaron claras
- que es workbens? es la base que usas o es el administador de la db
algo como ser
MySQL Workbench
menciona que base estas usando
- cuando mencionas "nos dijo que la clase es baase de datos" a que clases haces referencias ?
seran las de ado.net para conectarte a la db y recuperar la informacion
saludos
saludos
si mira yo tengo un manejador que se llama workbench de mysql en tonces yo ya tengo la informacion en workbench si ahora el profesor me dijo que hay que hacer las aplicaciones para que? bueno paara meter informacion capturar o hace una consultas como en c# u otro lenguaje de programaciony no se mucho de la programada claro con un poco de ayuda termino el proyecto y ademas aprendo eso ya con una sola ves que me digan lo pongo en practica y despues ya no se me dificulta mucho no se si me puedas ayudar que dices si no te quedo claro pos preguntame yo casi de esto no le se mucho pero aprendo rapido
ResponderEliminarHola leandro...necesito de tu ayuda...quiero que el usuario meta el id...pero si introduce un id que ya esta en uso que mande un mensaje...tengo una idea no muy concreta como lo hace con el metodo Exists en los ejemplos...me puedes poner como seria? gracias ;)
ResponderEliminarhola lfmluis
ResponderEliminarel tema es que como detectarias si es un insert o un update ?
la tecnica usada en el Exists() te es util tambien para validar
pero deberas buscarle una vuelta a la forma de conocer si estas en un insert o update
saludos
Gracias por responder, estaria usando un INSERT...como lo hago??
ResponderEliminarhola lfmluis
ResponderEliminarno veo que tienes que ver el uso del INSERT con la validacion de la existencia del id ingresado por el usuario
o es que usa un id autonumerico ?
saludos
Hola Leandro quisiera que me ayudes con esto. Necesito crear unos botones de forma dinamica al monento que el formulario esta en ejecucion y cuando otro usuario levante este formulario pueda visualizar el boton creado en la misma posicion, el lenguaje de programacion es .Net 2008. gracias por la respuesta
ResponderEliminarhola Cleider
ResponderEliminarpodrias guardar en uan base de datos la posocion del control en el formulario, o sea guardarias los puntos X e Y de la propiedad Location del control
entonces cuando se ejecuta el forma recuperas esta info de la tabla de la db y al crear el control puede asignar la localizacion del mismo mediante esta coordenada
saludos
gracias por los ejemplos.. pero tengo un problema hice 2 tablas en la base de datos en la primera configure todo altas, bajas y modificaciones pero en la segunda solo puedo dar de alta y a la hora de dar de baja me da error en la función obtener() cuando busco por id me da un error en esta linea
ResponderEliminarDim reader As SqlDataReader = command.ExecuteReader()
el error dice esto
System.Data.SqlClient.SqlException was unhandled
Class=16
ErrorCode=-2146232060
LineNumber=1
Message=Invalid column name 'IDUsuario'..........
hola Makaveli
ResponderEliminarno se que query estaras ejecutando pero el error esta mas que claro
el campo IDUsuario no existe en la tabla que estas consultando
valida que este campo exista en la tabla
saludos
Gracias!! ya lo solucione el IDUsuario si existe
ResponderEliminarlo unico que cambie fue el codigo este
Dim sql As String = "SELECT IDUsuario,NombreUsuario,ApellidosUsuario FROM Users WHERE IDUsuarios = '" & IDUsuariotxt.Text & "'"
todo lo demas lo deje igual, no se porque en esta tabla no me funciono la otra linea de select.
pero muchas gracias por tu ayudaaa!!!
Hola Leandro
ResponderEliminarTengo un problema el cual es el siguiente:
Quisiera insertar datos a una bd acces pero tomando como filtro o referencia el valor que contenga un TexBox. Es decir algo asi; "INSERT.. VALUES.. WHERE idpagos = '" & TextBox1 & "'" entiendo que una instrucción asi no funcionaria pero la pongo asi para referirme a lo que quiero lograr. El valor que tiene el TextBox es el id al que quiero que se inserten los datos. Como prodria resolver este problema?
Espero que puedas ayudarme de antemano muchas gracias
hola
ResponderEliminarpodria ser algo como
DataTable dt = new DataTable();
using (SqlConnection cnn = new SqlConnection("connection string")) {
string query = "SELECT * FROM NombreTabla WHERE campo = @param";
SqlCommand cmd = new SqlCommand(query, cnn);
cmd.Parameters.AddWithValue("@param", TextBox1.Text);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
la idea es que uses parametros y el resultado en este caso se vuelva a un datatable
saludos
Hola
ResponderEliminarEste es el codigo del boton con el inserto los datos:
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
If dgvSeleccion.Rows.Count > 0 Then
Dim SqlString As String = "" ' variable a la que asignaremos la sentencia
Dim ListSqlStrings As New ArrayList 'arregla donde ingresaremos las sentencias
'recorremos el datagrid como ya sabemos siempre se toma desde cero
For i As Integer = 0 To dgvSeleccion.Rows.Count - 1
'creamos la sentencia el row siempre tendra el valor de i para ir pasando de row en row
SqlString = "INSERT INTO pagos VALUES ('" + dgvSeleccion.Rows(i).Cells(1).Value.ToString() + "','" + dgvSeleccion.Rows(i).Cells(2).Value.ToString() + "')"
'agregamos la sentencia a la lista
ListSqlStrings.Add(SqlString)
Next
If EjecutarTransaccion(ListSqlStrings) Then
MessageBox.Show("Info. guardada correctamente")
'Close()
Else
MessageBox.Show("La Info. no se guardo")
End If
Else
MessageBox.Show("No hay informacion para guardar")
End If
Olvide mencionar que el valor que tiene el TextBox lo filtro de otro formulario (Form1), nose si esto afectara con respecto a lo que quiero lograr.
ResponderEliminarLo filtro con este codigo
Private Sub Form2_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim value As Object = m_row.Cells(0).Value
If (value IsNot DBNull.Value) Then
TextBox1.Text = CStr(value)
End If
End Sub
hola radx
ResponderEliminarme pregunto, de casualidad este articulo lo has analizado o visto el codigo, porque la verdad no puedo creer que analizando al menos este post plantees usar un codigo concatenendo el string para armar el INSERT, en lugar de usar parametros
el que el valor provenga de otro formulario puede influir y mucho si es que no se accede a la instancia correcta del formulario, pro es raro porque en el codigo que proporcionas no se nota la referencia a ningun otro form
saludos
Hola que tal Leandro.
ResponderEliminarSoy nuevo en C# y traer leer tus ejemplos hay muchas cosas que no logro entender. Mira tengo un form en el cual tengo varios textbox y un boton que quiero que al picarle guarde en la base de datos de SQL lo que contengan esos Textbox por lo que tomando tu codigo lo modifique para que "funcionara" con mi base de datos :D pero me manda varios errores espero puedas revisarlo, ya realice la conexion con el Visual Studio a la Base de datos.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
bool result = Insert(txtrazon.Text, txtcontacto.Text, txtdireccion.Text, txtciudad.Text, txtrfc.Text, txtcorreo.Text, txttelefono.Text, txtnotas.Text);
if (result)
MessageBox.Show("El registro se ha insertado correctamente.");
private bool Insert(string razon, string contacto, string direccion, string ciudad, string rfc, string correo, string telefono, string notas);
{
string sql = @"INSERT INTO DatosCliente (razonsocial,contacto,direccion,ciudad,frc,correo,telefono,notas) VALUES (@razon,@contacto,@direccion,@ciudad,@rfc,@correo,@telefono,@notas)";
using (SqlConnection conn = newSqlConnection(ConfigurationManager.ConnectionStrings["BasedeDatosConnectionString"].ToString()))
private void txtrazon_TextChanged(object sender, EventArgs e)
{
}
private void txtcontacto_TextChanged(object sender, EventArgs e)
{
}
private void txtdireccion_TextChanged(object sender, EventArgs e)
{
}
private void txtciudad_TextChanged(object sender, EventArgs e)
{
}
private void txtrfc_TextChanged(object sender, EventArgs e)
{
}
private void txtcorreo_TextChanged(object sender, EventArgs e)
{
}
private void txttelefono_TextChanged(object sender, EventArgs e)
{
}
private void txtnotas_TextChanged(object sender, EventArgs e)
{
}
}
}
}
}
hola Ivan
ResponderEliminarpero donde defines los parametros ? es mas donde ejecutas el codigo
quizas no se pego de forma correcta el codigo, es que en los blog es dificil poner codigo
porque no haces la pregunta en el foro
Msdn Foro C#
alli si se puede poner codigo de forma correcta
saludos
hola quisiera saber como hacer una conexión de mi base de datos que esta en sql 2008 con mi interfaz que esta en visual basic 2010, ayuda porfavor.. :D
ResponderEliminarhola helca
ResponderEliminarno entendi de que tipo de interfaz hablas ?
porque no usas como se plantea en el articulo las clases de ado.net?
saludos
Buenas,en primer lugar darte las gracias por tu pedazo de trabajo. Estoy haciendo un programa de gestión en el que tengo el apartado Clientes y Presupuestos. En el apartado Clientes tiene columnas llamadas Nombre, dirección... Mi duda es: ¿Tengo que "buscar" siempre? Es decir, yo lo que quiero es que al pulsar el botón añadir se abra una ventana y los textbox que tengo ahí, se pasen a una columna de la base de datos. Resumidamente, que en la ventana de añadir, lo que escriba en Nombre, dirección... se pase a la Base de datos y me cree un nuevo cliente. Cómo tendría que hacerlo, solo mirando la parte de "Añadir registro"? Estoy haciendo esto como favor personal, nunca trabajé en VB.net así que tengo un lio mental importante... jaja Gracias, espero tu respuesta.
ResponderEliminarhola Dylan
ResponderEliminarno necesitas realizar una busqueda de algo existente, si escribes solamente los datos sin ingresdar un id lo que hara es que ingresara por el INSERT para crear el registro
solo buscas cuando quieres actualizar algo existente, sino solo completas los otros campos y eso creara el registro, por eso esta el metod Exists() para comprobar que operacion debe realizar
saludos
Hola Leandro he leido bastante aportes tuyos y me han servido mucho y te lo agradesco, ahora tengo una duda tengo una BD de 42 tablas app. lo que quiero hacer es cuando exista un codigo de un producto este me lo actualice (la cantidad solamente, es decir si ya tenia 100 productos en la BD y ahora me llegaron 40 mas del mismo que me los sume es decir 140 ahora), si no esta el producto (código)que me agregue un nuevo producto a la BD.
ResponderEliminarno se si me explique bien saludos...
hola
ResponderEliminarquieres actualizar el stock del producto, o sea hacer un update como ser
UPDATE nombretabla SET stock = stock + @cantidad WHERE id = @idproducto
http://social.msdn.microsoft.com/Forums/es/vcses/thread/f3e4b4cd-b099-4a14-bc54-dcdf08864f2f
http://social.msdn.microsoft.com/Forums/es/vcses/thread/13de9741-5456-412d-8a44-e8c5d6650bf9
lo ejecutas como en los links, solo que en tu caso sumas
saludos
Buen dia Leandro, estoy haciendo una consulta a una bd en sql, donde necesito saber si existe un id, pero el id de la tabla lo tengo como varchar, es un numero de 12 caracteres, entonces estado tratando de convertir a un string como lo haces en tu ejemplo, pero tu lo haces con ID que es de tipo entero, me marca errores en la conversion por que le mando un string como parametro y me marca error en el COUNT(*) por que el ID que requiere es un valor escalar. Es en una pagina web de asp, talvez me puedas ayudar en eso, o si debo de cambiar mi id a otro tipo de valor, pero es de un numero de 12 caracteres. Saludos!!
ResponderEliminarhola
ResponderEliminarel Count() no aplaica sobre ningun campo en particular, por eso es count(*) este solo cuenta registros
si el campo id es varchar solo definelo en el WHERE como filtro de busqueda pasandole un string al parametro
pero el count() va a seguir devolviendo un valor numerico que representa el nro de filas que retornar la query
saludos
protected void Button1_Click(object sender, EventArgs e)
ResponderEliminar{
string var = BOX1.Text;
Msg.Text = var;
if (!Exists(var))
{
Msg.Text = var + " : " + " El RPU no existe. ";
return;
}
Obtener(var);
}
private void Obtener(string var)
{
string sql = @"SELECT ID_RPU, RPU FROM RPU WHERE ID_RPU = @var";
using (SqlConnection conn= new SqlConnection(ConfigurationManager.ConnectionStrings["contratosConnectionString"].ToString()))
{
SqlCommand command = new SqlCommand(sql, conn);
command.Parameters.AddWithValue("ID_RPU", var);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
BOXAREA.Text = Convert.ToString(reader["RPU"]);
}
}
}
private bool Exists(string var)
{
string sql= @"SELECT COUNT(*) FROM RPU WHERE ID_RPU= @var";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["contratosConnectionString"].ToString()))
{
SqlCommand command = new SqlCommand(sql, conn);
command.Parameters.AddWithValue("ID_RPU", var);
conn.Open();
int count = Convert.ToInt32(command.ExecuteScalar());
if (count == 0)
return false;
else
return true;
}
}
y cuando le doy clik al boton me manda el siguiente error;
Debe declarar la variable escalar "@ var".
hola Anonymous
ResponderEliminarclaro porque aqui
string sql= @"SELECT COUNT(*) FROM RPU WHERE ID_RPU= @var";
defines el parametro como @var
entonces lo correcto seria
command.Parameters.AddWithValue("@var", var);
defines el mismo nombre en ambos sitios
saludos
Ya funciono como me dijiste que lo corrigiera, muchas gracias Leandro, estan muy bien hechos tus tutoriales, me han servido de mucho, ojala sigas aportando mas de tus conocimientos, y tambien me quede con una duda, por que tiene que ser del mismo nombre la variable que se declara con el nombre de la columna de la tabla??? Saludos desde mexico.
ResponderEliminarhola Anonymous
ResponderEliminarte refieres al 2var con el var ?
no es necesario que sean iguales puedes cambiarlo, puedes poner
string sql= @"SELECT COUNT(*) FROM RPU WHERE ID_RPU= @idrpu";
y luego
command.Parameters.AddWithValue("@idrpu", var);
saludos
Hola estoy empezando a desarrollar en C# y kisiera saber si alguin pudiera pasarme un ejemplo de conexion a sql por medio de la ip del servidor
ResponderEliminarhola Luis
ResponderEliminaren este articulo
http://www.connectionstrings.com/sql-server-2008
se encuentran ejemplo de como armar una connection string usando el ip de la pc remota
saludos
Sos muy grosso chabón.
ResponderEliminarHola Leandro
ResponderEliminarTengo un problema de conexion de base de datos access 2010 a Visual Basic Express 2010 al momento de agregar registros nuevos me indica que no es posible debido a falla de conexion !ESPERO ME PUEDAS AYUDAR
GRACIAS POR TU ATENCION¡¡¡¡¡
hola FRANKDIVANE
ResponderEliminarde casualidad estas utilizando una pc de 64bits ? lo pregunto porque se que hay problemas con ms access y las pc con 64bits
cual es el mensaje de error que recibes ? podrias poner un try..catch para capturarlo
saludos
ola leandro lo que pasa es q queria saber si me podrias audar con una duda en visual basic 2008 es sobre como hago para que en un formulario cuando en un textbox escriba y despues le de guardar lo guarde en una base de datos y ala ves que si lo quiero imprimir el formulario pueda imprimirlo
ResponderEliminarhola Andrea
ResponderEliminarresponder lo que planteas seria muy largo, lo que me pregunto es conoces sobre ado.net ? porque si sabes de este podrias guardar el registro
ademas ni siquiera mencionaste de que base estas usando
para imprimirlo podrias crear un reporte en crystal reports o reporting service
saludos
ola leandro mira estoy utilisando access 2010 y visual basic 2008 pero se poco sobre programacion lo que quiero hacer es una aplicacion para mi consultorio que este en dos pc una en rececion y otro en mi consultorio lo que quiero es que cuando llegue un paciente y receciion tomen los datos hay mismo cuando valla entrar a mi consultosio se actualise la base de datos y yo abra la aplicacion y despues el formulario y ya este actualizado con los datos solo faltaria llenar los espacion de la consulta y despues guardarlos y cerrarlo y despues cuando quiera abrirlo yo pueda abrirlo con ell nombre del paciente o algo asi y me abra la historia de elquiero saver como hacerlo
ResponderEliminarpues yo ya ise una aplicacion que guarda datos pero muy baasicos y para solo un pc y nose como abrilos dactos ni como conectar dos pc ala misma base de datos me podrias ayudar leandro te lo agardeceriade todo corazon
hola Andrea
ResponderEliminarsi la idea es tener una db centralizada con Access te equivocaste, si bien se puede poner la db en una carpeta comparida de una de las PCs no es un camino muy bueno
lo idea es que uses una db como ser sql server el cual si esta pensado para este tipo de escenarios
saludos
sii tengo sql server leandro pero quisiera que si me podrias explicar mas como podria crear el programa que te dije ya como te abia dicho no tengo mucho conocimiento aver si me podrias ayudar a crearla dandome un poco de ayuda quiero saver que proyectos debo utilizar en visual basic ala hora de aser mi aplicacion como hago para hacer el formulario cuando lo llene con la historia del paciente se guarde y ala vez cuando quiera abrirlo lo busque con su numero de documento de identida y me abra el formulario del pasiente ya contodo lo que lo abia guardado y como hago para conectar los dos PCs porfa leandro me podrias ayudar te agradeceriaa mucho leandro
ResponderEliminarhola Andrea
ResponderEliminarpodrias hacer algo como esto
[WinForms] Edición Empleados – Grabar imagen en base de datos
como veras alli se hace uso de ado.net para recuperar los datos
lo que no mencionas es cuanto conoces sobre ado.net porque deberias estudiar sobre este para poder acceder a sql server y trabajar con los datos
en el ejemplo se hace uso de un mdf local, pero solo es cuestion de cambiar el connection string que esta en el app.config para apuntar a un sql server que instales en otra pc
http://www.connectionstrings.com/sql-server-2008
saludos
muchas gracias leandro una pregunta que proyectos devo utlisar en visual basic 2008 y sera que puedo aser una base mde datos en access y pasarla a sql server
ResponderEliminarmira que pena molestarte tanto disculpame pero quisera saver cual proyectos utlizo o cuales windows form la verda lamaplicacion es muy sencilla ya q me consultorio consta solo de dos personas yo y mi asistente porfa me podrias ayudar
ResponderEliminarhola Andrea
ResponderEliminarel proyecto que usarias sera un windows Application y si quieres seguir el ejemplo del link tambien un class library
aunque quizas como recomendacion diria que le dediques un poco a la lectura de programacion sino va a ser dificil seguir, sino sera como querer aprender a tocar el piano si saber que es una nota, aqui es lo mismo
http://social.msdn.microsoft.com/Forums/en-US/vbes/thread/c0c910c7-316f-4c4f-9d02-09ecc3b36d9b
en el link menciono un ebook online que podria ser util
saludos
leandro muchas gracias por responderme todas mis dudas leandro una ultima tengo esque como estoy creando mi formulario para consultorio en una parte me toca crear un odontograma es este loque pasa es que me toca crearlo porque es parte de mi trabajo va asosiado con el odontograma y no e podido crearlo lo que pasa es que el representa el diente de una persona y cada diente tiene varios caras como esta en la imagen lo que quiero es poner esa imagen y en mi formulario y cada cara avenes toca ponerle un color (rojo,naranja,negro,amarillo )
ResponderEliminarquisiera saber si me podrias ayudar a crearlo de programacion estoy aprendiendo poco a poco pero es que ese odontograma lo nesecito urgente porfa leandro ayudame plisss te lo agradeceriaa muchooo
este es el link del odontograma http://190.242.36.221/helponline/manuales_robohelp/manual_de_usuario_hc_odontologica_v1.0/Odontograma.htm me ayudaria mucho que pudieras ayudar a crear un odontograma asi para colorear cada cara de un diente
ResponderEliminarhola andrea
ResponderEliminarno se si visualmente vas a poder obtener lo mismo que la imagen, pero usando controles picturebox podrias ubicarlos para lograr algo como esto
http://www.odontosys.com/ayuda/imagenes/odontograma.png
podrias tambien poner un solo picturebox y despues tener imagen basica a la cual dinamicamente le pintas una seccion desde codigo usando GDI
pero vas a tener que estudiar algo de GDI para poder trabjar con al imagen
GDI+ Regions and Clipping in VB.NET
como veras con gdi puede tomar una imagen y pintarla donde encesites segun las opcioens que te marcaron para es diente
saludos
ola leandrom lo que pasa mira ya encontre algo y lo descargue para acomo darlo ami modo pero como tu me dices GDI+ ya intente por ese medio pero yo tengo visual basic 2008 express edition ya intente con pinturebox pero quiero saver como poder introducir un solo color en varias zonas de la imagen como descojer la el color que quiero ya tengo algo pero solo meda dos colores y me muestra solo catro dientes lo intente modificar fue un aporte que me isieron pero no pude no me deja nesecito ayuda urgente leandro quisiera que me ayudaras aver como hago para descgargar o agregar GDI+ a visual basic 2008 exprees edtion ya que no esta inculido ahi
ResponderEliminarademas leandro es que loque que pasa es que es para mi consultorio yo no quiero ponerme a crear programas basicamente quiero solo crear mi programa para no tener que estar atendiendo pacientes con hojas de papel ya que al archivar es un problema ayudame porfa
ResponderEliminarhola Andrea
ResponderEliminaren realidad no creo que el camino sea pintar una zona de una imagen sino que debes dibujar la imagen
CAPÍTULO II: Creando objetos Graphics, Pen y Font, y manejando las estructuras Pens y Color.
CAPÍTULO III: FORMAS BÁSICAS GDI+
o sea una imagen de base con al forma del diente puedes teenrla, pero depsues abres esa imagen y creas una copia para poder dibujar en ella quizas un rectangulo de un determinado color y lo ubicas en tal posicion y esa imagen representa una determinada opcion
tendris una imagen base donde por gdi le dibujas el resto segun la opcion que este definida para ese diente
intenta dibujar formas simples, como ser rectangulos o circulos y le aplcias color
saludos
ola leandro ya pude crear un poligono y dos label, los label para rojo y azul y el poligono es como el q me mostraste en la imagen quisiera saber si me podrias aser el grandet favor de ayudarme con el codigo para cuando de clic en cada cada cara del diente me de opciones de pintarlo es q cuando le doy clic ala cara del diente se le doy ala cara del centro me aparese esto "middle polygon" o al lado derecho left polygon al lado izquierdo right polygon la cara de abajo bottom polygon y la de arriba top polygon dime cuales herramientas implementar y que codigo utlizar para poder que cuando le de clic me salga la opcion de pintar el diente bien sea sano cariado o dañado
ResponderEliminarhola Andrea
ResponderEliminaresta parte que quieres implementar no es simple porque en si un picturebox no define zonas sensibles donde puedas interactuar, quizas usando la posicion del mouse donde hace un click o mejor un MouseDown podrias
quizas lo mas directo seria que selecciones un picturebox (el cual representa el diente), luego con botones definir la posicion y estado de esa parte del diente para armar la imagen que corresponde a esa opcion seleccionada
saludos
ola leandro me podrias explicarmas muchas gracias
ResponderEliminarPudiste terminar tu odontograma?
EliminarHola leandro, he creado una pregunta en el foro de msdn a mi consulta pero aun no la soluciono, he seguido tus pasos definiendo mi cadena de conexion en el app.config y la llamo siguiendo tu ejemplo pero me arroja el error Referencia a objeto no establecida como instancia de un objeto.
ResponderEliminary si hago el insert de esta manera
Dim connectionString As String = "Data Source=ALVARO-PC\SQL2008ALVARO;Initial Catalog=database1;User ID=sa;Password=asdf1234;"
Using conn As New SqlConnection(connectionString)
en la funcion insertar, me inserta sin problemas, en que estare fallando?
saludos
hola descargas
ResponderEliminareste problrema se presenta cuando eejcutas desde el VS o es cuando llevas la aplicaicon a la pc del cliente?
porque deberias validar que este el .config junto al .exe
el error que obtienes es porque no puede recuperar la key que defines en la config, valida que tenga el mismo nombre, recuerda que es keysensitive
saludos
Hola buenas noches leandro un placer saludar estoy agradecidopor este codigo y tutorial que has brindado me ha tocado leer bastante por las funciones que usas y la manera de progrmar que tienes es demasiado linda, mira te tengo una consulta, por que no puedo usar using end using
ResponderEliminarpara permitir la conexion a la base de datos siempre me dice que hay un error y apunta en la variable conn.open
me ha tocado crear un modulo de conexion y estas haciendo
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Open()
no se si es que hay algo en espesifico que hacer , asi lo hago yo:
using conn as new sqlconeccion("la cadenas")
conn.open
y por ultimo el
end using.
ha y tambien algo no entiendo lo del validate form. De antemano te agradesco por todo y espero me puedas ayudar si no hes molestia.
hola Josue
ResponderEliminarpero cual es el error que recibes ? porque no lo has mencionado
quizas sea un tema con el connectionstring
en el evento Validating que seria lo que no se entiende?
saludos
Leandro lo que no entiendo que es lo que en si hace el validate form. osea ahi dice que retorna false pero para que sirve ese falta, para que es que lo utilizas.
ResponderEliminarhola Josue
ResponderEliminaranalizaste el codigo del metodo Insert() ? es alli donde se utiliza
basicamente une en una sola funciona las validaciones de nombre y direccion, asi no se invoca una y liuego la otra, si ambas pasan entonces ValidateForm() pasa como valido y se puede continuar con el INSERT
Validation in Windows Forms
tambien se podria haber implementado algo como en el articulo, o sea invocar al ValidateChildren() para que este ejecutetodos los evento Validating() y los aplique dejando continuar o no
saludos
Como puedo evitar que me guarde datos duplicados, no entendi bien esa parte. Que código debo de utilizar para evitar ese tipo de problemas.
ResponderEliminarEstoy trabajando en VS 2010 csharp con Entity Framework.
Gracias.
hola Omar
ResponderEliminarpero en este articulo no estos usando Entity Framework, estos usando ado.net simple, por eso me suena raro que uses este ejemplo de base
la tecnica es similar deberias validar usando una query de linq si el campo id o alguno que no quieras que se duplique existe o no en la tabla
cas a usar el Count() de linq para saber si existe algun registro para el filtro que definas, si existe entonces no deberias realizar la operacion de SaveChanges()
saludos
Hola Leandro, primeramente muchas gracias por compartir tus conocimientos son de gran ayuda, y segundo tengo un problema seguí tu ejemplo para insertar un nuevo registro en la base de datos, me funciona mientras la aplicación siga en funcionamiento los datos nuevos me aparecen pero al cerrar la aplicación y volverla a abrir ya no están los nuevos datos.
ResponderEliminarEsta es la parte de mi codigo:
int cero = 0;
String consulta = "INSERT INTO T_Productos (Codigo, Descripcion, Costo, Precio, Existencia_Bodega, Existencia_Piso) VALUES(?, ?, ?, ?, ?, ?)";
OleDbCommand sql = new OleDbCommand(consulta, conexion);
sql.Parameters.AddWithValue("Codigo", cod);
sql.Parameters.AddWithValue("Descripcion", descripcion);
sql.Parameters.AddWithValue("Costo", costo);
sql.Parameters.AddWithValue("Precio", precio);
sql.Parameters.AddWithValue("Existencia_Bodega", cero);
sql.Parameters.AddWithValue("Existencia_Piso", cero);
conexion.Open();
int ColumnaAfectada = sql.ExecuteNonQuery();
conexion.Close();
Se me paso comentarte que uso una base de datos en access
ResponderEliminarhola IvanNS
ResponderEliminarno sera que sucede lo que comento aqui
[Visual Studio] Base de Datos integradas al proyecto
saludos
Muchas gracias Leandro me funciono, saludos
ResponderEliminarSaludos a todos .... porque no puedo descargar la aplicacion osea que no se le puede dar clic agradeciera y me la subiera o enviar a mi correo josuecybershop@yahoo.coom
ResponderEliminarhola Josue
ResponderEliminarya edite el post y subi el ejemplo de codigo para que puedas descargarlo
saludos
Hola Leandro buenas noches, quisiera que me regalaras un claro ejemplo de como puedo hacer un programa que necesito para cobrar un servicio publico(es que no se ni por donde empezar y tu que eres un experto en el tema se que me guiara correctamente.
ResponderEliminarsaludos,
Demecio Gómez Fuentes
hola Demecio
ResponderEliminarla verdad no se que tipo de ejemplo claro podria darte con tan poca especificacion
ademas tampoco comentas que tanta experiencia tienes en desarrollo, quizas deberias antes capacitarte un poco
tampoco queda claro si la aplicaicon va a ser desktop o web, si vas a usar ado.net o un orm, etc
saludos
Hola Leandro, y si quiero hacer eso con una base de datos de access, ¿Como seria?
ResponderEliminarhola y dime si es que lo pongo en un procedimiento como lo llamaria
ResponderEliminarPublic Sub INSERTAR(ByVal CNN As SqlClient.SqlConnection, ByVal bandera As Boolean)
Dim comando As SqlClient.SqlCommand
Dim parametro As SqlClient.SqlParameter
comando = New SqlClient.SqlCommand
comando.Connection = CNN
comando.CommandType = CommandType.StoredProcedure
If bandera = True Then
comando.CommandText = "sp_Cargo_insertar"
Else
comando.CommandText = "sp_Cargo_actualizar"
End If
parametro = comando.Parameters.Add("@Id_Cargo", SqlDbType.VarChar, 8)
parametro.Value = Me.Id_Cargo
parametro = comando.Parameters.Add("@DescCargo", SqlDbType.VarChar, 50)
parametro.Value = Me.DescCargo
comando.ExecuteNonQuery()
End Sub
hola jauregui
ResponderEliminarel codigo que defines para invocar al procedure esta correcto
aunque no definiria un metodo de nombre INSERT() cuando dentro este realiza un insert o update, crea dos metodos diferentes, porque al insertar seguramente el parametro del id sea un output (o sea no asignas ninguna valor, sino que esperas la respuesta) y en el update sea un input, la direccion del parametro cambia en cada operacion
saludos
hola necesito ayuda es una base de datos el cual quiero que reconosca cuando se petita un usuario me marca error en mi n = cmd.ExecuteNonQuery()
ResponderEliminarPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If TextBox1.Text = "" Then
MsgBox("Todos los campos tienen que estar llenos")
ElseIf TextBox2.Text = "" Then
MsgBox("Todos los campos tienen que estar llenos")
ElseIf TextBox3.Text = "" Then
MsgBox("Todos los campos tienen que estar llenos")
ElseIf TextBox4.Text = "" Then
MsgBox("Todos los campos tienen que estar llenos")
Else
Dim n As Integer
Dim c As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Maquinas.accdb")
Dim cmd As New OleDb.OleDbCommand("INSERT INTO Usuario VALUES('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "')", conex)
cmd.Connection = c
cmd.Parameters.AddWithValue("@Usuario", TextBox1.Text)
cmd.Parameters.AddWithValue("@Nombre", TextBox2.Text)
cmd.Parameters.AddWithValue("@Contraseña", TextBox3.Text)
cmd.Parameters.AddWithValue("@Repetir contraseña", TextBox4.Text)
c.Open()
Dim cmdo As New OleDb.OleDbCommand("SELECT Usuario FROM Usuario= " & (TextBox1.Text) & "'", conex)
n = cmd.ExecuteNonQuery()
MessageBox.Show("Guardando Datos..!! ", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Warning)
If n = 1 Then
Else
MsgBox("El Usuario ya existe", MsgBoxStyle.Critical, "Advertencia")
Return
c.Close()
End If
End If
End Sub
hola
Eliminartu codigo deberia ser como el siguiente
Using c As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Maquinas.accdb")
c.Open()
Dim cmdo As New OleDb.OleDbCommand("SELECT COUNT(*) FROM Usuario= @Usuario", conex)
cmdo.Parameters.AddWithValue("@Usuario", TextBox1.Text)
Dim n As Integer = Convert.ToInt32(cmdo.ExecuteScalar())
If n > 0 Then
MsgBox("El Usuario ya existe", MsgBoxStyle.Critical, "Advertencia")
Return
End If
Dim query As String = "INSERT INTO Usuario (usuario, nombre, contraseña, repetircontraseña) " &_
"VALUES(@Usuario, @Nombre, @Contraseña, @RepetirContraseña)"
Dim cmd As New OleDb.OleDbCommand(query, c)
cmd.Parameters.AddWithValue("@Usuario", TextBox1.Text)
cmd.Parameters.AddWithValue("@Nombre", TextBox2.Text)
cmd.Parameters.AddWithValue("@Contraseña", TextBox3.Text)
cmd.Parameters.AddWithValue("@RepetirContraseña", TextBox4.Text)
cmd.ExecuteNonQuery()
MessageBox.Show("Guardando Datos..!! ", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Using
no definas parametros con espacio en su nombre, como el de repetir contraseña
saludos
Hola leandro! Podrias ayudarme... necesito que mi boton guardar... modifique si encuentra registros en la base de datos... y si no encuentra inserte... tengo una tabla Meta_Sucursal... con las columnas Sucursal...Anio...Mes...Crec_Cartera...Crec_Cliente...Porc_Mora...PorcPAR1.... los Crec_ y Porc_ son textbox... y sucursal anio y mes... son combobox.... TE DEJO EL CODIGO... ya modifica,,, PD. las consultas las hago con los combobox y un gridview
ResponderEliminarusing System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Configuration;
namespace Meta_Sucursal_Pantalla
{
public partial class Meta_Sucursal_Pantalla_11_08_15 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void CmBxSucursal_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void CmBxCiclo_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void CmBxMes_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void BtnGuardar_Click(object sender, EventArgs e)
{
var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ADWH"].ConnectionString);
sqlConnection.Open();
string Modificar = "UPDATE [Meta_Sucursal] SET [Crec_Cartera] = @CrecCartera, [Crec_Cliente] = @CrecCliente, [Porc_Mora] = @PorcMora, [Porc_PAR1] = @PorcPAR1 WHERE Sucursal=@CmBxSucursal AND Año=@CmBxCiclo AND Mes=@CmBxMes";
SqlCommand cmd = new SqlCommand(Modificar, sqlConnection);
////asignamos el valor de los textbox a los parametros
cmd.Parameters.AddWithValue("@CmBxSucursal", CmBxSucursal.SelectedValue);
cmd.Parameters.AddWithValue("@CmBxCiclo", CmBxCiclo.SelectedValue);
cmd.Parameters.AddWithValue("@CmBxMes", CmBxMes.SelectedValue);
cmd.Parameters.AddWithValue("@CrecCartera", CrecCartera.Text);
cmd.Parameters.AddWithValue("@CrecCliente", CrecCliente.Text);
cmd.Parameters.AddWithValue("@PorcMora", PorcMora.Text);
cmd.Parameters.AddWithValue("@PorcPAR1", PorcPAR1.Text);
string script = "alert('La modificacion se realizo correctamente');";
ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, true);
cmd.ExecuteNonQuery();
sqlConnection.Close();
}
}
}
hola
Eliminarlo que recomendaria es que el codigo lo estructures en capas
[WinForms] Edición Empleados
de esta forma podrias implementar un metodo que valide si el id existe usando el SELECT COUNT(*) y el ExecuteScalar()
Pero no definas el codigo dierecto en el form porque se hara una ensalada de codigo
saludos
saludos leandro
EliminarAyúdame con un código similar al tema tratado a qui. por favor.
Gracias Leandro me sirvió mucho tu ejemplo!.
ResponderEliminarHola Leandro, mi nombre es Boris y he visto muchas respuestas tuyas en los foros de MSDN sobre visual y quisiera hacerte una consulta... estoy haciendo un programa de registro de asistencia, cuando ingreso el código del docente y registro la entrada, esta guarda todos los datos en una base de datos y luego cuando digito nuevamente el código y presiono salida, la idea es que en la misma fila de la bd donde se ingresó la entrada me guarde la hora de la salida, pero no lo he podido realizar... te dejo el código para que lo veas:
ResponderEliminarPrivate Sub btnSalida_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalida.Click
Label14.Text = TimeOfDay
If txtCod2.Text = "" Then
MsgBox("Debe ingresar Código", MsgBoxStyle.Critical, "Error de Código")
Me.txtCod2.Focus()
Else
Try
con.ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0; Data Source=" & Application.StartupPath & "\RegistroDocente.accdb"
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
Exit Sub
End Try
con.Open()
tblgdr2 = New Data.DataSet
Dim adapt3 As New OleDb.OleDbDataAdapter("Update IngrAsis Set HoraSal = #" & Me.Label14.Text & "# where Codigo like #" & Me.txtCod2.Text & "#;", con)
adapt3.Fill(tblgdr2, "guardar")
MsgBox("Salida ingresada con éxito", MsgBoxStyle.Information)
con.Close()
End If
End Sub
Cuando lo ejecuto me aparece el siguiente error: "Error de sintaxis en la fecha en la expresión de consulta 'Codigo like #D47'."
Si me pudieras ayudar te lo agradecería mucho, ya que este proyecto es para mi examen de título.
De antemano muchas gracias.
Leandro buenas noches, el ejemplo de búsqueda entre fechas esta muy bien, crees que puedas publicar un vídeo con el procedimiento paso a paso. Muchas gracias.
ResponderEliminarque buen aporte, en donde consigo la BD, grqacias
ResponderEliminarExcelente aporte Leandro Tuttini, lo agradecemos
ResponderEliminarVi este video y me funcionó y me permitió descargar el proyecto , se los comparto! https://www.youtube.com/watch?v=y8I01waqfNI
ResponderEliminar