1

我要做的是获取当前登录用户的用户名,并将其与包含用户的数据库进行比较,还包括一个活动标志和一个管理员标志。我想比较 tbl_Person 表中的当前登录用户和表中他们各自的用户,看看他们是否被标记为活动和管理员。如果两者都是真的,他们可以访问管理页面。到目前为止,我有以下内容不起作用。有些我知道为什么,有些我不知道。我认为我走在正确的轨道上,话虽这么说,但我确信我做得不对。我知道您使用 ExecuteScalar() 在查询字符串中与 OUTPUT 一起返回某些内容,但无法使其正常工作。另一个明显的问题是,当用户名是字符串并且活动和管理标志是布尔值时,我试图返回整数。我知道我只有 Active 在那一刻。在添加其他内容之前,我试图让它发挥作用。

我用 ExecuteScalar 读到了,你可以解析和转换 ToString,但这不起作用,我发现证据表明这可能不是正确的做法,但我真的不确定。

我有几个不同的错误。当我尝试执行 OUTPUT 时,输入错误,无效列。使用 OUTPUT,我只尝试了 OUTPUT,因为我知道插入后返回时,您会使用 insert.name。我凭直觉尝试了 selected.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.
}

查询也不是最终的。一旦它工作,我会将其更改为参数化查询。

4

1 回答 1

1

好的,考虑以下代码:

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
    }
}

我很确定它会做你想要的。但它也向您展示了一些最佳实践,例如:

  1. 为所有对象利用该using语句。IDisposable
  2. 尽可能多地过滤查询,并且只进行一次往返。
于 2013-06-11T04:42:40.753 回答