What the error means is that you have a stored procedure which needs a parameter called @Comments and that the parameter cannot be a null value, which is exactly what you pass if the user doesn't enter anything:
string commentsText = (!string.IsNullOrEmpty(txtComments.Text)) ? txtComments.Text : null;
Instead of this, try always passing a string:
cmd.Parameters.AddWithValue("@Comments", txtComments.Text.Trim());
And that should work because the Text property of a TextBox can never be null.