整理了一份sqlhelper类,包含增删改查和批量添加和修改方法
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
namespace MyTest.Data
{
public class SqllHelper
{
//=================================执行sql和存储过程===========================
public static Object SqlScalar(string connectString, string sql)
{
return SqlScalar(connectString, sql, 1);
}
public static Object SqlScalar(string connectString, string sql, object parms)
{
return SqlScalar(connectString, sql, parms, 1);
}
public static int SqlExecute(string connectString, string sql)
{
return SqlExecute(connectString, sql, 1);
}
public static int SqlExecute(string connectString, string sql, object parms)
{
return SqlExecute(connectString, sql, parms, 1);
}
public static T SqlSingle<T>(string connectString, string sql)
{
return SqlSingle<T>(connectString, sql, 1);
}
public static T SqlSingle<T>(string connectString, string sql, object parms)
{
return SqlSingle<T>(connectString, sql, parms, 1);
}
public static List<T> SqlList<T>(string connectString, string sql)
{
return SqlList<T>(connectString, sql, 1);
}
public static List<T> SqlList<T>(string connectString, string sql, object parms)
{
return SqlList<T>(connectString, sql, parms, 1);
}
public static DataTable SqlDataTable(string connectString, string sql)
{
return SqlDataTable(connectString, sql, 1);
}
public static DataTable SqlDataTable(string connectString, string sql, object parms)
{
return SqlDataTable(connectString, sql, parms, 1);
}
public static Object ProScalar(string connectString, string proName)
{
return SqlScalar(connectString, proName, 4);
}
public static Object ProScalar(string connectString, string proName, object parms)
{
return SqlScalar(connectString, proName, parms, 4);
}
public static int ProExecute(string connectString, string proName)
{
return SqlExecute(connectString, proName, 4);
}
public static int ProExecute(string connectString, string proName, object parms)
{
return SqlExecute(connectString, proName, parms, 4);
}
public static T ProSingle<T>(string connectString, string proName)
{
return SqlSingle<T>(connectString, proName, 4);
}
public static T ProSingle<T>(string connectString, string proName, object parms)
{
return SqlSingle<T>(connectString, proName, parms, 4);
}
public static List<T> ProList<T>(string connectString, string proName)
{
return SqlList<T>(connectString, proName, 4);
}
public static List<T> ProList<T>(string connectString, string proName, object parms)
{
return SqlList<T>(connectString, proName, parms, 4);
}
public static DataTable ProDataTable(string connectString, string sql)
{
return SqlDataTable(connectString, sql, 4);
}
public static DataTable ProDataTable(string connectString, string sql, object parms)
{
return SqlDataTable(connectString, sql, parms, 4);
}
public static void BatchInsert(string connectString, DataTable dt, string tableName)
{
BatchInsertImpl(connectString, dt, tableName);
}
public static void BatchInsert<T>(string connectString, List<T> list, string tableName)
{
DataTable dt = GetBatchInsertDataTable(connectString, list, tableName);
BatchInsertImpl(connectString, dt, tableName);
}
/// <summary>
/// 批量修改,使用了事务
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="connectString">数据库连接字符串</param>
/// <param name="list">要修改的数据集</param>
/// <param name="tableName">要修改表名</param>
/// <param name="primaryKeyName">修改时的条件字段,一般修改是按照主键修改的比较多</param>
/// <param name="columns">要修改的字段名称,
/// 如果为空则把T类型中的除primaryKeyName属性之外的所有属性和数据库字段对应进行修改,
/// 属性名称和数据库字段对应时不区分大小写</param>
/// <param name="onceNum">一次性提交的最大数量,因为参数有2100个的限制,所以批量时会分多次进行提交,onceNum设置每次提交的数量</param>
/// <returns>影响数据库的条数</returns>
public static int BatchUpdate<T>(string connectString, List<T> list, string tableName, string primaryKeyName,string[] columns=null, int onceNum = 100)
{
if (list == null || list.Count == 0) return 0;
int obj = 0;
StringBuilder sqlBuiler = new StringBuilder();
Type t = typeof(T);
PropertyInfo[] propertys = t.GetProperties();
if (propertys == null || propertys.Length == 0) return 0;
PropertyInfo wherep = propertys.Where(s => s.Name.ToLower() == primaryKeyName.ToLower()).ToArray()[0]; //拼接修改条件
List<PropertyInfo> propertys_update = new List<PropertyInfo>();
if (columns==null|| columns.Length==0)
{
//指定修改字段为空时,默认修改实体中除了条件属性外的其他所有属性对应的字段
propertys_update = propertys.Where(s => s.Name.ToLower() != primaryKeyName.ToLower()).ToList();
}
else
{
string[] columnsLower = string.Join(",", columns).ToLower().Split(',');
foreach (var item in propertys)
{
if (columnsLower.Contains(item.Name.ToLower())&& item.Name.ToLower()!=primaryKeyName.ToLower())
{
propertys_update.Add(item);
}
}
}
int i = 0;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
SqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
using (SqlCommand cmd = new SqlCommand(sqlBuiler.ToString(), conn, tran))
{
foreach (T row in list)
{
i++;
sqlBuiler.Append($" update {tableName} Set ");
for (int j = 0; j < propertys_update.Count; j++)
{
if (j == propertys_update.Count - 1)
{
sqlBuiler.Append($"{propertys_update[j].Name}=@{propertys_update[j].Name}_{i} ");
}
else
{
sqlBuiler.Append($"{propertys_update[j].Name}=@{propertys_update[j].Name}_{i},");
}
cmd.Parameters.Add(new SqlParameter("@" + propertys_update[j].Name + "_" + i, propertys_update[j].GetValue(row)));
}
sqlBuiler.Append($" where {primaryKeyName}=@{primaryKeyName}_{i};");
cmd.Parameters.Add(new SqlParameter("@" + primaryKeyName + "_" + i, wherep.GetValue(row)));
if (i % onceNum == 0 || i == list.Count)
{
//执行sql
cmd.CommandText = sqlBuiler.ToString();
obj += cmd.ExecuteNonQuery();
sqlBuiler.Clear();
cmd.Parameters.Clear();
}
}
}
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw;
}
}
return obj;
}
/// <summary>
/// 批量修改,使用了事务
/// </summary>
/// <param name="connectString">数据库连接字符串</param>
/// <param name="dt">要修改的数据源</param>
/// <param name="tableName">要修改的表名</param>
/// <param name="primaryKeyName">修改时的条件字段,一般是按照主键修改比较多</param>
/// <param name="columns">要修改的字段名称
/// 如果为空则把dt中所有列和数据表字段对应,修改除条件列外的所有列,
/// 列明和数据库字段对应时不区分大小写</param>
/// <param name="onceNum">一次性提交的最大数量,因为参数有2100个的限制,所以批量时会分多次进行提交,onceNum设置每次提交的数量</param>
/// <returns></returns>
public static int BatchUpdate(string connectString, DataTable dt, string tableName, string primaryKeyName, string[] columns = null, int onceNum = 100)
{
if (dt == null || dt.Rows == null || dt.Rows.Count == 0) return 0;
int obj = 0;
StringBuilder sqlBuiler = new StringBuilder();
List<string> ufilds = new List<string>(); //所有要修改的字段
DataColumnCollection coll = dt.Columns;
string whereName = primaryKeyName;
string[] columnsLower = null;
if (columns!=null&& columns.Length>0)
{
columnsLower = string.Join(",", columns).ToLower().Split(',');
}
foreach (DataColumn item in coll)
{
if (item.ColumnName.ToLower() != primaryKeyName.ToLower())
{
if (columnsLower!=null&& columnsLower.Length>0)
{
if (columnsLower.Contains(item.ColumnName.ToLower()))
{
ufilds.Add(item.ColumnName);
}
}
else
{
ufilds.Add(item.ColumnName);
}
}
else
{
whereName = item.ColumnName;
}
}
if (ufilds == null || ufilds.Count == 0)
{
return 0;
}
int i = 0;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
SqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
using (SqlCommand cmd = new SqlCommand(sqlBuiler.ToString(), conn, tran))
{
foreach (DataRow row in dt.Rows)
{
i++;
sqlBuiler.Append($" update {tableName} Set ");
for (int j = 0; j < ufilds.Count; j++)
{
if (j == ufilds.Count - 1)
{
sqlBuiler.Append($"{ufilds[j]}=@{ufilds[j]}_{i} ");
}
else
{
sqlBuiler.Append($"{ufilds[j]}=@{ufilds[j]}_{i},");
}
cmd.Parameters.Add(new SqlParameter("@" + ufilds[j] + "_" + i, row[ufilds[j]]));
}
sqlBuiler.Append($" where {primaryKeyName}=@{primaryKeyName}_{i};");
cmd.Parameters.Add(new SqlParameter("@" + primaryKeyName + "_" + i, row[whereName]));
if (i % onceNum == 0 || i == dt.Rows.Count)
{
cmd.CommandText = sqlBuiler.ToString();
obj += cmd.ExecuteNonQuery();
sqlBuiler.Clear();
cmd.Parameters.Clear();
}
}
}
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw;
}
}
return obj;
}
//==========================方法实现================================
#region SqlScalar
/// <summary>
/// 返回查询结果的第一行第一列
/// </summary>
/// <param name="connectString">数据库连接串</param>
/// <param name="sql">sql语句,或者存储过程名称</param>
/// <param name="commandType">sql语句</param>
/// <returns></returns>
private static Object SqlScalar(string connectString, string sql, int commandType = 1)
{
object obj = null;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
obj = cmd.ExecuteScalar();
}
}
return obj;
}
/// <summary>
/// 返回查询结果的第一行第一列
/// </summary>
/// <param name="connectString">数据库连接串</param>
/// <param name="sql">sql语句</param>
/// <param name="parms">参数</param>
/// <returns></returns>
private static Object SqlScalar(string connectString, string sql, object parms, int commandType = 1)
{
List<SqlParameter> parmList = GetSqlCommandParams(parms);
object obj = null;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
if (parmList != null)
{
cmd.Parameters.AddRange(parmList.ToArray());
}
obj = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
}
return obj;
}
#endregion
#region SqlExecute
/// <summary>
/// 返回影响数据库的条数
/// </summary>
/// <param name="connectString">数据库连接串</param>
/// <param name="sql">要执行的sql</param>
/// <returns></returns>
private static int SqlExecute(string connectString, string sql, int commandType = 1)
{
int obj = 0;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
obj = cmd.ExecuteNonQuery();
}
}
return obj;
}
private static int SqlExecute(string connectString, string sql, object parms, int commandType = 1)
{
List<SqlParameter> parmList = GetSqlCommandParams(parms);
int obj = 0;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
if (parmList != null)
{
cmd.Parameters.AddRange(parmList.ToArray());
}
obj = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
}
return obj;
}
#endregion
#region SqlSingle
/// <summary>
/// 返回查询结果的第一行
/// </summary>
/// <typeparam name="T">要返回的类型</typeparam>
/// <param name="connectString">数据库连接串</param>
/// <param name="sql">要执行的sql</param>
/// <returns></returns>
private static T SqlSingle<T>(string connectString, string sql, int commandType = 1)
{
T obj = default(T);
Type t = typeof(T);
Assembly ass = t.Assembly;
PropertyInfo p = null;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr != null)
{
Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
while (dr.Read())
{
obj = (T)ass.CreateInstance(t.FullName);
if (propertysDic != null && propertysDic.Count > 0)
{
foreach (var key in propertysDic.Keys)
{
p = propertysDic[key];
p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
}
}
break;
}
}
}
}
}
return obj;
}
private static T SqlSingle<T>(string connectString, string sql, object parms, int commandType = 1)
{
List<SqlParameter> parmList = GetSqlCommandParams(parms);
T obj = default(T);
Type t = typeof(T);
Assembly ass = t.Assembly;
PropertyInfo p = null;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
if (parmList != null)
{
cmd.Parameters.AddRange(parmList.ToArray());
}
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr != null)
{
Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
while (dr.Read())
{
obj = (T)ass.CreateInstance(t.FullName);
if (propertysDic != null && propertysDic.Count > 0)
{
foreach (var key in propertysDic.Keys)
{
p = propertysDic[key];
p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
}
}
break;
}
}
}
cmd.Parameters.Clear();
}
}
return obj;
}
#endregion
#region SqlList
/// <summary>
/// 返回列表集合
/// </summary>
/// <typeparam name="T">要返回的对象类型</typeparam>
/// <param name="connectString">数据库连接串</param>
/// <param name="sql">要执行的sql</param>
/// <returns></returns>
private static List<T> SqlList<T>(string connectString, string sql, int commandType = 1)
{
List<T> list = new List<T>();
Type t = typeof(T);
Assembly ass = t.Assembly;
PropertyInfo p = null;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr != null)
{
Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
while (dr.Read())
{
T obj = default(T);
obj = (T)ass.CreateInstance(t.FullName);
if (propertysDic != null && propertysDic.Count > 0)
{
foreach (var key in propertysDic.Keys)
{
p = propertysDic[key];
p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
}
}
list.Add(obj);
}
}
}
}
}
return list;
}
/// <summary>
/// 返回列表集合
/// </summary>
/// <typeparam name="T">要返回的对象类型</typeparam>
/// <param name="connectString">数据库连接串</param>
/// <param name="sql">要执行的sql</param>
/// <param name="parms">sql中用到的参数</param>
/// <returns></returns>
private static List<T> SqlList<T>(string connectString, string sql, object parms, int commandType = 1)
{
List<SqlParameter> parmList = GetSqlCommandParams(parms);
List<T> list = new List<T>();
Type t = typeof(T);
Assembly ass = t.Assembly;
PropertyInfo p = null;
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
if (parmList != null)
{
cmd.Parameters.AddRange(parmList.ToArray());
}
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr != null)
{
Dictionary<string, PropertyInfo> propertysDic = GetFiles<T>(dr);
while (dr.Read())
{
T obj = default(T);
obj = (T)ass.CreateInstance(t.FullName);
if (propertysDic != null && propertysDic.Count > 0)
{
foreach (var key in propertysDic.Keys)
{
p = propertysDic[key];
p.SetValue(obj, SqllHelper.ChangeType(dr[key], p.PropertyType));
}
}
list.Add(obj);
}
}
}
cmd.Parameters.Clear();
}
}
return list;
}
#endregion
#region SqlDataTable
private static DataTable SqlDataTable(string connectString, string sql, int commandType = 1)
{
DataTable dt = null;
DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(ds);
}
}
}
if (ds != null && ds.Tables != null && ds.Tables.Count > 0)
{
dt = ds.Tables[0];
}
return dt;
}
private static DataTable SqlDataTable(string connectString, string sql, object parms, int commandType = 1)
{
List<SqlParameter> parmList = GetSqlCommandParams(parms);
DataTable dt = null;
DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(connectString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (commandType == 1)
{
cmd.CommandType = CommandType.Text;
}
else
{
cmd.CommandType = CommandType.StoredProcedure;
}
if (parmList != null)
{
cmd.Parameters.AddRange(parmList.ToArray());
}
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(ds);
}
}
}
if (ds != null && ds.Tables != null && ds.Tables.Count > 0)
{
dt = ds.Tables[0];
}
return dt;
}
#endregion
#region BatchInsert
/// <summary>
/// 批插入
/// </summary>
/// <param name="connectString"></param>
/// <param name="tableName"></param>
/// <param name="dt">数据源的各列名称必须和数据表保持一致才行,且区分大小写</param>
private static void BatchInsertImpl(string connectString, DataTable dt, string tableName)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using (SqlConnection conn = new SqlConnection(connectString))
{
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
{
bulkcopy.DestinationTableName = tableName;
bulkcopy.BatchSize = dt.Rows.Count;
foreach (DataColumn item in dt.Columns)
{
//设置要插入的字段映射,映射了哪个插入哪个,而且区分大小写
bulkcopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(item.ColumnName, item.ColumnName));
}
conn.Open();
if (dt != null && dt.Rows.Count > 0)
{
bulkcopy.WriteToServer(dt);
}
}
long time = watch.ElapsedMilliseconds;
}
}
#endregion
#region GetSqlCommandParams
/// <summary>
/// 获取sqlcommand参数
/// </summary>
/// <param name="parms"></param>
/// <returns></returns>
private static List<SqlParameter> GetSqlCommandParams(object parms)
{
List<SqlParameter> parmList = null;
PropertyInfo[] propertys = parms.GetType().GetProperties();
if (propertys != null && propertys.Length > 0)
{
parmList = new List<SqlParameter>();
foreach (var item in propertys)
{
if (!item.CanRead)
{
continue;
}
parmList.Add(new SqlParameter("@" + item.Name, item.GetValue(parms)));
}
}
return parmList;
}
#endregion
#region GetFiles
/// <summary>
/// 获取泛型中的类型属性和数据库datareder中的属性共有部分
/// </summary>
/// <typeparam name="T">要返回的类型</typeparam>
/// <param name="reader">SqlDataReader</param>
/// <returns></returns>
private static Dictionary<string, PropertyInfo> GetFiles<T>(SqlDataReader reader)
{
Dictionary<string, PropertyInfo> result = new Dictionary<string, PropertyInfo>();
int cloumFiles = reader == null ? 0 : reader.FieldCount;
Type t = typeof(T);
PropertyInfo[] propertys = t.GetProperties();
if (propertys != null && cloumFiles > 0)
{
List<string> readerFilesList = new List<string>(); //存储当前reader中的所有列名称
for (int i = 0; i < cloumFiles; i++)
{
readerFilesList.Add(reader.GetName(i).ToLower());
}
//取reder中和T类型中都有属性
List<PropertyInfo> resultList = propertys.Where(s => s.CanRead && readerFilesList.Contains(s.Name.ToLower())).ToList();
if (resultList != null && resultList.Count > 0)
{
foreach (var item in resultList)
{
result.Add(item.Name, item);
}
}
}
return result;
}
#endregion
#region ChangeType
/// <summary>
/// 将数据库中查询出来的值转化为T类型中想要的类型,这样避免直接赋值object类型装箱时的性能消耗
/// </summary>
/// <param name="value">数据库中查出来的value值</param>
/// <param name="type">要转化的类型</param>
/// <returns></returns>
private static object ChangeType(object value, Type type)
{
if (type.FullName == typeof(string).FullName)
{
return Convert.ChangeType(Convert.IsDBNull(value) ? null : value, type);
}
if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
NullableConverter convertor = new NullableConverter(type);
return Convert.IsDBNull(value) ? null : convertor.ConvertFrom(value);
}
return Convert.IsDBNull(value) ? null : value;
}
#endregion
#region GetBatchInsertDataTable
private static DataTable GetBatchInsertDataTable<T>(string connectString, List<T> list, string tableName)
{
string[] columns = null;
List<SpColumnsEntity> addafter = new List<SpColumnsEntity>();
List<SpColumnsEntity> columns_table = ProList<SpColumnsEntity>(connectString, "sp_columns", new { table_name = tableName });
if (columns_table == null || columns_table.Count == 0) return null;
columns = columns_table.Select(s => s.Column_Name).ToArray();
if (columns == null || columns.Length == 0) return null;
DataTable dt = new DataTable();
Type t = typeof(T);
PropertyInfo[] propertys = t.GetProperties();
foreach (var item in propertys)
{
string[] c_table_list = columns.Where(s => s.ToUpper() == item.Name.ToUpper()).ToArray();
if (c_table_list != null && c_table_list.Length > 0)
{
dt.Columns.Add(c_table_list[0]);
}
}
foreach (var item in list)
{
ArrayList tempList = new ArrayList();
foreach (var p in propertys)
{
string[] c_table_list = columns.Where(s => s.ToUpper() == p.Name.ToUpper()).ToArray();
if (c_table_list != null && c_table_list.Length > 0)
{
object obj = p.GetValue(item);
tempList.Add(obj);
}
}
dt.LoadDataRow(tempList.ToArray(), true);
}
return dt;
}
#endregion
}
public class SpColumnsEntity
{
/// <summary>
/// 列名
/// </summary>
public string Column_Name { set; get; }
/// <summary>
/// 列对应的位置
/// </summary>
public int Ordinal_Position { set; get; }
}
}