ug/nx 二次开发(c#) access数据库表的操作_marcopro的博客-爱代码爱编程
本人是资深C# Web开发从业者,今天同事跟我提了一个小小的需求,因为他是设计出身半路出家做二次开发,业务很熟但是开发基础薄弱。
他的需求如下:
1、一次获取access数据库所有表数据dataset
2、写一个方法,传入表名返回表数据datatable(这个需求可能是因为同事不会写sql语句)
一、先上第一个需求的源码:
public static DataSet GetData()
{
string mdbPath = @"D:\NXOPEN\application\Common\PARAM-NG\Dbs\Mould\Lkm\Lkm.mdb";
SlqHelper helper = new SlqHelper();
DataSet ds = helper.GetAllTable(mdbPath);
return ds;
}
/// <summary>
/// 一次获取access数据库所有表数据
/// </summary>
/// <param name="dbSource"></param>
/// <returns></returns>
public DataSet GetAllTable(string dbSource)
{
DataSet ds = new DataSet();
DataTable dtTableName = new DataTable();
string sqlStr = string.Format(@"SELECT MSysObjects.Name FROM MsysObjects WHERE (Left([Name],1)<>'{0}') AND (Left$([Name],4) <> '{1}') AND (MSysObjects.Type)=1", "~", "Msys");
dtTableName = GetDt(sqlStr, dbSource);
for(int i=0; i< dtTableName.Rows.Count; i++)
{
string tablename = dtTableName.Rows[i]["Name"].ToString();
DataTable dt = new DataTable(tablename);
dt = GetDtByTableName(tablename, dbSource);
dt.TableName = tablename;
ds.Tables.Add(dt.Copy());
}
return ds;
}
public DataTable GetDt(string sql, string dbSource)
{
ConStr = string.Format(ConStr, dbSource);
oleCon = new OleDbConnection(ConStr);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
OleDbDataAdapter oleDap = new OleDbDataAdapter(sql, oleCon);
oleDap.Fill(ds, "table");
dt = ds.Tables[0];
return dt;
}
/// <summary>
/// 根据access数据库文件和表名,获取表数据
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="dbSource">数据库文件地址</param>
/// <returns></returns>
public DataTable GetDtByTableName(string tableName, string dbSource)
{
ConStr = string.Format(ConStr, dbSource);
oleCon = new OleDbConnection(ConStr);
string sql = string.Format("select * from {0}",tableName);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
OleDbDataAdapter oleDap = new OleDbDataAdapter(sql, oleCon);
oleDap.Fill(ds, "table");
dt = ds.Tables[0];
return dt;
}
大概思路如下:
1)链接access数据库,获取所有表名
2)根据表名获取每张表数据
3)把表数据塞进dataset,并返回需要的数据
点评:一次获取所有表数据,如果db比较小跑起来还是没问题的,万一db数据量比较大,内存瞬间崩溃。所以我推荐他用下面的方法,需要哪张表数据,根据表名去拿就好。
二、第二个需求的源码如下:
/// <summary>
/// 根据access数据库文件和表名,获取表数据
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="dbSource">数据库文件地址</param>
/// <returns></returns>
public DataTable GetDtByTableName(string tableName, string dbSource)
{
ConStr = string.Format(ConStr, dbSource);
oleCon = new OleDbConnection(ConStr);
string sql = string.Format("select * from {0}",tableName);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
OleDbDataAdapter oleDap = new OleDbDataAdapter(sql, oleCon);
oleDap.Fill(ds, "table");
dt = ds.Tables[0];
return dt;
}
三、个人建议,还是用sql比较方便,灵活,也把基本代码贴出来供大家参考
/// <summary>
/// 获取表数据demo
/// </summary>
/// <returns></returns>
public static DataTable GetDataDemo()
{
string sql = "select * from Materials;select * from Materials;";
string mdbPath = @"D:\NXOPEN\application\Common\PARAM-NG\Materials.mdb";
SlqHelper helper = new SlqHelper(mdbPath);
DataTable dt = helper.GetDt(sql);
return dt;
}