C#自动化查询字符串

时间:2016-05-31 18:52:11

标签: c# model-view-controller sqlclient

我有一个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);

相关联

有没有更快的方法来完成所有这些(更有活力的东西,也许?)没有全部写作?

2 个答案:

答案 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);
            }
        }
    }

我不知道我是否会推荐这种方法,但这是一种有趣的反射方法。

编辑以反映阿列克谢莱文科夫的建议

编辑使功能更通用