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
 

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()

Preguntas similares