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

PauloR

INSERT vs UPDATE

Recommended Posts

PauloR

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

Share this post


Link to post
Share on other sites
PauloR

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

Share this post


Link to post
Share on other sites
jpaulino

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

Share this post


Link to post
Share on other sites
PauloR

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.

Share this post


Link to post
Share on other sites
PauloR

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.