C#和SQL Server:表的条件语句

时间:2015-08-09 14:06:31

标签: c# sql sql-server datatable conditional-statements

我有一个使用管理员和员工登录的程序。我在SQL Server中有两个名为AdminEmployee的表。

我只有一个登录窗口。我有两种表单AdminFormEmpForm。输入用户名和密码后,我想阅读这两个表。

  • 如果用户名和密码属于表格Admin,则会显示AdminForm
  • 但当用户名和密码属于表Employee时,它会显示EmpForm

我是SQL Server的新手。反正有可能吗?截至目前,这是我的代码:

private void btnLogin_Click(object sender, EventArgs e)
{    
    using (var connect = sqlcon.getConnection())
    {
         using (SqlCommand cmd = new SqlCommand("SELECT * FROM administrator WHERE username = @username AND password = @password"))
         {
              cmd.Connection = connect;
              connect.Open();
              cmd.Parameters.Add("@cusername", SqlDbType.Char).Value = tbUsername.Text;
              cmd.Parameters.Add("@cpassword", SqlDbType.Char).Value = tbPassword.Text;
              using (SqlDataReader re = cmd.ExecuteReader())
              {
                 if (re.Read())
                 {
                 }
                 else
                 {
                 }                               
             }                        
        }
    }
}

5 个答案:

答案 0 :(得分:2)

架构错了。将这两个表合并到一个 @Override protected void onCreate(Bundle savedInstanceState) { ... buildGeofence(14.728801, 120.961209, "Id_test", 500); } private void buildGeofence(double latitude ,double longitude, String requestId, int radius){ int GEOFENCE_TRANSITION_ENTER = 1; LatLng geofencePoint = new LatLng(latitude, longitude); //int radius = 500; Geofence.Builder geofence = new Geofence.Builder(); geofence.setCircularRegion(geofencePoint.latitude,geofencePoint.longitude, radius); geofence.setRequestId(requestId); geofence.setExpirationDuration(Geofence.NEVER_EXPIRE); geofence.setTransitionTypes(GEOFENCE_TRANSITION_ENTER); geofence.setNotificationResponsiveness(0); geofence.build(); CircleOptions circleOptions = new CircleOptions(); circleOptions.center(geofencePoint); circleOptions.radius(radius); circleOptions.strokeColor(Color.BLACK); circleOptions.strokeWidth(2); circleOptions.fillColor(0x30ff0000); mMap.addCircle(circleOptions); } 表中,另外一列指示用户所属的角色。

答案 1 :(得分:0)

您需要2个sql查询,其中包含参数用户名和密码,如果插入的参数正确,则需要一个查询返回admin另一个查询返回对象employee的对象,否则返回null。

尝试使用这两个查询的结果初始化Admin和Employee的对象。 比测试

if(admin != null)打开AdminForm。 else if(employee != null)打开EmpForm。 else - 显示消息不正确的用户名或/和密码。

SonerGönül正确尝试使用带或不带盐的散列来保存密码不用明文。

答案 2 :(得分:0)

您的查询可以这样工作:

Select [EntityType] =1 , SurrogateKey = EmployeeKey, LastName, FirstName from dbo.Employee where (blah blah blah)
UNION ALL
Select [EntityType] = 2, SurrogateKey = AdminKey, LastName, FirstName from dbo.Admin where (blah blah blah)

然后你将有办法区分行....如果你得到2行,你可以做出决定。 EmployeeKey和AdminKey(无论您的PK名称是什么)都必须是相同的数据类型。 (LastName和FirstName,如果所有数据类型都匹配,则只能使用UNION / UNION ALL。

..............

说完..........你已经“混淆”了很多担忧。创建一个DataLayer,它返回某种具有必要值的POCO对象。 button_click和SqlConnection不应该在同一个代码中。

pubic class LoginResult()
{
public int EntityType {get;set;}
public int SurrogateKey {get;set;}
public string LastName{get;set;}
public string FirstName{get;set;}
}


public interface IAccountManager
{
LoginResult AttemptLogin (string userName, string password)
}
public class IAccountManager() : IAccountManager
{
public LoginResult AttemptLogin (string userName, string password)
{
// put your SqlConnection/SqlReader code here
// do not put any "logic" "if checks" etc....the concern here is to only create the object
}
}

分开关注点会好一些。谷歌“C#层”进行更多讨论。

答案 3 :(得分:0)

正如其他人所说,这不是用户名/密码的正确方法。但你的问题的答案是使用一个联盟,如:

         using (SqlCommand cmd = new SqlCommand("SELECT 1 as IsAdmin, * 
FROM administrator 
WHERE username = @username AND password = @password 
    UNION ALL 
SELECT 0 as IsAdmin, * 
FROM employees 
WHERE username = @username AND password = @password "))

答案 4 :(得分:0)

我使用了admin和employee的权限并对其进行了编码。谢谢你的想法!如果有人需要,请参考下面的代码。 不要忘记加密密码。

 private void btnLogin_Click(object sender, EventArgs e)
    {
        using (var connect = sqlcon.getConnection())
        {
            using (SqlCommand cmd = new SqlCommand("SELECT rights FROM employee WHERE username = @username AND password = @password"))
            {
                cmd.Connection = connect;
                connect.Open();
                cmd.Parameters.Add("@username", SqlDbType.Char).Value = tbUsername.Text;
                cmd.Parameters.Add("@password", SqlDbType.Char).Value = tbPassword.Text;
                //SqlDataReader re = cmd.ExecuteReader();
                string aeRights = (string)cmd.ExecuteScalar();

                if (aeRights == "1")
                {
                    frmAdmin frmA = new frmAdmin();
                    frmA.Show();
                    this.Hide();
                }

                else if (aeRights == "2")
                {
                    frmEmp frmE = new frmEmp();
                    frmE.Show();
                    this.Hide();
                }

                else if (string.IsNullOrEmpty(aeRights))
                {
                    MessageBox.Show("Invalid username or password! Please try again", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }              
        }
    }