我有一个MVC-Razor项目,我有义务在不使用ORM的情况下完成它。我只使用SQL命令,在DB控制器的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);
有没有更快的方法来完成所有这些(更有活力的东西,也许?)没有全部写作?
答案 0 :(得分:3)
所以,如果没有所有的写作,任何更快的方法吗?
是的,如果您需要这样做,请考虑重构SQL代码并将其拉入stored procedure(SP)
并在代码中调用该SP。如果要发送结构化数据,也可以考虑使用表类型变量。
答案 1 :(得分:2)
以下是构建查询字符串的反射快速示例。我们的想法是拥有一个反映表格列的类。以下代码可用于为任何数据模型类构建插入。它将构建insert语句并填入参数然后执行语句。
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);
}
}
}
我不知道我是否会推荐这种方法,但这是一种有趣的反射方法。
编辑以反映阿列克谢莱文科夫的建议
编辑使功能更通用