Here is the button handler that helps to login a user, I will like to retrieve the user data into a global data structure that be used all through the program, something relating to PHP Web Session. How do I implement and retrieve using my code below
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace MySql::Data::MySqlClient;
private: System::Void loginBtn_Click(System::Object^ sender, System::EventArgs^ e) {
String^ email = this->email->Text;
String^ password = this->password->Text;
if (email == " " || password == "") {
MessageBox::Show("Please enter all fields to proceed");
}
else {
String^ connString = L"datasource=127.0.0.1;port=3306;username=root;password=";
MySqlConnection^ connDb = gcnew MySqlConnection(connString);
MySqlCommand^ cmdDb = gcnew MySqlCommand("select * from clocking.users where EMAIL = '" + email + "' AND PASSWORD = '" + password + "' ", connDb);
MySqlDataReader^ myReader;
try {
connDb->Open();
myReader = cmdDb->ExecuteReader();
int row = 0;
while (myReader->Read()) {
row = row + 1;
}
if(row == 1){
MessageBox::Show("Welcome on board! Auth Successful");
}
else {
MessageBox::Show("Incorrect Email/Password Combination. Try again!");
}
}
catch (Exception^ex) {
MessageBox::Show("Error Connecting to System Database!");
}
}
}
Hello Lewa Bammy Stephen, your code is fine, you just have to add a class where you save the user data with its appropriate get and set methods, I show you below.
public bool Login(string Nombre, string Contraseña)
{
using (var conection = Getconection())
{
conection.Open();
using (var command = GetSqlCommand())
{
command.Connection = conection;
command.CommandText = "select * from Usuario where Usuario = #Usuario and claveusu =#claveusu";
command.Parameters.AddWithValue("#Usuario", Nombre);
command.Parameters.AddWithValue("#claveusu", Contraseña);
command.CommandType = CommandType.Text;
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Datoscahe.Iduser = reader.GetInt32(0);
Datoscahe.Name = reader.GetString(1);
Obtenerrol();
}
return true;
}
else
return false;
}
}
}
If you look closely inside the while condition I am telling it to call the Data class cahe so that it saves me the information of the person who started the session indicating what type of value it has and the position it has in the database
namespace Capadatos.SQLserver
{
public static class Datoscahe
{
public static int Idusuario { get; set; }
public static string Nombre { get; set; }
public static string Apellidos { get; set; }
public static string Sexo { get; set; }
public static DateTime Fecha_nacimiento { get; set; }
public static string Num_documento { get; set; }
public static string Direccion { get; set; }
public static string Telefono { get; set; }
public static string Email { get; set; }
public static int Idrol { get; set; }
public static string Usuario { get; set; }
public static string Password { get; set; }
}
}
and this is the class where I keep the user data
Related
I created a SqlMapper.TypeHandler to map a Customer object into a CreditAccount class as follows:
public class CustomerTypeHandler : SqlMapper.TypeHandler<Customer>
{
public override Customer Parse(object value)
{
throw new NotImplementedException();
}
public override void SetValue(IDbDataParameter parameter, Customer
value)
{
throw new NotImplementedException();
}
}
public class CreditAccount
{
public int AccountId { get; set; }
public Customer Customer{ get; set; }
}
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
}
When I connect to the DB and call a sproc, the CustomerTypeHandler Parse method is never called and my CreditAccount object is populated with the AccountId only. The Customer object is null.
I am calling it as follows:
public async Task<CreditAccount> GetCreditAccount(int accountId)
{
var sql = "MY PROC NAME HERE";
var parameters = new DynamicParameters();
parameters.Add("#AccountId", accountId);
SqlMapper.AddTypeHandler(new CustomerTypeHandler());
using (IDbConnection connection = Connection)
{
connection.Open();
var account = await connection.QueryFirstAsync<CreditAccount>(sql, parameters, commandType: CommandType.StoredProcedure);
return account;
}
}
}
I placed a breakpoint in the Parse method and it is never called.
The database connection works, and I am getting the AccountId.
My environment;
.NET Core 2.2
Dapper 1.50.5
The code is simple enough. I get not exceptions. Any ideas?
A year has passed and now there is no this error in Dapper 2.0.30.
I checked it on jsonb columns in Postgres.
using Dapper;
using Newtonsoft.Json;
using Npgsql;
using System;
using System.Data;
public class CreditAccount
{
public int AccountId { get; set; }
public Customer Customer { get; set; }
}
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
}
public class CustomerJsonObjectTypeHandler : SqlMapper.TypeHandler<Customer>
{
public override void SetValue(IDbDataParameter parameter, Customer value)
{
parameter.Value = (value == null)
? (object)DBNull.Value
: JsonConvert.SerializeObject(value);
parameter.DbType = DbType.String;
}
public override Customer Parse(object value)
{
return JsonConvert.DeserializeObject<Customer>(value.ToString());
}
}
Example using this classes - all work fine.
static void Main(string[] args)
{
using (var connection = GetDefaultConnection())
{
connection.Open();
var customer = new Customer
{
FirstName = "Gaday",
LastName = "Ivanova",
MiddleName = "Petrovich"
};
var jsonData = JsonConvert.SerializeObject(customer);
var strQuery = $"SELECT 10500 as AccountId,'{jsonData}'::jsonb as Customer";
SqlMapper.AddTypeHandler(new CustomerJsonObjectTypeHandler());
try
{
var data = connection.QueryFirst<CreditAccount>(strQuery);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
I have a simple class User like below:
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string FullName
{
get
{
return Name + " " + Surname;
}
}
}
Then I have form frmProcess, which displays list of Users in combobox, like below. The problem is, that if I set DisplayMember to FullName then what is displayed is UserId column. What's weird is that if I set DisplayMember to Surname, then Surname is displayed. What am I doing wrong?
public partial class frmProcess : Form
{
List<User> Users;
private async void frmProcess_Load(object sender, EventArgs e)
{
Users = new List<User>();
User A = new User { UserId = 1, Name = "Michael", Surname = "Smith" };
User B = new User { UserId = 2, Name = "John", Surname = "Johnson" };
Users.Add(A);
Users.Add(B);
cmbStartedBy.DataSource = Users;
cmbStartedBy.DisplayMember = "FullName";
cmbStartedBy.ValueMember = "UserId";
}
}
I have run your exact code in a winforms application in VS2013 and get this:
EDIT: The only difference is the async on Form load.
Entire code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<User> Users;
private void Form1_Load(object sender, EventArgs e)
{
Users = new List<User>();
User A = new User { UserId = 1, Name = "Michael", Surname = "Smith" };
User B = new User { UserId = 2, Name = "John", Surname = "Johnson" };
Users.Add(A);
Users.Add(B);
comboBox1.DataSource = Users;
comboBox1.DisplayMember = "FullName";
comboBox1.ValueMember = "UserId";
}
}
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string FullName
{
get
{
return Name + " " + Surname;
}
}
}
}
Ok, found the bug. When I was posting my question I simplified my class and removed, among others, the data annotations. Surprisingly, this made the code work correctly. As it turns out, the problem was caused by FullName property being marked as [Browsable(false)]. I marked it unbrowsable so that this property wasn't displayed in DataGridViews, didn't realize the impact is also on comboboxes.
public class User
{
[DisplayName("ID")]
public int UserID { get; set; }
[DisplayName("Imie")]
[Required(AllowEmptyStrings = false, ErrorMessage = "Pole imie nie może być puste!")]
public string Name { get; set; }
[DisplayName("Nazwisko")]
[Required(AllowEmptyStrings = false, ErrorMessage = "Pole nazwisko nie może być puste!")]
public string Surname { get; set; }
[Browsable(false)]// <-- this was causing the issue
public string FullName
{
get
{
return Name + " " + Surname;
}
}
}
I have an issue when I use Code First EF. When I want to insert an User with its Permissions, the user insert well, but in inserting Permissions just after insert user, I see this exception :
SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.UserPermissions_dbo.Users_UserId". The conflict occurred in database "DATABASE", table "dbo.Users", column 'UserId'.
Here my code :
public class User
{
public short UserId { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public ObservableCollection<UserPermission> UserPermissions { get; set; }
}
public class UserPermission
{
public int UserPermissionId { get; set; }
public short UserId { get; set; }
public short PermissionEnum { get; set; }
public bool IsPermitted { get; set; }
}
public class DatabaseContext : DbContext
{
public DatabaseContext()
{
}
public DbSet<User> Users { get; set; }
public DbSet<UserPermission> UserPermissions { get; set; }
}
And final code to insert is :
private void ConfirmButton_Click(object sender, RoutedEventArgs e)
{
var user = new User { Username = "myUsername", Password = "12"};
using (var dbContext = new DatabaseContext())
{
dbContext.Users.AddOrUpdate(user);
dbContext.SaveChanges();
}
SaveUserPermissions(user);
}
private void SaveUserPermissions(User user)
{
var userPermissionsToSave = new ObservableCollection<UserPermission>();
foreach (var permission in ThisUserPermissionData.UserPermissions)
{
var newUserPermission = new UserPermission();
newUserPermission.UserId = PageModel.UserId;
newUserPermission.UserPermissionTypeEnum = 4;
userPermissionsToSave.Add(newUserPermission);
}
using (var dbContext = new DatabaseContext())
{
dbContext.UserPermissions.AddOrUpdate(userPermissionsToSave.ToArray());
dbContext.SaveChanges();
}
}
Note that when I set breakpoint after save user, the code perform correctly. But in normal mode, my code has that exception.
Thanks in advance.
I am using Simple Membership and a UserProfile table that maintains UserId and UserName:
public partial class UserProfile
{
public UserProfile()
{
this.webpages_Roles = new List<webpages_Roles>();
}
public int UserId { get; set; }
public string UserName { get; set; }
public virtual ICollection<webpages_Roles> webpages_Roles { get; set; }
}
With Entity Framework I am running the following which is inside my Context:
public partial class UowContext : DbContext
// code to set up DbSets here ...
public DbSet<Content> Contents { get; set; }
private void ApplyRules()
{
var r1 = new Random();
var r2 = new Random();
foreach (var entry in this.ChangeTracker.Entries()
.Where(
e => e.Entity is IAuditableTable &&
(e.State == EntityState.Added) ||
(e.State == EntityState.Modified)))
{
IAuditableTable e = (IAuditableTable)entry.Entity;
if (entry.State == EntityState.Added)
{
e.CreatedBy = // I want to put the integer value of UserId here
e.CreatedDate = DateTime.Now;
}
e.ModifiedBy = // I want to put the integer value of UserId here
e.ModifiedDate = DateTime.Now;
}
}
Here is the schema showing how user information is stored. Note that I store the integer UserId and not the UserName in the tables:
public abstract class AuditableTable : IAuditableTable
{
public virtual byte[] Version { get; set; }
public int CreatedBy { get; set; }
public DateTime CreatedDate { get; set; }
public int ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
}
Here's an example of a controller action that I use:
public HttpResponseMessage PostContent(Content content)
{
try
{
_uow.Contents.Add(content);
_uow.Commit();
var response = Request.CreateResponse<Content>(HttpStatusCode.Created, content);
return response;
}
catch (DbUpdateException ex)
{
return Request.CreateErrorResponse(HttpStatusCode.Conflict, ex);
}
}
I then have:
public class UowBase : IUow, IDisposable
{
public UowBase(IRepositoryProvider repositoryProvider)
{
CreateDbContext();
repositoryProvider.DbContext = DbContext;
RepositoryProvider = repositoryProvider;
}
public IRepository<Content> Contents { get { return GetStandardRepo<Content>(); } }
and:
public class GenericRepository<T> : IRepository<T> where T : class
{
public GenericRepository(DbContext dbContext)
{
if (dbContext == null)
throw new ArgumentNullException("An instance of DbContext is required to use this repository", "context");
DbContext = dbContext;
DbSet = DbContext.Set<T>();
}
public virtual void Add(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State != EntityState.Detached)
{
dbEntityEntry.State = EntityState.Added;
}
else
{
DbSet.Add(entity);
}
}
How can I determine the UserId from inside of my Context so I can populate the Id in my tables?
In Code you will have UserName with you through:
HttpContext.Current.User.Identity.Name
you can than query UserProfile table against that Name and get the UserId from there and than assign it to ModifiedBy attribute.
Make sure that you query UserProfile table outside the foreach loop :)
I have a winform powerpacks datareapter control having a picture box. This is the code snippet from the classes.
DisplaySystemUsersControl.Designer.cs
this.picBoxUserImage.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.picBoxUserImage.DataBindings.Add(new System.Windows.Forms.Binding("Image", this.UserBindingSource, "User_Image", true));
this.picBoxUserImage.Location = new System.Drawing.Point(3, 3);
this.picBoxUserImage.Name = "picBoxUserImage";
this.picBoxUserImage.Size = new System.Drawing.Size(100, 93);
this.picBoxUserImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.picBoxUserImage.TabIndex = 0;
this.picBoxUserImage.TabStop = false;
this.picBoxUserImage.Click += new System.EventHandler(this.picBoxUserImage_Click);
DisplaySystemUsersControl.cs
public DisplaySystemUsersControl()
{
InitializeComponent();
this.dataRepeaterAccounts.DataSource = this.UserBindingSource;
LoadAccountData();
}
private void LoadAccountData()
{
SystemUserBusinessClass oSystemUserBusinessClass = new SystemUserBusinessClass();
List<SystemUserEntity_Only_For_UI_Binding> obj = oSystemUserBusinessClass.GetSystemUsersForUI();
BindingSource tempUserBindingSource = (BindingSource)dataRepeaterAccounts.DataSource;
obj.ForEach(oSystemUserEntity_Only_For_UI_Binding => tempUserBindingSource.Add(oSystemUserEntity_Only_For_UI_Binding));
}
SystemUserEntity_Only_For_UI_Binding.cs
public class SystemUserEntity_Only_For_UI_Binding
{
public string User_Id { get; set; }
public string User_Name { get; set; }
public byte[] User_Image { get; set; }
}
User ID and User name is getting loaded. But Image is not getting loaded. SystemUserEntity_Only_For_UI_Binding.User_Image() is holding the image byte array.
Can anybody please tell me what is going wrong?
Your class should look something like this:
public class SystemUserEntity_Only_For_UI_Binding
{
public string User_Id { get; set; }
public string User_Name { get; set; }
public Image User_Image { get; set; }
}
The byte array needs to be translated into an image somewhere in your code:
using (MemoryStream ms = new MemoryStream(imgBytes)) {
this.User_Image = Image.FromStream(ms);
}
public void BindRepeater (DataSet dsObj)
{
pictureBox1.DataBindings.Clear();
pictureBox1.DataBindings.Add("ImageLocation", dt, "Photo");
dataRepeater1.DataSource = dsObj;
}