我有一个MVC-Razor项目,我有义务在不使用ORM的情况下完成它。我只使用 SQL 命令,在数据库控制器的 add(model) 方法中,我以这种格式执行查询字符串命令:
string queryString =
"INSERT INTO USERS VALUES(@EMAIL,@PAIS,@IDIOMA,@CODPROMO,@NOMBREUSU"+
",@PASS,@PIN,@TRATAMIENTO,@NOMBREPERS,@APELLIDOS,@FECHANAC,@DIRECCION,@NUMPISO"+
",@CP,@CIUDAD,@NIF,@NUMMOVIL,@SUBSCRIBIR,@CONDICIONES,@PRIVACIDAD)";
如您所见,表中有很多参数要插入。然后,我必须将这些@parameters与command.Parameters.AddWithValue("@EMAIL",socio.Mail);
联系起来
有没有更快的方法来完成所有这些(也许是更动态的东西?)而不需要所有这些写作?
那么,在没有所有这些写作的情况下,有什么更快的方法可以做到这一点吗?
是的,如果这是您必须执行的操作,请考虑重构SQL代码并将其拉入stored procedure(SP)
并在代码中调用该SP。如果要发送结构化数据,也可以考虑使用表类型变量。
下面是用于构建查询字符串的反射的快速示例。 这个想法是拥有一个镜像表列的类。 以下代码可用于为任何数据模型类生成插入。 它将构建插入语句并填写参数,然后执行该语句。
public static void GenericSqlInsert(string connectionString, string table, Object model)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
string commandText = "Insert into " + table + "Values(";
SqlCommand command = new SqlCommand();
PropertyInfo[] properties = model.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
commandText += "@" + property.Name + ",";
command.Parameters.AddWithValue("@" + property.Name, property.GetValue(model));
}
commandText = commandText.TrimEnd(',');
commandText += ") ";
try
{
command.Connection = connection;
command.CommandText = commandText;
connection.Open();
Int32 rowsAffected = command.ExecuteNonQuery();
Console.WriteLine("RowsAffected: {0}", rowsAffected);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
我不知道我是否会推荐这种方法,但它是反射的一种有趣用途。
编辑以反映阿列克谢·列文科夫的建议
经过编辑以使函数更通用