sabeis pq sale este error?

27/04/2005 - 09:22 por Sonia | Informe spam
' indice 0 no valido para oledbparametercollection con count=0 '

lo q hago es, desde un datagrid, selecciono una fila y le doy al boton
'actualizar' y aparece un form con los datos de la fila en textbox para q
los pueda modificar. lo mismo tengo con un boton 'anyadir' q se abre el form
con los textbox vacios para añadirlos yo. me da este error empezando por 0 o
por 1. os pongo el codigo por si podeis decirme q es lo q puedo hacer.

gracias


Private Sub Anyadir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Anyadir.Click
Dim Cadena As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
ArchivoDatos & ";Persist Security Info=False"

Dim sCadSQL As New StringBuilder

sCadSQL.Append("Insert Into Contactos ")

sCadSQL.Append(" NOMBRE, APELLIDOS, CARGO, ID_COL, HORARIO, EMAIL Values
(?,?,?,?,?,?)")

Dim Cnn As New OleDbConnection(Cadena)

Dim Cmd As OleDbCommand = New OleDbCommand(sCadSQL.ToString, Cnn)

Cnn.Open()

Try

With Cmd

.CommandType = CommandType.Text

.Parameters(0).Value = "nombre"

.Parameters(1).Value = "apellidos"

.Parameters(2).Value = "cargo"

.Parameters(3).Value = "codigocole"

.Parameters(4).Value = "horario"

.Parameters(5).Value = "mail"

.ExecuteNonQuery()

End With

Catch ex As Exception

MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK,
MessageBoxIcon.Error)

Finally

Cmd = Nothing

Cnn.Dispose()

Cnn.Close()

End Try

End Sub

Preguntas similare

Leer las respuestas

#1 Tristan
27/04/2005 - 22:17 | Informe spam
El problema lo tienes en lo siguiente. Cuando haces:

..Parameters(0).Value = "nombre"
..Parameters(1).Value = "apellidos"


...

Estás intentando asignar el valor de los parámetros pero en realidad,
todavía no han sido creados. La colección parameters de tu comando está vacía.

Dim cmd As New OleDbCommand( _
"INSERT INTO Contactos " & _
"(Nombre, Apellidos, Cargo, Id_Col, Horario, Email) " & _
"VALUES (?, ?, ?, ?, ?, ?)")

Dim p As OleDbParameterCollection = cmd.Parameters
p.Add("", "ValorNombre")
p.Add("", "ValorApellidos")
p.Add("", "ValorCargo")
p.Add("", "ValorId_Col")
p.Add("", "ValorHorario")
p.Add("", "ValorEmail")

cmd.Connection = Me.OleDbConnection1
Me.OleDbConnection1.Open()
try
cmd.ExecuteNonQuery()
catch exc as OleDbException
msgbox(exc.ToString())
finally
Me.OleDbConnection1.Close()
end try

He cambiado algunas cosas para adaptarlo a mis gustos, pero lo esencial es
que hay que añadir los parámetros, no solo asignar su valor.

Lo malo de lo anterior es que no es muy eficiente. Para cada fila añadida,
creas la conexión, el comando y todos sus parámetros. Mucho más eficiente, y
hasta más claro, es crear la conexión, el comando y los parámetros una sola
vez. Para cada fila que añadas solo tendrás que asignar el valor de los
parámetros y ejecutar el comando:


Private cmd As OleDbCommand


En el constructor del form, para que se ejecute una sola vez:

' Creas Tu conexión
cmd = New OleDbCommand( _
"INSERT INTO Contactos " & _
"(Nombre, Apellidos, Cargo, Id_Col, Horario, Email) " & _
"VALUES (@Nombre, @Apellidos, @Cargo, @Id_Col, @Horario, @Email)")
cmd.Connection = TuConexion

Dim p As OleDbParameterCollection = cmd.Parameters
p.Add("@Nombre", OleDbType.VarChar)
p.Add("@Apellidos", OleDbType.VarChar)
p.Add("@Cargo", OleDbType.VarChar)
p.Add("@Id_Col", OleDbType.VarChar)
p.Add("@Horario", OleDbType.VarChar)
p.Add("@Email", OleDbType.VarChar)


Y por fin, para añadir cada fila solo asignar valores y ejecutar:

Dim p As OleDbParameterCollection = cmd.Parameters
p("@Nombre").Value = "ValorNombre"
p("@Apellidos").Value = "ValorApellidos"
p("@Cargo").Value = "ValorCargo"
p("@Id_Col").Value = "ValorId_Col"
p("@Horario").Value = "ValorHorario"
p("@Email").Value = "ValorEmail"
TuConexion.Open()
cmd.ExecuteNonQuery()
TuConexion.Close()
Respuesta Responder a este mensaje
#2 Sonia
28/04/2005 - 09:50 | Informe spam
hola
gracias por contestar
hiciste lo q me dijiste y ahora me sale este error
'no existe ningun texto de comando para el objeto de comando'
sabes a q puede deberse?
gracias
"Tristan" escribió en el mensaje
news:
El problema lo tienes en lo siguiente. Cuando haces:

> ..Parameters(0).Value = "nombre"
> ..Parameters(1).Value = "apellidos"
...

Estás intentando asignar el valor de los parámetros pero en realidad,
todavía no han sido creados. La colección parameters de tu comando está


vacía.

Dim cmd As New OleDbCommand( _
"INSERT INTO Contactos " & _
"(Nombre, Apellidos, Cargo, Id_Col, Horario, Email) " & _
"VALUES (?, ?, ?, ?, ?, ?)")

Dim p As OleDbParameterCollection = cmd.Parameters
p.Add("", "ValorNombre")
p.Add("", "ValorApellidos")
p.Add("", "ValorCargo")
p.Add("", "ValorId_Col")
p.Add("", "ValorHorario")
p.Add("", "ValorEmail")

cmd.Connection = Me.OleDbConnection1
Me.OleDbConnection1.Open()
try
cmd.ExecuteNonQuery()
catch exc as OleDbException
msgbox(exc.ToString())
finally
Me.OleDbConnection1.Close()
end try

He cambiado algunas cosas para adaptarlo a mis gustos, pero lo esencial es
que hay que añadir los parámetros, no solo asignar su valor.

Lo malo de lo anterior es que no es muy eficiente. Para cada fila añadida,
creas la conexión, el comando y todos sus parámetros. Mucho más eficiente,


y
hasta más claro, es crear la conexión, el comando y los parámetros una


sola
vez. Para cada fila que añadas solo tendrás que asignar el valor de los
parámetros y ejecutar el comando:


Private cmd As OleDbCommand


En el constructor del form, para que se ejecute una sola vez:

' Creas Tu conexión
cmd = New OleDbCommand( _
"INSERT INTO Contactos " & _
"(Nombre, Apellidos, Cargo, Id_Col, Horario, Email) " & _
"VALUES (@Nombre, @Apellidos, @Cargo, @Id_Col, @Horario, @Email)")
cmd.Connection = TuConexion

Dim p As OleDbParameterCollection = cmd.Parameters
p.Add("@Nombre", OleDbType.VarChar)
p.Add("@Apellidos", OleDbType.VarChar)
p.Add("@Cargo", OleDbType.VarChar)
p.Add("@Id_Col", OleDbType.VarChar)
p.Add("@Horario", OleDbType.VarChar)
p.Add("@Email", OleDbType.VarChar)


Y por fin, para añadir cada fila solo asignar valores y ejecutar:

Dim p As OleDbParameterCollection = cmd.Parameters
p("@Nombre").Value = "ValorNombre"
p("@Apellidos").Value = "ValorApellidos"
p("@Cargo").Value = "ValorCargo"
p("@Id_Col").Value = "ValorId_Col"
p("@Horario").Value = "ValorHorario"
p("@Email").Value = "ValorEmail"
TuConexion.Open()
cmd.ExecuteNonQuery()
TuConexion.Close()

Respuesta Responder a este mensaje
#3 Tristan
28/04/2005 - 18:35 | Informe spam
¿Pero cual de los dos ejemplos has seguido?

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#4 Tristan
28/04/2005 - 18:39 | Informe spam
¿Pero cual de los dos ejemplos has seguido?

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#5 Sonia
28/04/2005 - 22:55 | Informe spam
el ultimo de todos. el q decias q era mas eficiente.
hice esto:

Private Sub Anyadir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Anyadir.Click

Dim Cadena As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
ArchivoDatos & ";Persist Security Info=False"

Dim sCadSQL As New StringBuilder

'sCadSQL.Append("Insert Into Contactos ")

'campos: NOMBRE, APELLIDOS, CARGO, HORARIO, EMAIL

sCadSQL.Append(" Values
(@nombre,@apellidos,@cargo,@codigocole,@horario,@mail)")

Dim Cnn As New OleDbConnection(Cadena)

Dim Cmd As OleDbCommand = New OleDbCommand(sCadSQL.ToString, Cnn)

Dim p As OleDbParameterCollection = Cmd.Parameters

p.Add("@nombre", "nombre")

p.Add("@apellidos", "apellidos")

p.Add("@cargo", "cargo")

p.Add("@codigocole", "id_col")

p.Add("@horario", "horario")

p.Add("@mail", "email")

Cnn.Open()

Try

With Cmd

.CommandType = CommandType.Text

.Parameters("@nombre").Value = "NOMBRE"

.Parameters("@apellidos").Value = "APELLIDOS"

.Parameters("@cargo").Value = "CARGO"

.Parameters("@codigocole").Value = "ID_COL"

.Parameters("@horario").Value = "HORARIO"

.Parameters("@mail").Value = "EMAIL"

.ExecuteNonQuery()

End With

Catch ex As Exception

MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK,
MessageBoxIcon.Error)

Finally

Cmd = Nothing

Cnn.Dispose()

Cnn.Close()

End Try

End sub




"Tristan" escribió en el mensaje
news:
¿Pero cual de los dos ejemplos has seguido?

Juan Carlos Badiola
MVP - C#



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida