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