You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

333 lines
11 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
简介:负责存取数据的类
创建时间2002-10
最后修改时间2002-10
*/
using System;
using System.Data;
using System.Diagnostics;
using System.Configuration;
using System.Data.SqlClient;
using System.Collections;
using System.Collections.Specialized;
using System.Web;
using BP.DA;
using BP.Pub;
using BP.Sys;
namespace BP.En
{
public class EntityDBAccess
{
#region 对实体的基本操作
/// <summary>
/// 删除
/// </summary>
/// <param name="en"></param>
/// <returns></returns>
public static int Delete(Entity en)
{
if (en.EnMap.EnType == EnType.View)
return 0;
switch (en.EnMap.EnDBUrl.DBUrlType)
{
case DBUrlType.AppCenterDSN:
return DBAccess.RunSQL(en.SQLCache.Delete, SqlBuilder.GenerParasPK(en));
default:
throw new Exception("@没有设置类型。");
}
}
/// <summary>
/// 更新
/// </summary>
/// <param name="en">产生要更新的语句</param>
/// <param name="keys">要更新的属性(null,认为更新全部)</param>
/// <returns>sql</returns>
public static int Update(Entity en, string[] keys)
{
if (en.EnMap.EnType == EnType.View)
return 0;
Paras paras = SqlBuilder.GenerParas(en, keys);
string sql = en.SQLCache.GetUpdateSQL(en, keys);
try
{
switch (en.EnMap.EnDBUrl.DBUrlType)
{
case DBUrlType.AppCenterDSN:
switch (BP.Difference.SystemConfig.AppCenterDBType)
{
case DBType.MSSQL:
case DBType.Oracle:
case DBType.MySQL:
case DBType.PostgreSQL:
case DBType.UX:
case DBType.KingBaseR3:
case DBType.KingBaseR6:
return DBAccess.RunSQL(sql, paras);
default:
//return DBAccess.RunSQL(en.SQLCache.GetUpdateSQL(en, keys),
// SqlBuilder.GenerParas(en, keys));
if (keys != null)
{
Paras ps = new Paras();
Paras myps = SqlBuilder.GenerParas(en, keys);
foreach (Para p in myps)
{
foreach (string s in keys)
{
if (s == p.ParaName)
{
ps.Add(p);
break;
}
}
}
return DBAccess.RunSQL(en.SQLCache.GetUpdateSQL(en, keys), ps);
}
else
{
return DBAccess.RunSQL(en.SQLCache.GetUpdateSQL(en, keys),
SqlBuilder.GenerParas(en, keys));
}
break;
}
//case DBUrlType.DBAccessOfMSSQL1:
// return DBAccessOfMSSQL1.RunSQL(SqlBuilder.Update(en, keys));
//case DBUrlType.DBAccessOfMSSQL2:
// return DBAccessOfMSSQL2.RunSQL(SqlBuilder.Update(en, keys));
//case DBUrlType.DBAccessOfOracle1:
// return DBAccessOfOracle1.RunSQL(SqlBuilder.Update(en, keys));
//case DBUrlType.DBAccessOfOracle2:
// return DBAccessOfOracle2.RunSQL(SqlBuilder.Update(en, keys));
default:
throw new Exception("@没有设置类型。");
}
}
catch (Exception ex)
{
if (BP.Difference.SystemConfig.isDebug)
en.CheckPhysicsTable();
throw ex;
}
}
#endregion
#region 产生序列号码方法
#endregion
public static int RetrieveV2(Entity en, string sql, Paras paras)
{
try
{
DataTable dt = new DataTable();
switch (en.EnMap.EnDBUrl.DBUrlType)
{
case DBUrlType.AppCenterDSN:
dt = DBAccess.RunSQLReturnTable(sql, paras);
break;
default:
throw new Exception("@没有设置DB类型。");
}
if (dt.Rows.Count == 0)
return 0;
Attrs attrs = en.EnMap.Attrs;
EntityDBAccess.fullDate(dt, en, attrs);
int i = dt.Rows.Count;
dt.Dispose();
return i;
}
catch (System.Exception ex)
{
throw ex;
}
}
public static int Retrieve(Entity en, string sql, Paras paras)
{
DataTable dt;
switch (en.EnMap.EnDBUrl.DBUrlType)
{
case DBUrlType.AppCenterDSN:
dt = DBAccess.RunSQLReturnTable(sql, paras);
break;
default:
throw new Exception("@没有设置DB类型。");
}
if (dt.Rows.Count == 0)
return 0;
Attrs attrs = en.EnMap.Attrs;
EntityDBAccess.fullDate(dt, en, attrs);
int num = dt.Rows.Count;
dt.Dispose();
return num;
}
/// <summary>
/// 查询
/// </summary>
/// <param name="en">实体</param>
/// <param name="sql">组织的查询语句</param>
/// <returns></returns>
public static int Retrieve(Entity en, string sql)
{
try
{
DataTable dt = new DataTable();
switch (en.EnMap.EnDBUrl.DBUrlType)
{
case DBUrlType.AppCenterDSN:
dt = DBAccess.RunSQLReturnTable(sql);
break;
default:
throw new Exception("@没有设置DB类型。");
}
if (dt.Rows.Count == 0)
return 0;
Attrs attrs = en.EnMap.Attrs;
EntityDBAccess.fullDate(dt, en, attrs);
int i = dt.Rows.Count;
dt.Dispose();
return i;
}
catch (System.Exception ex)
{
throw ex;
}
}
private static void fullDate(DataTable dt, Entity en, Attrs attrs)
{
//判断是否加密.
if (en.EnMap.ItIsJM == false)
{
string parafields = en.EnMap.ParaFields;
if (parafields == null)
{
foreach (Attr attr in attrs)
{
en.Row.SetValByKey(attr.Key, dt.Rows[0][attr.Key]);
}
return;
}
if (dt.Columns.Contains("AtPara") == false)
throw new Exception("err@实体类[" + en.EnMap.EnDesc + "_" + en.ToString() + "] 缺少AtPara字段.");
AtPara ap = new AtPara(dt.Rows[0]["AtPara"].ToString());
foreach (Attr attr in attrs)
{
//如果是参数字段.
if (parafields.Contains(attr.Key + ",") == true)
{
en.Row.SetValByKey(attr.Key, ap.GetValStrByKey(attr.Key));
continue;
}
//判断枚举字段是否是参数字段.
if (attr.ItIsRefAttr == true && dt.Columns.Contains(attr.Key) == false)
{
string key = attr.Key.Replace("Text", "");
Attr enumAttr = attrs.GetAttrByKey(key);
AtPara apcfg = new AtPara(enumAttr.UITag);
string enumVal = en.Row[key].ToString();
en.Row.SetValByKey(attr.Key, apcfg.GetValStrByKey(enumVal));
continue;
}
en.Row.SetValByKey(attr.Key, dt.Rows[0][attr.Key]);
}
return;
}
//执行解密.
foreach (Attr attr in attrs)
{
object val = dt.Rows[0][attr.Key];
if (attr.ItIsPK == false && attr.MyDataType == DataType.AppString)
val = val;
en.Row.SetValByKey(attr.Key, val);
}
}
public static int Retrieve(Entities ens, string sql)
{
try
{
DataTable dt = new DataTable();
switch (ens.GetNewEntity.EnMap.EnDBUrl.DBUrlType)
{
case DBUrlType.AppCenterDSN:
dt = DBAccess.RunSQLReturnTable(sql);
break;
default:
throw new Exception("@没有设置DB类型。");
}
if (dt.Rows.Count == 0)
return 0;
Map enMap = ens.GetNewEntity.EnMap;
Attrs attrs = enMap.Attrs;
//Entity en1 = ens.GetNewEntity;
foreach (DataRow dr in dt.Rows)
{
Entity en = ens.GetNewEntity;
//Entity en = en1.CreateInstance();
foreach (Attr attr in attrs)
{
en.Row.SetValByKey(attr.Key, dr[attr.Key]);
}
ens.AddEntity(en);
}
int i = dt.Rows.Count;
dt.Dispose();
return i;
//return dt.Rows.Count;
}
catch (System.Exception ex)
{
// ens.GetNewEntity.CheckPhysicsTable();
throw new Exception("@在[" + ens.GetNewEntity.EnDesc + "]查询时出现错误:" + ex.Message);
}
}
public static int Retrieve(Entities ens, string sql, Paras paras, string[] fullAttrs)
{
DataTable dt = null;
switch (ens.GetNewEntity.EnMap.EnDBUrl.DBUrlType)
{
case DBUrlType.AppCenterDSN:
dt = DBAccess.RunSQLReturnTable(sql, paras);
break;
default:
throw new Exception("@没有设置DB类型。");
}
if (dt.Rows.Count == 0)
return 0;
//设置查询.
QueryObject.InitEntitiesByDataTable(ens, dt, fullAttrs);
int i = dt.Rows.Count;
dt.Dispose();
return i;
//return dt.Rows.Count;
}
}
}