I saw many questions on stack overflow, non of them touched my own problem
procedure or function expects parameter which was not supplied
You need to check your input for null and use DBNull.Value when you creating the parameters. If you pass just null as a parameter - ADO.Net will ignore that.
DBNull.Value
null
EDIT:
You can add that check into your custom method DataAccessLayer.CreateParameter()
DataAccessLayer.CreateParameter()