還在爲拼接sql煩惱嗎,提供一種將DataTable的數據插入到數據庫的通用方法

在開發過程中經常遇到一些字段很多很多的表,在寫入數據時如果採用拼接SQL真的很難受,自創一種通用的方法,主要原理是通過DataTable的列名與字段表名進行一致性匹配,通過USER_TAB_COLUMNS表獲取到字段的字段類型信息生成insert 字符串,這裏取的字段是DataTable和表中都有的,這樣表後期如果增加字段也不會產生影響,希望能夠爲大家提供參考。

   /// <summary>
        /// 將數據插入到數據庫表的通用方法,針對DataTable及數據表中都存在的字段進行操作
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="ConnStr">連接字符串</param>
        /// <param name="TableName">數據庫中的表名</param>
        public static void InsertDataToDB(DataTable dt, string ConnStr, string TableName)
        {
            try
            {
                if (dt == null || dt.Rows.Count < 1) { return; }
                //獲取數據表中及dt列名共有的字段
                string colStr = string.Empty;
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    colStr += dt.Columns[i].ColumnName + ",";
                }
               colStr= "'"+colStr.TrimEnd(',').Replace(",","','").ToUpper()+"'";
                string sql = string.Format("SELECT COLUMN_NAME,DATA_TYPE  FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '{0}' AND COLUMN_NAME IN ({1})", TableName.ToUpper(), colStr);
                DataTable dt_columns = OracleHelper.ExecuteTable(ConnStr, CommandType.Text, sql);
                if (dt_columns == null || dt_columns.Rows.Count < 1)
                {
                    throw new Exception("數據庫無此表");
                }
                StringBuilder sqlStart_SB = new StringBuilder(string.Format("INSERT INTO {0} (", TableName));
                for (int i = 0; i < dt_columns.Rows.Count; i++)
                {
                    sqlStart_SB.Append(dt_columns.Rows[i]["COLUMN_NAME"]);
                    sqlStart_SB.Append(",");
                }
                sqlStart_SB.Remove(sqlStart_SB.Length - 1, 1).Append(") VALUES (");
                string sqlStart_Str = sqlStart_SB.ToString();
                string[] sqlList = new string[dt.Rows.Count];
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    StringBuilder sql_valueSB = new StringBuilder(sqlStart_Str);
                    for (int j = 0; j < dt_columns.Rows.Count; j++)
                    {
                        sql_valueSB.Append(FormatValueExpression(dt.Rows[i][dt_columns.Rows[j]["COLUMN_NAME"].ToString()].ToString(), dt_columns.Rows[j]["DATA_TYPE"].ToString()));
                        sql_valueSB.Append(",");
                    }
                    sql_valueSB.Remove(sql_valueSB.Length - 1, 1).Append(")");
                    sqlList[i] = sql_valueSB.ToString();
                }
                string Msg = "";
                if (!OracleHelper.ExecuteNonQuery_List(ConnStr, sqlList, ref Msg))
                {
                    throw new Exception(Msg);
                }
            }
            catch
            {
                throw;
            }
        }

        /// <summary>
        /// 格式化sql語句的字符串
        /// </summary>
        /// <param name="value">字段值</param>
        /// <param name="data_type">字段類型</param>
        /// <returns></returns>
        private static string FormatValueExpression(string value, string data_type)
        {
            if (string.IsNullOrEmpty(value))
            {
                return "NULL";
            }

            switch (data_type)
            {
                case "VARCHAR2":
                    return string.Format("'{0}'", value.Replace("'", "''"));
                case "NUMBER":
                    return value;
                case "DATE":
                    return string.Format(" to_date('{0}','yyyy-mm-dd hh24:mi:ss')", value);
                default:
                    throw new Exception("暫不支持" + data_type + "類型值的格式化");
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章