Array of Sized/Typed SqlParameters
Question
I'm trying to create an array of dbTyped and sized SqlParameters. This works fine but results in changing code both places if I need another column.
SqlParameter[] parameters = {
new SqlParameter("@first_name", SqlDbType.VarChar, 50),
new SqlParameter("@last_name", SqlDbType.VarChar, 50),
new SqlParameter("@middle_name", SqlDbType.VarChar, 50),
new SqlParameter("@empid", SqlDbType.Int)
};
parameters[0].Value = to.FirstName;
parameters[1].Value = to.LastName;
parameters[2].Value = to.MiddleName;
parameters[3].Value = to.EmpId;
What is a better way of doing this?
Solution
You can use object initializer expressions:
SqlParameter[] parameters =
{
new SqlParameter("@first_name", SqlDbType.VarChar, 50) { Value = to.FirstName },
new SqlParameter("@last_name", SqlDbType.VarChar, 50) { Value = to.LastName },
new SqlParameter("@middle_name", SqlDbType.VarChar, 50) { Value = to.MiddleName },
new SqlParameter("@empid", SqlDbType.Int) { Value = to.EmpId }
};
You could also create a list in the same way, which is often preferred:
List<SqlParameter> parameters = new List<SqlParameter>
{
new SqlParameter("@first_name", SqlDbType.VarChar, 50) { Value = to.FirstName },
new SqlParameter("@last_name", SqlDbType.VarChar, 50) { Value = to.LastName },
new SqlParameter("@middle_name", SqlDbType.VarChar, 50) { Value = to.MiddleName },
new SqlParameter("@empid", SqlDbType.Int) { Value = to.EmpId }
};
Or you could even write an extension method on SqlParameter
:
public static SqlParameter WithValue(this SqlParameter parameter, object value)
{
parameter.Value = value;
return parameter;
}
Then use it like this:
List<SqlParameter> parameters = new List<SqlParameter>
{
new SqlParameter("@first_name", SqlDbType.VarChar, 50).WithValue(to.FirstName),
new SqlParameter("@last_name", SqlDbType.VarChar, 50).WithValue = to.LastName)
new SqlParameter("@middle_name", SqlDbType.VarChar, 50).WithValue(to.MiddleName),
new SqlParameter("@empid", SqlDbType.Int).WithValue(to.EmpId)
};
OTHER TIPS
You can use the constructor overload that allows you to specify the value as a parameter.
For example:
SqlParameter[] parameters = {
new SqlParameter("@first_name", SqlDbType.VarChar, 50, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Current, to.FirstName),
etc...
A better way? Sure: let a tool help you, for example "dapper":
var rows = conn.Query<YourType>(@" your tsql ",
new { first_name = to.FirstName,
middle_name = to.MiddleName,
last_name = to.LastName,
empid = to.EmpId }).ToList();
This then handles all the parameterisation and materialization for you.
you can add the value back like this:
new SqlParameter("@first_name", SqlDbType.VarChar, 50).value = to.FirstName
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow