convert string to bool while fetching data from database - sql-server

create table tasktodo(Id int identity(1,1) not null, Done bit,Texts nvarchar(max),Dates date)
That is my database table.
I wrote the code to get the data from database like this
public List<TaskToDoList> GetTaskToDo()
{
var Obj = DBHelper.GetDBObject();
reader = Obj.ExecuteReader(CommandType.StoredProcedure, "GetTaskToDoList");
var tasktodo = new List<TaskToDoList>();
while(reader.Read())
{
tasktodo.Add(new TaskToDoList
{
Id =GetInteger("Id"),
Done=Convert.ToBoolean("Done"),
Text=GetString("Text"),
Date =reader["Date"] ==DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(reader["Date"])
});
}
return tasktodo;
}
My model
public class TaskToDoList
{
public int Id { get; set; }
public bool Done { get; set; }
public string Text { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
}
It is showing an error
"String was not recognized as a valid Boolean"
How to solve this?

I got the answer for it.
I'm reading the values from the reader those GetString and GetIngers are the functions to check any nulls. those parameter are values from database table
public List<TaskToDoList> GetTaskToDo()
{
var Obj = DBHelper.GetDBObject();
reader = Obj.ExecuteReader(CommandType.StoredProcedure, "GetTaskToDoList");
var tasktodo = new List<TaskToDoList>();
while(reader.Read())
{
tasktodo.Add(
new TaskToDoList
{
Id =GetInteger("Id"),
Done=Convert.ToBoolean( reader["Done"]),
Text=GetString("Texts"),
Date =reader["Dates"] ==DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(reader["Dates"])
});
}
return tasktodo;
}

Related

INSERT statement conflicted with foreign key constraint - SQL Server/Entity Framework Core

I get this error in my .NET Core 3.1 app:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_DiaryDiaryEntry". The conflict occurred in database "xxxxxx", table "dbo.Diaries", column 'Id'.
I can't see anything wrong with the tables themselves.
public partial class Diaries
{
public long Id { get; set; }
public string CoverImage { get; set; }
public short Year { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public long ChildId { get; set; }
public Children Child { get; set; }
public ICollection<DiaryEntries> DiaryEntries { get; set; }
}
public partial class DiaryEntries
{
public long Id { get; set; }
public DateTime Date { get; set; }
public string Content { get; set; }
public long DiaryId { get; set; }
public Diaries Diary { get; set; }
public ICollection<Images> Images { get; set; }
}
My code? Probably an entirely different matter.
This is the code that generates the error.
[HttpPost("CreateYear/{id}")]
public async Task<IActionResult> CreateYearOfEntries([FromRoute] int id)
{
// The id is the ID of an existing diary
// Make sure the diary does exist first and that it belongs to the current logged-in user
var diary = _diaryRepository.Find(id);
if (diary == null) return NotFound();
var year = diary.Result.Year;
if (await _diaryEntryRepository.OwnerIsLoggedIn(LoggedInUser.ParentId, id))
{
var noOfDays = DateTime.IsLeapYear(year) ? 366 : 365;
var i = 0;
for (; i < noOfDays; i++)
{
var date = new DateTime(year, 1, 1).AddDays(i);
var newDiaryEntry = new DiaryEntries()
{
Content = " ",
Date = date,
DiaryId = diary.Id
};
await _diaryEntryRepository.Add(newDiaryEntry);
}
return Ok();
}
return NotFound();
}
public class DiaryEntryRepository : IDiaryEntryRepository
{
private readonly ApplicationDbContext _context;
public DiaryEntryRepository(ApplicationDbContext context)
{
_context = context;
}
public async Task<DiaryEntries> Add(DiaryEntries diaryEntry)
{
await _context.DiaryEntries.AddAsync(diaryEntry);
await _context.SaveChangesAsync();
return diaryEntry;
}
}

Dapper custom SqlMapper.TypeHandler Parse method not called

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

Realm primary key not getting stored

Data Model:
public class Product : RealmObject
{
[PrimaryKey,JsonProperty(PropertyName = "productId")]
public int ProductId { get; set; }
[JsonProperty(PropertyName = "parentId")]
public int ParentId { get; set; }
[JsonProperty(PropertyName = "productType")]
public string ProductType { get; set; }
}
Method used to add product to db:
public void AddSampleProduct(Product product)
{
var _realm = Realm.GetInstance();
using (var transaction = _realm.BeginWrite())
{
var entry = _realm.Add(product);
transaction.Commit();
}
}
Method used to retrieve product:
public Product GetProductById(int id)
{
Product product = null;
var _realm = Realm.GetInstance();
product = _realm.Find<Product>(id);
var p = _realm.Find<Product>(id);
return product;
}
Method to fetch list of products:
public List<Product> GetProductList()
{
List<Product> productList = new List<Product>();
var _realm = Realm.GetInstance();
productList = _realm.All<Product>().ToList();
return productList;
}
Whenever I try to fetch a product using an id it returns null, at the same time if i try to fetch the list am getting all the products but with the primary key property having the value 0 for all the products. Probably the primary key is not getting stored and hence am not able to fetch individual product using id.
Also, in the model class I had tried defining the primary key and Json Property in separate lines like mentioned below.
public class Product : RealmObject
{
[PrimaryKey]
[JsonProperty(PropertyName = "productId")]
public int ProductId { get; set; }
[JsonProperty(PropertyName = "parentId")]
public int ParentId { get; set; }
[JsonProperty(PropertyName = "productType")]
public string ProductType { get; set; }
}

Dapper: How to return selected columns?

public List<Customer> getCustomer()
{
using (IDbConnection con=DapperConnection())
{
string sql = "Select * from Customer";
return con.Query<Customer>(sql).Select(x => new { x.Id, x.LastName })
.ToList();
}
}
class Customer
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set;}
}
Does anyone know how to return specific columns using dapper? What I am trying to achieve is to return just the Id and LastName as List so that I can bind them to my controls.
Unsure exactly what you mean but surely you should return the customer object instead of an anonymous type, or at least make a smaller version of the customer object to be used by the controls
public List<Customer> getCustomers()
{
using (IDbConnection con = DapperConnection())
{
string sql = "Select * from Customer";
return con.Query<Customer>(sql).ToList();
}
}
Or if you dont like the overhead of returning the full customer object
public List<CustomerBase> getCustomers()
{
using (IDbConnection con = DapperConnection())
{
string sql = "Select * from Customer";
return con.Query<CustomerBase>(sql).ToList();
}
}
public class CustomerBase
{
public string Id { get; set; }
public string LastName { get; set; }
}
public class Customer: CustomerBase
{
public string FirstName { get; set; }
//Other props...
}

How can I auto-update the int ModifiedBy property on a Entity with UserId in Entity Framework 4 when saving?

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 :)

Resources