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

nokPT

[Resolvido] SQL Server não aceita comando de INSERT

10 mensagens neste tópico

Bom dia,

Criei uma Base de Dados com MS SQL Server Management Studio.

Consigo ligar-me à base de dados, consigo fazer SELECT, consigo fazer UPDATE, mas sempre que faço INSERT a função command.ExecuteNonQuery() retorna -1.

Já criei um script no SQL Server Management Studio:

INSERT INTO Obras (Ano, Número, Descrição) VALUES (2008, 3, 'Teste SQL')

Corri o script no SQL sem problemas, criou-me a linha na tabela com os valores,

Corrigi o VB o comandoSQL para o que está a cima e que tinha funcionado e o resultado foi o mesmo, retorna sempre -1, nunca cria o registo.

O código que tenho é o seguinte:

    Private Sub NovaObra()
        Try
            ' Primeiro conta quantas obras há neste ano, para criar a obra N+1
            ' Depois insere a linha na tabela com os valores da form.
            ' Texto de ligação à base de dados
            Dim strConnection As String = "SERVER=.\SQLEXPRESS;DATABASE=C:\CSC-EA\CSC-EA.MDF ;Integrated Security=True;User Instance=True" ' Maneira melhor para ligar (acho)
            Dim strComandoSQL As String = "SELECT Ano, Número FROM Obras WHERE Ano='" & Now.Year & "'"
            Dim connection As New SqlConnection(strConnection)
            Dim command As New SqlCommand(strComandoSQL, connection)
            connection.Open()

            ' Executa o comando colocando num SqlDataReader os resultados
            Dim reader As SqlDataReader = command.ExecuteReader()

            Dim x As Integer = 0
            ' Caso existam rows (linhas)
            ' Conta o nº de linhas
            If reader.HasRows Then
                While reader.Read()
                    x += 1
                End While
            End If

            connection.Close()

            txbAno.Text = Now.Year.ToString
            txbNúmero.Text = (x + 1).ToString

            ' Texto de ligação à base de dados
            strComandoSQL = "INSERT INTO Obras (Ano, Número, Descrição, Observações, DataOrçamento, DataAcompanhar, DataAdjudicação, DataConclusão, EstadoAdjudicada, EstadoPerdida, EstadoAcompanhar, PerdidaPreço, PerdidaPrazo, PerdidaSolução, PerdidaCancelado, PerdidaOutro, PerdidaTexto) "
            strComandoSQL += "VALUES (@Ano, @Número, @Descrição, @Observações, @DataOrçamento, @DataAcompanhar, @DataAdjudicação, @DataConclusão, @EstadoAdjudicada, @EstadoPerdida, @EstadoAcompanhar, @PerdidaPreço, @PerdidaPrazo, @PerdidaSolução, @PerdidaCancelado, @PerdidaOutro, @PerdidaTexto);"

            ' Indicação dos parâmetros da selecção
            command.Parameters.Add("@Ano", SqlDbType.Int).Value = CInt(Now.Year)
            command.Parameters.Add("@Número", SqlDbType.Int).Value = CInt(txbNúmero.Text)
            command.Parameters.Add("@Descrição", SqlDbType.NChar).Value = txbDescrição.Text
            command.Parameters.Add("@Observações", SqlDbType.NChar).Value = txbObservações.Text
            command.Parameters.Add("@DataOrçamento", SqlDbType.Date).Value = Now
            command.Parameters.Add("@DataAdjudicação", SqlDbType.Date).Value = dtpAdjudicação.Value
            command.Parameters.Add("@DataConclusão", SqlDbType.Date).Value = dtpConclusão.Value
            command.Parameters.Add("@DataAcompanhar", SqlDbType.Date).Value = dtpAcompanhar.Value
            command.Parameters.Add("@EstadoAdjudicada", SqlDbType.Bit).Value = radAdjudicada.Checked
            command.Parameters.Add("@EstadoPerdida", SqlDbType.Bit).Value = radPerdida.Checked
            command.Parameters.Add("@EstadoAcompanhar", SqlDbType.Bit).Value = radAcompanhar.Checked
            command.Parameters.Add("@PerdidaPreço", SqlDbType.Bit).Value = ckbPerdidaPreço.Checked
            command.Parameters.Add("@PerdidaPrazo", SqlDbType.Bit).Value = ckbPerdidaPrazo.Checked
            command.Parameters.Add("@PerdidaSolução", SqlDbType.Bit).Value = ckbPerdidaSolução.Checked
            command.Parameters.Add("@PerdidaCancelado", SqlDbType.Bit).Value = ckbPerdidaCancelado.Checked
            command.Parameters.Add("@PerdidaOutro", SqlDbType.Bit).Value = ckbPerdidaOutro.Checked
            command.Parameters.Add("@PerdidaTexto", SqlDbType.NChar).Value = txbPerdidaOutro.Text

            ' Abre a ligação, executa o comando e guarda em "x" o número de registos 
            txbLog.Text = strComandoSQL
            connection.Open()

            x = command.ExecuteNonQuery()
            If x < 1 Then
                MessageBox.Show("A operação efectuada não retomou qualquer resultado." & vbCrLf & "Não foi possível criar a obra!")
                txbAno.Clear()
                txbNúmero.Clear()
            End If

            ' Fecha a ligação e limpa as variáveis
            connection.Close()
            connection = Nothing
            command = Nothing
        Catch ex As Exception
            MsgBox("frmObras: Erro #3 -> " + ex.Message)
        End Try
    End Sub

Já não sei mais que fazer

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas ,

Não me dá erro, simplesmente retorna -1, que quer dizer que o comando não foi executado.

Também já me lembrei que seria um problema com os direitos, não fiz alterações, são as de defaut o User é o do windows e não sei onde devo mexer para ver ou dar as permissões necessárias para o INSERT

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok... isso nao vai parar ao try?

experimenta apanhar a instrução de sql...e executar directamente na BD

a instrução de sql, leva ";"... nao conheço mto bem SQL... mais OrACLE, e em oracle nao é necessário

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, não vai parar ao Try, executa e retorna -1.

Já tentei apanhar a instrução, mas como tem vários parametros apanho muito lixo.

Já criei uma instrução na BD e lá funcionou, quando copiei para o VB e corri a mesma instrução, já não funcionou, obtive o mesmo resultado.

Há instruções que levam ; outras que não, depois também depende do servidor uns necessitam outros não uns querem ' entre os textos outros não, no caso do Access tem dias, aqui já tentei com e sem o resultado é sempre o mesmo.

No caso do UPDATE ia ter ao try à 3ª tentativa já estava a funcionar, neste caso como não devolve erro fico na ignorância

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, já entendi a asneira!

Tu está a criar uma nova ligação com um "SELECT"

Dim connection As New SqlConnection(strConnection)

E depois queres aproveitar para inserir. Isso não funciona assim, tens de criar um novo comando.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, Resolvido, muito obrigado mais uma vez

De nada!

PS: Quando colocares resolvido coloca no primeiro post. (já corrigi) :confused:

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