Вам нужно указать параметру, какой это тип, где-то, вы могли бы написать универсальный метод, но вам нужно будет указать тип для каждого вызова, это не является значительным улучшением того, что у вас есть
private static void AddParameter<T>(SqlCommand cmd, string paramName, string value) where T : IConvertible
{
cmd.Parameters.AddWithValue(paramName, Convert.ChangeType(value, typeof(T)));
}
...
AddParameter<double>(cmd, "ApprovedAmount", txtApprovedAmount.Text);
Кроме того, вы можете создать подкласс TextBox, чтобы он имел тип, или создать новые пользовательские элементы управления со свойством Type
, например. Подклассы
public class TypedText<T>
: TextBox
where T : IConvertible
{
public object Value
{
get { return Convert.ChangeType(Text, typeof(T)); }
}
}
Используйте их вместо стандартных TextBox, тогда ваш код параметра добавления станет
cmd.Parameters.AddWithValue("ApprovedAmount", txtApprovedAmount.Value);
На самом деле, вы можете потерять самообладание и получить интерфейс ISPParameter, который реализован в ваших типизированных элементах управления, тогда он будет содержать логические значения из флажков, даты из средств выбора даты и т. Д.
public interface ISPParameter
{
string Name { get; }
object Value { get; }
}
public class TypedText<T>
: TextBox, ISPParameter
where T : IConvertible
{
private string parameterName;
public TypedText(string parameterName)
{
this.parameterName = parameterName;
}
public object TypedValue
{
get { return Convert.ChangeType(Text, typeof(T)); }
}
string ISPParameter.Name
{
get { return parameterName; }
}
object ISPParameter.Value
{
get { return TypedValue; }
}
}
с помощью метода AddParameter
public void AddParam(SqlCommand cmd, ISPParameter param)
{
cmd.Parameters.AddWithValue(param.Name, param.Value);
}
Тогда добавление параметров становится
AddParameter(cmd, txtApprovedAmount);
Надеюсь, это даст вам несколько идей для работы.