分享两个PB移植到.NET的类,支持把PB代码复制到.NET里使用(1)
2014-11-07 11:33
507 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace LanTian.LIB { public sealed class DataTableChild { public DataTable DataTables; /// <summary> /// 引入了这个,是希望在setfilter之后,还能找回最原始最全的数据源。 /// 所以会在第一次setfilter前,对这个赋值 /// </summary> public DataTable DataTablesOriginal; DataSource.Fees_his_yb fe = new DataSource.Fees_his_yb(); public static implicit operator DataTableChild(DataTable datatable) { DataTableChild item = new DataTableChild(); item.DataTables = datatable; return item; } #region Instance Various private SqlConnection _Connection; private SqlParameter[] meter; /// <summary> /// 给datatablechild提供sql语句 /// </summary> /// <param name="TSQL"></param> public string dataobject { get; set; } public SqlParameter[] SqlParameters = null; #endregion //Instance Various #region retrieve /// <summary> /// 其实这个没什么用,真要retrieve的话,是要fill的 /// </summary> /// <param name="meter"></param> public void retrieve(SqlParameter[] meter) { SqlParameters = meter; } #endregion //retrieve #region GetItemValues public string getitemstring(int RowIndex, string columnname) { try { return DataTables.Rows[RowIndex - 1][columnname].ToString();//允许返回空值"" } catch { return null; } } /// <summary> /// 获取某行某列的int类型数据 /// </summary> /// <param name="RowIndex">行数,起始为1</param> /// <param name="columnname">列名</param> /// <returns>返回int类型,没有数据则为null</returns> public int? getitemnumber(int RowIndex, string columnname) { try { int Default = 0; if (int.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out Default)) { return int.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } else return null; } catch (Exception ex) { return null; } } /// <summary> /// 因为有时候取了值不一定会判断是不是空,即肯定有值 /// </summary> /// <param name="RowIndex"></param> /// <param name="columnname"></param> /// <returns></returns> public int getitemnumberN(int RowIndex, string columnname) { return int.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } public double getitemdoubleN(int RowIndex, string columnname) { return double.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } public double? getitemdouble(int RowIndex, string columnname) { try { double Default = 0; if (double.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out Default)) { return double.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } else return null; } catch (Exception ex) { return null; } } /// <summary> /// 获取某行某列的datetime类型数据 /// </summary> /// <param name="RowIndex">行数,起始为1</param> /// <param name="columnname">列名</param> /// <returns>返回datetime类型,转换失败则为null</returns> public DateTime? getitemdatetime(int RowIndex, string columnname) { DateTime dtime = DateTime.Now; if (DateTime.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out dtime)) { return DateTime.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } else return null; } public DateTime getitemdatetimeN(int RowIndex, string columnname) { return DateTime.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } /// <summary> /// 获取某行某列的Decimal类型数据 /// </summary> /// <param name="RowIndex">行数,起始为1</param> /// <param name="columnname">列名</param> /// <returns>返回decimal类型,转换失败则为null</returns> public Decimal? getitemdecimal(int RowIndex, string columnname) { decimal Default = 0; if (decimal.TryParse(DataTables.Rows[RowIndex - 1][columnname].ToString(), out Default)) { return decimal.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } else return null; } public Decimal getitemdecimalN(int RowIndex, string columnname) { return decimal.Parse(DataTables.Rows[RowIndex - 1][columnname].ToString()); } #endregion //GetItemValues #region 解除约束 bool IsFirst = true; private void AllowDBNULL() { if (IsFirst) { foreach (DataColumn dc in DataTables.Columns) { dc.AllowDBNull = true;//有些如autonumb的字段不允许为空,所以遍历一下, 都允许为空先 dc.ReadOnly = false; // dc.Unique = false;//去掉唯一约束 } IsFirst = false; } } #endregion //解除约束 #region insertrow /// <summary> /// 插入行,返回新行所在的行数 /// </summary> /// <param name="RowIndex"></param> /// <returns></returns> public int insertrow() { AllowDBNULL(); DataTables.Rows.Add(); return DataTables.Rows.Count;// 在setitem的时候已经减去了1 } #endregion //insertrow #region deleterow //这个deleterow和pb不同, //pb的是先find出行号,然后deleterow(行号) //在.net里,可以做成省去了行号,而直接deleterow(条件) //调用实例 dtc.deleterow("autonumb=53"); public void deleterow(string expression) { DataRow[] dr = DataTables.Select(expression); if (dr.Length > 0) { for (int i = 0; i < dr.Length; i++) { DataTables.Rows.Remove(dr[i]); } } } #endregion //deleterow #region setitem public void setitem(int RowIndex, string columnname, object values) { AllowDBNULL(); if (DataTables.Rows.Count < 1) this.DataTables.Rows.Add(); DataTables.Rows[RowIndex - 1][columnname] = values; } #endregion //setitem #region 属性 /// <summary> /// 没有CurrentRow的概念,默认返回第一行先 /// </summary> /// <returns></returns> public int getrow() { return 1; } public int rowcount() { return DataTables.Rows.Count; } #endregion #region setfilter /// <summary> /// 1.可以直接用l_da2=l_da2.setfilter(条件); /// 如果想获取回最原始的数据源 /// l_da2=l_da2.DataTablesOriginal即可 /// 2.也可new一个datatable来存放 /// </summary> /// <param name="Filter"></param> /// <returns></returns> public DataTable setfilter(string Filter) { DataTable dt_cache = DataTables.Clone(); DataTablesOriginal = DataTables; DataRow[] dr = DataTables.Select(Filter); foreach (DataRow row in dr) { dt_cache.ImportRow(row); } return dt_cache; } #endregion //setfilter #region settransobject public void settransobject(SqlConnection sqlc) { _Connection = sqlc; } #endregion //settransobject #region Destroy public void Destroy() { DataTables.Dispose(); } #endregion //Destroy #region find /// <summary> /// /// </summary> /// <param name="expression">一个字符串,用于指定要查找的条件。其值是个逻辑表达式,表达式中可以使用列名。</param> /// <param name="Start">一个长整数,用于指明从哪一行开始查找,该参数可以大于数据的总行数</param> /// <param name="End">一个长整数,用于指明查找到哪一行结束查找。该参数可以大于数据的总行数。如果想从后向前查找,那么让end参数的值小于start参数即可。</param> /// <returns>返回指定范围内满足查找条件的第一个数据行的行号。如果未找到满足条件的行,则函数返回0;出错时返回负值。</returns> public int find(string expression, int Start, int End) { //暂时没找到找出datatable符合条件数据行的行号,就先完成>0则满足,=0不满足和出错负值先 //后面两个整型参数是为了和pb代码对应 return find(expression); } public int find(string expression) { try { DataRow[] dr = DataTables.Select(expression); if (dr.Length > 0) return dr.Length; else return 0; } catch { return -1; } } #endregion //find #region setsort //===pb的代码是这样调用的 // l_da.setsort( "nClinReciInfo_recitype , Serial") //坦洲不按组号排序 // l_da.sort( ) /// <summary> /// 根据两个列名升序排序 /// 调用实例: dtc.setsort("autonumb","mediid"); /// </summary> /// <param name="columnname"></param> /// <param name="columnname2"></param> public void setsort(string columnname, string columnname2) { DataView dv = DataTables.DefaultView; dv.Sort = columnname + "," + columnname2 + " asc"; DataTables = dv.ToTable(); } /// <summary> /// 根据列名升序 /// 调用实例: dtc.setsort("mediid"); /// </summary> /// <param name="columnname"></param> public void setsort(string columnname) { DataView dv = DataTables.DefaultView; dv.Sort = columnname + " asc"; DataTables = dv.ToTable(); } #endregion//sort #region Describe统计 /// <summary> /// 统计 ///pb代码 l_da.Describe("evaluate('sum(itemamou)',1)") ///public object Compute(string strExpression,string strFilter) ///调用实例: MessageBox.Show(dtc.Describe("sum(mediid)").ToString()); /// </summary> /// <returns></returns> public object Describe(string strExpression) { string returns= DataTables.Compute(strExpression, "true").ToString(); if (returns == null || returns == "") return 0; else return DataTables.Compute(strExpression, "true"); } #endregion //Describe统计 #region rowscopy //==============PB调用rowscopy实例 // if l_da2.rowscopy(1, 1, primary!, dw_4, 1, primary!) = -1 then // messagebox("提示", "复制处方头失败!") //end if //dw_1.rowscopy(1,dw_1.rowcount(),Primary!,dw_2,1,primary!) //以上语句实现dw_1的数据复制到dw_2中去,从dw_2的第一行开始。 // 语法: //dwcontrol.RowsCopy (startrow, endrow, copybuffer, targetdw, beforerow,targetbuffer ) //参数:dwcontrol 数据窗口控件名 //startrow long 类型指定要复制的数据行的起始行号 //endrow long 类型指定要复制的数据行的终止行号 //copybuffer dwBuffer 枚举类型,指定从哪个缓冲区中复制行。有效取值为 //Primary! 主缓冲区 //Delete! 删除缓冲区 //Filter! 过滤缓冲区 /// <summary> /// 把行复制到datatable里,需要注意目标datatable的表结构和源一样 /// 调用实例 /// DataTable dt=dtc.DataTables.Clone(); /// dtc.rowscopy(1, 4, dt); /// dataGridView2.DataSource = dt; /// </summary> /// <param name="startrow">开始行数,遵从pb代码,从1开始</param> /// <param name="endrow">结束行数,遵从pb代码</param> /// <param name="dt">目标datatable</param> /// <returns>1表示复制成功 -1表示复制失败</returns> public int rowscopy(int startrow,int endrow,DataTable dt) { try { for (int i = startrow; i < endrow + 1; i++) { dt.ImportRow(DataTables.Rows[i - 1]); } return 1; } catch { return -1; } } public int rowscopy(int startrow, int endrow, DataTableChild dt) { try { for (int i = startrow; i <= endrow+1; i++) { dt.DataTables.ImportRow(DataTables.Rows[i - 1]); } return 1; } catch { return -1; } } #endregion //rowscopy #region reset public void reset() { if(DataTables!=null) DataTables.Clear(); //DataTables.Reset(); } #endregion //reset } }
相关文章推荐
- 分享两个PB移植到.NET的类,支持把PB代码复制到.NET里使用(2)
- 分享.NET开发中经常使用到的代码片段 完全从实际项目中提取出来,也可被反反复复的重复借用
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 避免使用终结器,避免大对象,避免复制缓冲区
- 【分享】发两个关于.net反混淆未完的代码,半年多没动了,以后也可能不再玩儿.net了,共享出来供交流
- PB调用.NET代码的两个入口函数
- 使用 SqlBulkCopy 大量复制文字文件之 C# 程序代码
- 使用最短代码交换两个int数
- 如何在VB中操作EXCEL(一段代码,两个可以使用的过程)
- 如何在VB中操作EXCEL(一段代码,两个可以使用的过程)
- GemBox.ExcelLite破解版,可以在没有安装Office的情况,使用.net代码操作Excel文件
- 复制到剪贴板的js代码,FF不支持剪贴版
- 使用DES对称加密代码,支持中文
- 使用SOS - 在Visual Studio中启用非托管代码调试来支持本机代码调试
- 使用DES对称加密代码,支持中文
- .Net中使用带返回值的存储过程(VB代码)
- PB,同时使用打印机的两个纸盒
- 单元测试-使用nmock测试你的.NET代码(2)
- 使用PB调用API自动更新(非FTP模式)(七、下载代码)
- 不使用IA,在.NET代码中调用Office
- 使用 SqlBulkCopy 大量复制文字文件之 C# 程序代码