Fórum Consulta no banco de dados com parâmetro e dataset #380717
05/07/2010
0
{
Usuario usuario = new Usuario(); StringBuilder sql = new StringBuilder();
sql.AppendLine("SELECT *");
sql.AppendLine(" FROM TB_USUARIO");
sql.AppendLine(" WHERE");
sql.AppendLine(" vcLogin = @login");
sql.AppendLine(" AND vcSenha = @senha"); DataSet dsTemp = null;
try
{
_cmd.Parameters.Clear();
_cmd.Parameters.Add(_conexao.CreateParameter("login", DbType.String, ParameterDirection.Input, 15, login));
_cmd.Parameters.Add(_conexao.CreateParameter("senha", DbType.String, ParameterDirection.Input, 30, senha)); _cmd.CommandText = sql.ToString();
_cmd.CommandType = CommandType.Text; _cmd.Connection = _conexao.CreateConnection(_cmd);
dsTemp = _conexao.CreateDataSet(_cmd, Conexao.CommandType.SelectCommand);
if (dsTemp.Tables[0].Rows.Count > 0)
{
foreach (DataRow dr in dsTemp.Tables[0].Rows)
{
usuario.Id = int.Parse(dr["id_usuario"].ToString());
usuario.NomeUsuario = dr["vcNome"].ToString();
usuario.Login = dr["vcLogin"].ToString();
usuario.Senha = dr["vcSenha"].ToString();
usuario.Email = dr["vcEMail"].ToString();
usuario.Ativo = bool.Parse(dr["btAtivo"].ToString());
}
}
}
catch
{
_conexao.RollbackTransaction(_cmd);
throw;
}
finally
{
_conexao.DisposeDataSet(dsTemp);
} return usuario;
} O usuário existe no banco conforme login e senha que eu passo, porém, não me retorna nenhuma linha de registro. Ao executar o profile do SQL Server, eu obtive a instrução abaixo: exec sp_executesql N'SELECT *
FROM vw_Usuarios
WHERE
vcLogin = @login
AND vcSenha = @senha
',N'@login nvarchar(15),@senha nvarchar(30)',@login=N'carlos',@senha=N' Beü¯øh ùsö@' Se eu mudar o tipo de nvarchar para varchar, ele apresenta os dados do usuário que estão no banco (na tabela os campos estão como "char", do mesmo tamanho informado nos parâmetros). Ao fazer uma pesquisa sobre o assunto, alguns mencionam que isso é devido ao DbType.String. O código do método que cria parâmetro segue abaixo: public DbParameter CreateParameter(string nome, DbType tipo, ParameterDirection direcao, Int32 tamanho, object valor)
{
DbParameter param = _factory.CreateParameter(); param.ParameterName = nome;
param.DbType = tipo;
param.Direction = direcao;
param.Size = tamanho;
param.Value = valor; return param;
} public DbConnection CreateConnection(DbCommand command)
{
DbConnection conn = null;
if (command.Transaction == null)
{
conn = _factory.CreateConnection();
conn.ConnectionString = ConfigurationManager.ConnectionStrings[_tipoConexao].ConnectionString; if (conn.State != System.Data.ConnectionState.Open) conn.Open();
}
else
{
conn = command.Connection;
} return conn;
} public DataSet CreateDataSet(DbCommand command, CommandType commandType)
{
DataSet ds = new DataSet();
DbDataAdapter da = _factory.CreateDataAdapter();
switch (commandType)
{
case CommandType.SelectCommand: da.SelectCommand = command; break;
case CommandType.InsertCommand: da.InsertCommand = command; break;
case CommandType.UpdateCommand: da.UpdateCommand = command; break;
case CommandType.DeleteCommand: da.DeleteCommand = command; break;
}
da.Fill(ds); return ds;
} Estou usando as classes do System.Data.Common porque tenho uma classe que, conforme o provider no arquivo de configuração (connectionString), ele instância as classes do System.Data.Common
de acordo. Por exemplo, se for Sql Server, instância do DbConnection, DbCommand, DbParameter para Sql Server, e assim por diante. Então, estou tendo esse problema e até agora não consegui resolver. Alguém poderia me ajudar nesse problema?
Carlos Nogueira
Curtir tópico
+ 0Posts
05/07/2010
Fabio Mans
Gostei + 0
05/07/2010
Carlos Nogueira
{
DbParameter param = _factory.CreateParameter(); param.ParameterName = nome; string provider = System.Configuration.ConfigurationManager.ConnectionStrings[_tipoConexao].ProviderName;
switch (provider)
{
case "System.Data.SqlClient":
switch (tipo.ToString())
{
case "String":
param.DbType = (DbType)SqlDbType.VarChar;
break;
default:
param.DbType = tipo;
break;
}
break;
default:
param.DbType = tipo;
break;
} param.Direction = direcao;
param.Size = tamanho;
param.Value = valor; return param;
} É guambiarra, eu sei, queria fazer algo melhor como o que você citou, que é alterar o tipo do campo. O problema é que ao vai haver uma discussão interna na equipe com o DBA, pois ele justamente optou por esse tipo de campo (char) devido a justificativa do armazenamento. Eu decidi postar isso porque já trabalhei com banco de dados SQL Server outras vezes desta maneira e nunca havia me deparado com este problema. Só não compreendi a questão que você mencionou ao dizer que escrevi demais para um simples método.
Gostei + 0
05/07/2010
Fabio Mans
DataTable
public static DataTable RetornaAutenticacao(FuncionarioEntity _funcionarioEntity)
{
using (DatabaseHelper db = new DatabaseHelper())
{
db.AddParameter("@matricula", _funcionarioEntity.Matricula);
using (SqlDataReader dr = (SqlDataReader)db.ExecuteReader("DESPESAS_TESOURARIA_AUTENTICACAO", CommandType.StoredProcedure))
{
DataTable dtResult = new DataTable();
dtResult.Load(dr);
dr.Close();
return dtResult;
}
}
}
Update
public static void AtualizarAdiantamento(DespesasEntity _despesasEntity)
{
try
{
using (DatabaseHelper db = new DatabaseHelper())
{
db.AddParameter("@IDDESPESAS", _despesasEntity.IdDespesas);
db.AddParameter("@ADIANTAMENTO", _despesasEntity.Adiantamento);
db.ExecuteNonQuery("DESPESAS_TESOURARIA_ATUALIZAR_ADIANTAMENTO", CommandType.StoredProcedure);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
Fábio
Gostei + 0
05/07/2010
Carlos Nogueira
Gostei + 0
05/07/2010
Fabio Mans
Fabio
Gostei + 0
05/07/2010
Carlos Nogueira
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)