• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

PauloR

INSERT vs UPDATE

6 mensagens neste tópico

Bem ... cá estou eu novamente  :-[

Não estou a conseguir fazer UPDATES numa tabela em MSAccess pois tenho sempre o mesmo erro: "data type mismatch in criteria expression"

Existe alguma diferença na utilização de parâmetros entre o INSERT e o UPDATE?

O código que utilizo é o mesmo para gravar ou actualizar mudando apenas a instrucção SQL.

O código é o seguinte:


    Private Sub btnGravar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravar.Click

	Dim CnnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDb & "; User Id=admin;Password="
        Dim strSQL As String = ""
        Dim iSQLStatus As Integer

        Dim Cnn As New OleDbConnection(CnnString)
        Dim Cmd As New OleDbCommand

        Select Case strModo
            Case "I"
                strSQL = " INSERT INTO tabela (campo1, campo2, campo3, campo4)" & _
                         " VALUES (@campo1, @campo2, @campo3, @campo4)"
            Case "A"
                strSQL = " UPDATE tabela SET campo1 = @campo1, campo2 = @campo2, " & _
                         " campo3 = @campo3, campo4 = @campo4 " & _
                         " WHERE campo0 = " & CInt(txtRecordID.Text)
        End Select

        Try
            With Cmd
                .CommandText = strSQL
                .CommandType = CommandType.Text

                .Parameters.Add("@campo1", OleDbType.Integer).Value = txtRecord.Text
                .Parameters.Add("@campo2", OleDbType.Date).Value = "#" & String.Format("{0:d}", dtpRData.Value) & "#"
                .Parameters.Add("@campo3", OleDbType.VarChar).Value = txtCustom.Text
                .Parameters.Add("@campo4", OleDbType.Double).Value = txtBaseValue.Text

                .Connection = Cnn
            End With

            Cnn.Open()

            iSQLStatus = Cmd.ExecuteNonQuery

            If iSQLStatus = 0 Then
                MsgBox("Erro")
            Else
                MsgBox("OK")
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        End Try

        Cnn.Close()
        Cnn = Nothing
        Cmd = Nothing

    End Sub

O INSERT funciona SEM problemas.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Claro, e que tal pesquisares antes de perguntar coisas dessas? É que uma pesquisa como "insert sql" no google dá-te a resposta num instante.

http://www.w3schools.com/SQL/sql_insert.asp

http://www.w3schools.com/Sql/sql_update.asp

Por acaso já procurei e não encontrei nada  :-[

Repara que o INSERT funciona sem problemas e NÃO encontro nenhum problema no UPDATE...

Os teus links não me mostram nenhum erro nas minhas instrucções.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A única diferença entre uma instrução e a outra é o txtRecordID.Text. O que é e que valor tem ?

Ps: Para a data não precisas de isso tudo, basta fazeres:

.Parameters.Add("@campo2", OleDbType.Date).Value = dtpRData.Value

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A única diferença entre uma instrução e a outra é o txtRecordID.Text. O que é e que valor tem ?

Ps: Para a data não precisas de isso tudo, basta fazeres:

.Parameters.Add("@campo2", OleDbType.Date).Value = dtpRData.Value

Esqueci-me do campo0 no INSERT ao passar o codigo para o forum. Este campo tem um valor numérico e único.

Quando é preciso actualizar um registo apenas os campos 1 a 4 podem ser alterados.

O txtRecordID.Text é a valor do campo0 quando foi inserido na tabela. Como é um valor único pode ser utilizador para UPDATES e/ou DELETE.

cumpts.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema nada tinha a ver com as instrucções do SQL mas sim com a ordem dos parametros.

Como tinha dito faltava o campo0  :-[ assim e para funcionar tem de ser assim:



Select Case strModo
Case "I"
	strSQL = " INSERT INTO tabela (campo0, campo1, campo2, campo3, campo4)" & _
	" VALUES (@campo0, @campo1, @campo2, @campo3, @campo4)"
Case "A"
	strSQL = " UPDATE tabela SET campo1 = @campo1, campo2 = @campo2, " & _
	" campo3 = @campo3, campo4 = @campo4 " & _
	" WHERE campo0 = @campo0" 
End Select

        
' Para o INSERT
.Parameters.Add("@campo0", OleDbType.Integer).Value = txtRecordID.Text
.Parameters.Add("@campo1", OleDbType.Integer).Value = txtRecord.Text
.Parameters.Add("@campo2", OleDbType.Date).Value = "#" & String.Format("{0:d}", dtpRData.Value) & "#"
.Parameters.Add("@campo3", OleDbType.VarChar).Value = txtCustom.Text
.Parameters.Add("@campo4", OleDbType.Double).Value = txtBaseValue.Text

' Para o UPDATE
.Parameters.Add("@campo1", OleDbType.Integer).Value = txtRecord.Text
.Parameters.Add("@campo2", OleDbType.Date).Value = "#" & String.Format("{0:d}", dtpRData.Value) & "#"
.Parameters.Add("@campo3", OleDbType.VarChar).Value = txtCustom.Text
.Parameters.Add("@campo4", OleDbType.Double).Value = txtBaseValue.Text
.Parameters.Add("@campo0", OleDbType.Integer).Value = CInt(txtRecordID.Text)

Cumpts

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora