none
Erro - Must declare the scalar variable "@Nome" (Somente no banco SQL Server; Access funciona) RRS feed

  • Pergunta

  • Prezados bom dia

    Estou fazendo um INSERT passando parâmetros no SQL SERVER utilizando C# e classe OLEDB e DbProviderFactories.

    O erro é: Must declare the scalar variable "@Nome", na linha do Execute.Scalar(), vejam os códigos:

    Em minha BLL:

    public UInt32 IncluirImagem(capturaImagem imagemParaGravar) {

    //ncDB.StrConexao = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Eduardo Agostinho\Desktop\Ultimo\Prova de Conceito - OK\CadastroDePessoa\ncDBCON1301.MDB"; //ACCESS ncDB.StrConexao = @"Provider=SQLOLEDB;Data Source=EDUARDO\SQLEXPRESS;Persist Security Info=True;User ID=sa; PWD=xxxxx; Initial Catalog=Edu3"; //SQL SERVER UInt32 IdInserido; string sSQL = "INSERT INTO TesteImagem(Nome, FotoCapturada) VALUES (@Nome, @FotoCapturada)"; string[] campos = { "@Nome", "@FotoCapturada" }; string[] valores = { imagemParaGravar.Nome, string.Empty }; //Apenas passo um valor para FotoCapturada como string, mas o objeto será passado na assinatura do método abaixo objBanco = new ncAccessDB(); IdInserido = objBanco.ncExecutarInsertEDU(sSQL,campos,valores,imagemParaGravar.ImagemArray); return IdInserido; }

    Temos uma classe que trata toda rotina de banco e através dela fazemos o insert com o método abaixo:

    public uint ncExecutarInsertEDU(string insertSQL, string[] campos, string[] valores, byte[] imagem)
            {
                try
                {
                    uint idInserido = 0;
    
                    DbConnection cnBanco = factory.CreateConnection();
                    cnBanco.ConnectionString = StrConexaoAcess;
    
                    DbCommand cmd = factory.CreateCommand();
                    cmd.Connection = cnBanco;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = insertSQL;
    
                    cnBanco.Open();
    
    		//Neste ponto crio e adiciono os parametros que vieram no ARRAY
                    for (int i = 0; i < valores.Length; i++)
                    {
                        DbParameter ProcessandoParam = cmd.CreateParameter();
                        
                        ProcessandoParam.ParameterName = campos[i];
    
    		    //QUANDO O ParameterName = @FotoCapturada mudo o DbType
                        if (ProcessandoParam.ParameterName == "@FotoCapturada")
                        {
                            ProcessandoParam.DbType = DbType.Binary;
                            ProcessandoParam.Value = imagem;
                        }
                        else
                        {
                            ProcessandoParam.DbType = DbType.AnsiString;
                            ProcessandoParam.Value = valores[i];
                        }
    
                        cmd.Parameters.Add(ProcessandoParam);
                    }
    
                    cmd.ExecuteScalar();	//O ERRO OCORRE NESTA LINHA
    
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "SELECT @@IDENTITY";
                    cmd.Connection = cnBanco;
    
                    idInserido = Convert.ToUInt32(cmd.ExecuteScalar());
    
                    return idInserido;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    O mais intrigante, é que os mesmos códigos que exponho acima, funcionam perfeito com o banco ACCESS, basta apenas eu mudar a string de conexão comentada no primeiro trecho de código.

    Abaixo, uma imagem com a estrutura das tabelas no ACCESS e no SQL SERVER:


    Agradeço a atenção dos colegas!


    Eduardo Agostinho Analista Programador - C# Developer



    • Editado EAgostinho quinta-feira, 8 de novembro de 2012 12:11 -
    quinta-feira, 8 de novembro de 2012 12:09

Respostas

  • Pessoal

    Descobri o que era:

    Em minha classe do banco meu DbProviderFactory estava utilizando "System.Data.OleDb" e no ACCESS funciona exatamente com este provider apesar do SQL SERVER também funcionar colocando os values como "?" na query.

    A solução foi alterar o provider na instância do DbProviderFactory na minha classe de banco com a alteração abaixo:

    DE:
    DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");

    PARA:
    DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");

    Espero que esta informação ajude!!!

    []'

     
            


    Eduardo Agostinho Analista Programador - C# Developer

    • Marcado como Resposta EAgostinho quinta-feira, 8 de novembro de 2012 13:42
    quinta-feira, 8 de novembro de 2012 13:42