我为了这个方法在这里发了两个求助的帖子,虽然都没有得到什么帮助把,好多人建议我用XML,我想有时间可以实验下。不过好在这个方法写完了,经过测试还可以。我只是简单的测试了下。嘿嘿
不过这个方法有个缺陷就是不能自动更新三层中的MODEL实体,需要自己手动去添加MODEL实体。 
      /***************************************
        *作者:[email protected]
        *创世时间:2010-3-23
        *描述:
        *本功能模块主要是用来实现根据表中字段数量自动完成SQL语句
        ***************************************/
        /// <summary>
        /// 获取表中字段名、类型、大小
        /// </summary>
        /// <param name="tableName">设置表名称</param>
        /// <returns>得到DataTable</returns>
        private static DataTable GetDataTable(string tableName)
        {
            string strSql = "select name,prec,(select name from systypes where xusertype=syscolumns.xusertype) from syscolumns where id=object_id('" + tableName + "')";
            DataTable dt = new DataTable();
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();
                using (SqlDataAdapter adp = new SqlDataAdapter(strSql, con))
                {
                    adp.Fill(dt);
                }
            }
            return dt;        }
        /// <summary>
        /// SQL语句自动完成方法
        /// </summary>
        /// <param name="tableName">SQL表名称</param>
        /// <returns>返回影响行数的非查询方法</returns>
        public static int ExecutNonQery(string tableName, string sqlType)
        {
            DataTable dt = new DataTable();
            dt = GetDataTable(tableName);//传入表名称作为参数
            dt.Rows.RemoveAt(0);//删除dt中第一行数据因为第一行一般作为自增长ID,不允许进行insert
            //SQL语句拼写开始
            StringBuilder strSql = new StringBuilder();
            if (sqlType.ToLower() == "insert")
            {
                strSql.Append("insert into ");//设置SQL语句为insert语句
                strSql.Append(tableName + "(");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    strSql.Append(dt.Rows[i][0].ToString());
                    if (i < (dt.Rows.Count - 1))
                    {
                        strSql.Append(",");
                    }                }
                //获取要insert数据的字段名
                strSql.Append(" ) values ( ");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    strSql.Append("@" + dt.Rows[i][0].ToString());
                    if (i < (dt.Rows.Count - 1))
                    {
                        strSql.Append(",");
                    }                }
                //设置insert相对应的变量
                strSql.Append(")");
                SqlParameter[] par = new SqlParameter[dt.Rows.Count];//创建SqlParameter数组并且大小等于dt行数
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    par[j] = new SqlParameter("@" + dt.Rows[j][0].ToString(), (SqlDbType)Enum.Parse(typeof(SqlDbType), GetType(dt.Rows[j][2].ToString().ToLower())), Convert.ToInt32(dt.Rows[j][1].ToString()));
                    //填充数组                }
                object[] o = new object[dt.Rows.Count + 1];
                int y = 0;
                foreach (PropertyInfo iteminfo in model.GetType().GetProperties())
                {
                    o[y] = iteminfo.GetValue(model, null);
                    y++;                }
                //动态获取model实体里边的所有对象属性并且填充到对象数组
                for (int i = 1; i < o.Length; i++)
                {
                    par[i - 1].Value = o[i].ToString();
                }
                return ExecuteSql(strSql, par);
            }
            DataTable table = new DataTable();
            if (sqlType.ToLower() == "update")
            {
                table = GetDataTable(tableName);
                strSql.Append("update ");
                strSql.Append(tableName + " set ");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    strSql.Append(dt.Rows[i][0].ToString() + "=" + "@" + dt.Rows[i][0].ToString());
                    if (i < (dt.Rows.Count - 1))
                    {
                        strSql.Append(",");
                    }                }
                strSql.Append(" where " + table.Rows[0][0].ToString() + "=" + "@" + table.Rows[0][0].ToString());
                SqlParameter[] par = new SqlParameter[table.Rows.Count];//创建SqlParameter数组并且大小等于dt行数
                for (int j = 0; j < table.Rows.Count; j++)
                {
                    par[j] = new SqlParameter("@" + table.Rows[j][0].ToString(), (SqlDbType)Enum.Parse(typeof(SqlDbType), GetType(table.Rows[j][2].ToString().ToLower())), Convert.ToInt32(table.Rows[j][1].ToString()));
                    //填充数组                }
                object[] o = new object[table.Rows.Count];
                int y = 0;
                foreach (PropertyInfo iteminfo in model.GetType().GetProperties())
                {
                    o[y] = iteminfo.GetValue(model, null);
                    y++;                }
                //动态获取model实体里边的所有对象属性并且填充到对象数组
                for (int i = 0; i < o.Length; i++)
                {
                    par[i].Value = o[i].ToString();
                }
                //将对象数组中的数据赋值给SqlParameter数组
                return ExecuteSql(strSql, par);
            }            return 0;        }

解决方案 »

  1.   

    把代码给你格式化一下,看了费劲:
    /***************************************
    *作者:[email protected]
    *创世时间:2010-3-23
    *描述:
    *本功能模块主要是用来实现根据表中字段数量自动完成SQL语句
    ***************************************/
    /// <summary>
    /// 获取表中字段名、类型、大小
    /// </summary>
    /// <param name="tableName">设置表名称</param>
    /// <returns>得到DataTable</returns>
    private static DataTable GetDataTable(string tableName)
    {
    string strSql = "select name,prec,(select name from systypes where xusertype=syscolumns.xusertype) from syscolumns where id=object_id('" + tableName + "')";
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(connectionString))
    {
    con.Open();
    using (SqlDataAdapter adp = new SqlDataAdapter(strSql, con))
    {
    adp.Fill(dt);
    }
    }
    return dt;}
    /// <summary>
    /// SQL语句自动完成方法
    /// </summary>
    /// <param name="tableName">SQL表名称</param>
    /// <returns>返回影响行数的非查询方法</returns>
    public static int ExecutNonQery(string tableName, string sqlType)
    {
    DataTable dt = new DataTable();
    dt = GetDataTable(tableName);//传入表名称作为参数
    dt.Rows.RemoveAt(0);//删除dt中第一行数据因为第一行一般作为自增长ID,不允许进行insert
    //SQL语句拼写开始
    StringBuilder strSql = new StringBuilder();
    if (sqlType.ToLower() == "insert")
    {
    strSql.Append("insert into ");//设置SQL语句为insert语句
    strSql.Append(tableName + "(");
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    strSql.Append(dt.Rows[i][0].ToString());
    if (i < (dt.Rows.Count - 1))
    {
    strSql.Append(",");
    }}
    //获取要insert数据的字段名
    strSql.Append(" ) values ( ");
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    strSql.Append("@" + dt.Rows[i][0].ToString());
    if (i < (dt.Rows.Count - 1))
    {
    strSql.Append(",");
    }}
    //设置insert相对应的变量
    strSql.Append(")");
    SqlParameter[] par = new SqlParameter[dt.Rows.Count];//创建SqlParameter数组并且大小等于dt行数
    for (int j = 0; j < dt.Rows.Count; j++)
    {
    par[j] = new SqlParameter("@" + dt.Rows[j][0].ToString(), (SqlDbType)Enum.Parse(typeof(SqlDbType), GetType(dt.Rows[j][2].ToString().ToLower())), Convert.ToInt32(dt.Rows[j][1].ToString()));
    //填充数组}
    object[] o = new object[dt.Rows.Count + 1];
    int y = 0;
    foreach (PropertyInfo iteminfo in model.GetType().GetProperties())
    {
    o[y] = iteminfo.GetValue(model, null);
    y++;}
    //动态获取model实体里边的所有对象属性并且填充到对象数组
    for (int i = 1; i < o.Length; i++)
    {
    par[i - 1].Value = o[i].ToString();
    }
    return ExecuteSql(strSql, par);
    }
    DataTable table = new DataTable();
    if (sqlType.ToLower() == "update")
    {
    table = GetDataTable(tableName);
    strSql.Append("update ");
    strSql.Append(tableName + " set ");
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    strSql.Append(dt.Rows[i][0].ToString() + "=" + "@" + dt.Rows[i][0].ToString());
    if (i < (dt.Rows.Count - 1))
    {
    strSql.Append(",");
    }}
    strSql.Append(" where " + table.Rows[0][0].ToString() + "=" + "@" + table.Rows[0][0].ToString());
    SqlParameter[] par = new SqlParameter[table.Rows.Count];//创建SqlParameter数组并且大小等于dt行数
    for (int j = 0; j < table.Rows.Count; j++)
    {
    par[j] = new SqlParameter("@" + table.Rows[j][0].ToString(), (SqlDbType)Enum.Parse(typeof(SqlDbType), GetType(table.Rows[j][2].ToString().ToLower())), Convert.ToInt32(table.Rows[j][1].ToString()));
    //填充数组}
    object[] o = new object[table.Rows.Count];
    int y = 0;
    foreach (PropertyInfo iteminfo in model.GetType().GetProperties())
    {
    o[y] = iteminfo.GetValue(model, null);
    y++;}
    //动态获取model实体里边的所有对象属性并且填充到对象数组
    for (int i = 0; i < o.Length; i++)
    {
    par[i].Value = o[i].ToString();
    }
    //将对象数组中的数据赋值给SqlParameter数组
    return ExecuteSql(strSql, par);
    }return 0;}