C# 自动执行查询字符串



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

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

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

经过编辑以使函数更通用

相关内容

  • 没有找到相关文章

最新更新