与数据库值比较
本文关键字:比较 数据库 | 更新日期: 2023-09-27 18:17:44
我要做的是抓住当前登录用户的用户名,并将其与包含用户的数据库进行比较,还包括一个活动标志和一个管理标志。我想比较tbl_Person表中当前登录的用户和他们各自在表中的用户,看看他们是否被标记为Active和Admin。如果两者都为真,则它们可以访问Admin页面。我有以下到目前为止,这是不工作。有些我知道原因,有些我不知道。我认为我走在正确的轨道上,尽管如此,我确信我做得不对。我知道您使用ExecuteScalar()在查询字符串中与OUTPUT一起返回一些东西,但无法使其工作。另一个明显的问题是,我试图返回整数时,用户名是一个字符串和活动和管理标志是bool。我知道我只有在那里有活跃的时刻。在添加其他内容之前,我试图让它工作。
我读到用ExecuteScalar,你可以解析和转换ToString,但那不起作用,我发现证据表明这可能不是正确的事情要做,但我真的不确定。
我有几个不同的错误。类型错误,无效的列,当我试图做输出。对于OUTPUT,我尝试将其作为OUTPUT,因为我知道在插入后返回时,您执行insert .name。我试着按直觉选择。name,但是没有成功。
我在想,如果我拉的信息,连接他们,然后做了比较,这将做我想要的,但我是开放的其他建议。谢谢。
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString);
conn.Open();
SqlCommand sqlUserName = new SqlCommand("SELECT [username] FROM [tbl_Person]", conn);
SqlCommand sqlActive = new SqlCommand("SELECT [active] FROM [tbl_Person]", conn);
int result1 = ((int)sqlUserName.ExecuteScalar());
int result2 = ((int)sqlActive.ExecuteScalar());
string userInfo = result1 + "." +result2;
string userName = userName + "." +result2;
if (userInfo == userName)
{
Woo, you have access.
}
else
{
Sorry, but no.
}
这个查询也不是最终的。一旦它开始工作,我将把它更改为参数化查询。
好的,考虑以下代码:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT [active] FROM [tbl_Person] WHERE username = @username", conn))
{
// since we can literally filter the results, if something comes back
// we know they are registered
cmd.Parameters.AddWithValue("@username", userName);
var res = cmd.ExecuteScalar();
bool registeredAndActive = (bool)res;
// unless of course `[active]` is an INT -then do this
bool registeredAndActive = (int)res == 1 ? true : false;
// but really -set [active] up as a BIT if it's not **and**
// please make it non-nullable :D
}
}
我很确定它是你想要的。但它也向您展示了一些最佳实践,如:
- 为所有
IDisposable
对象使用using
语句。 - 尽可能多地过滤查询,并且只进行一次往返。