Foxtable(狐表)用户栏目专家坐堂 → 【碾作尘】狐表中的数据工厂模式,支持MySql、SQLite


  共有4093人关注过本帖树形打印复制链接

主题:【碾作尘】狐表中的数据工厂模式,支持MySql、SQLite

帅哥,在线噢!
wangjian6931
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:899 积分:5489 威望:0 精华:0 注册:2014/6/2 20:54:00
【碾作尘】狐表中的数据工厂模式,支持MySql、SQLite  发帖心情 Post By:2018/8/21 11:32:00 [只看该作者]

现在狐表中可以有数据工厂模式了,理论上可以让狐表可以支持市面上所有常用数据库(得有相应的.Net DataProvider,目前支持Access、SqlServer、Oracle、MySql、SQLite这5种数据库)

1.AccessDatabase、SqlServerDatabase、OracleDatabase、MySqlDatabase、SQLiteDatabase分别都采用了不同的DataProvider,有针对性的DataProvider可以提供更好的性能。

2.用了统一的接口,所有数据库的使用方法都一致。

3.后期如果有需要添加新的数据库支持的话,只需要针对接口再添加一个类就可以了。

4.只需要了解DataFactory一个类跟IDatabase一个接口就好,其他的类只需要知道与这两个类的关系就好。

5.为了可以让这个模块后期可以使用到更多的地方去,这里所有涉及的Datatable都是指的是System.Data.Datatable。这个类跟狐表的Datatable还是有一点区别的

6.只有在数据加载与数据保存时与狐表本身的方式有区别,真正加载完数据后,正常的编辑操作就是采用狐表默认的方式。

7.添加了好多集成的功能,让数据操作非常简单。

8.高性能的批量插入数据到SQLServer功能。

9.视图编辑功能。

10.简单的设计,就可以让Oracle变相地支持自增长列。

11.注释完备,配合我的代码编辑器使用进行开发,可以实时地得到智能提示,与参数说明。

12.帮助文档详细,具备各种场景的示例。


注意点:

1.只有狐表2018年7月28日以后的版本才支持,因为之前的狐表老版本有一个BUG,无法正确显示修改状态。

2.表中AfterLoad跟BeforeLoad事件失效。


回复可以查看示例项目、详细介绍及API帮助文档。有需要的可以联系本人:QQ443100019


以下内容只有回复后才可以浏览



[此贴子已经被作者于2018/8/21 17:02:46编辑过]

 回到顶部
帅哥,在线噢!
wangjian6931
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:899 积分:5489 威望:0 精华:0 注册:2014/6/2 20:54:00
  发帖心情 Post By:2018/8/21 11:33:00 [只看该作者]

起因:

    我们都知道,狐表目前宣称支持的数据库也只有三种:Access、SqlServer、Oracle。正常情况下,这满足了大多数人的需求。可是还是有相当一部分人想用狐表,可是因为狐表不支持其他比较常用的数据库而比较烦恼(比如说MySql、SQLite、DB2等等),甚至有些人因为这个原因选择了放弃狐表。也有相当一部分狐友曾经向官方提议让官方支持多数据源,可是这么多年过去了,什么都没有改变……

    难道使用狐表就真的没有办法使用其他数据源吗?经验告诉我们,不应该是这样的。经过一段时间的研究,针对狐表开发的数据工厂模块终于开发完成啦!

什么是数据工厂:

    从网上找了一段说明:提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。这看起来有点摸不着头脑,我们结合实际来讲,就是我们先定义了一个IDatabase接口,然后分别实现了AccessDatabase、SqlServerDatabase、OracleDatabase、MySqlDatabase、SQLiteDatabase几个类。最后用一个数据工厂类DataFactory对所有数据库提供一个统一的数据访问与处理的入口。这样就实现一定程度上解耦。

有什么优势:

 

1.可扩展性强:后期如果有需要添加新的数据库支持的话,只需要针对接口再添加一个类就可以了。而前端编程代码无需作任何修改。

2.使用简单:因为使用了统一的接口,所有数据库的使用方法都一致。我们只需要掌握一套使用方法,就可以操作所有数据库了。

3.实现了狐表中所有常用的功能。接近完美的替代让使用者无后顾之忧。


如何使用DataFactory

1.首先要先引用sanMusoft.dll。

2.然后在全局代码里面声明一个全局变量<!--StartFragment-->

Public gs_dataFactory As New sanMuSoft.Data.DataFactory
3.添加一个数据源

gs_dataFactory.Add("MySql","server=192.168.1.2; port=3306; user id=root; password= 123;database=comerp;charset=utf8"<!--EndFragment-->,sanMuSoft.Data.SourceTypeEnum.MySql) '4如果最后一个参数不方便保存到数据库中的话,可以直接以Enum的值4代替sanMuSoft.Data.SourceTypeEnum.MySql.
 
4.在代码块中使用DataFactory对各种数据库进行操作。
如果执行一句SQL语句的话,有以下几种方式。
a.参数可以是一个ActiveConnName<!--StartFragment-->
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item("MySql")
db.ExecuteNonQuery("up date testTT set col1=2")
 
b.参数可以是一个ActiveDatatable<!--EndFragment--><!--StartFragment-->
Dim tb As Table = e.Form.Controls("tblDtl").Table
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item(tb.DataTable.BaseTable)
db.ExecuteNonQuery("up date testTT set col1=2")
 
c.参数可以是一个ActiveConnName<!--StartFragment-->
gs_dataFactory.ActiveConnName="MySql"
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item
db.ExecuteNonQuery("upd ate testTT set col1=2")
 
d.参数可以是一个ActiveDatatable<!--EndFragment--> <!--StartFragment-->
Dim tb As Table = e.Form.Controls("tblDtl").Table
gs_dataFactory.ActiveDatatable<!--EndFragment-->=tb.DataTable.BaseTable  '通过此属性设置后,即相当于也设置了ActiveConnName
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item
db.ExecuteNonQuery("upd ate testTT set col1=2")
 
5.DataFactory支持的几种类型
a.常规的数据操作,如ExecuteScalar(String),ExecuteNonQuery(String),ExecuteDataTable(String, Boolean),ExecuteDataSet(String)
b.事务支持:BeginTransCommitTransRollbackTrans
c.数据源操作:AddContainsCreateDatabaseDeleteNameSourceTypeConnectionConnectionStringTransferMode
d.数据连接操作:OpenCloseDisposeTryConnect
e.数据结构操作:GetSchemaTableGetTableNamesGetViewNamesGetListOfColumnNameGetComboListColumnName
f.Datatable操作:LoadFilterLoadOrderLoadOverLoadPageLoadReverseTotalCountTotalPagesSaveSQLComputeSQLDeleteForSQLFindSQLGetComboListStringSQLGetValuesSQLLoadSQLReplaceForSQLSelectSQLUpdate
g.视图操作:FillSchemaOfAutoIncrementSaveView
h.数据操作:GetListOfColumnValueGetComboListOfColumnValueGetDicOfColumnValue
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->


[此贴子已经被作者于2018/8/21 11:37:08编辑过]

 回到顶部
帅哥,在线噢!
wangjian6931
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:899 积分:5489 威望:0 精华:0 注册:2014/6/2 20:54:00
  发帖心情 Post By:2018/8/21 11:33:00 [只看该作者]

Datatable的区别

这里谈一谈System.Data.Datatable与Foxtable.Datatable的区别

狐表中的Datatable的全路径命名就是Foxtable.Datatable,它与微软ADO.Net中提供的System.Data.Datatable还是有一点区别的。我们需要了解的几个主要的区别有:

1.命名空间不同:当需要同时使用这两个类时,为了不混淆,最好是这两个类都是以全名的方式调用。当然正常人的做法是在狐表中对System.Data.Datatable使用全名,而在VS里面开发的时候对Foxtable.Datatable使用全名。

2.主要的属性不同:

Foxtable.Datatable.DataRows对应System.Data.Datatable.Rows

Foxtable.Datatable.DataCols对应System.Data.Datatable.Columns

Foxtable.DataRow对应System.Data.DataRow

Foxtable.DataCol对应System.Data.DataColumn

Foxtable.DataCol.Name对应System.Data.DataColumn.ColumnName

3.狐表中有好多特殊方法是System.Data.Datatable没有的。比如说ReplaceFor、DeleteFor、SQLReplaceFor等等。

4.狐表中的DataRow返回的值不用考虑为空的情况,而System.Data.DataRow你获取的数据如果不预先判断为空的情况的话,很容易跳出一大堆DbNull数据类型转换错误。

比如在狐表中Dim strA as String=dr("AA"),如果dr("AA")即便为空,也不会出错。这是因为狐表本身帮我们判断了,而你直接使用System.Data.DataRow的话,必须先作一个判断,例如:

Dim db As sanMuSoft.Data.IDatabase= gs_dataFactory.Item(strConnName)
Dim dt As System.Data.DataTable=db.ExecuteDataTable("sel ect * fr om testTT",False)
Dim dr As System.Data.DataRow=dt.Rows(0)
Dim strA As
			String=""
			If dr.IsNull("AA")=False
			Then
    strA=dr("AA")
End
			If
5.如果将System.Data.Datatable赋值给Table.DataSource属性,那么我们就可以使用Table.Datatable来操作System.Data.Datatabler所有数据。

事务示例

DataFactory支持事务编程

具体使用如下:

Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item(cmbSource.Text)
db.BeginTrans '开始事务
						Try
						'SQL语句执行只需要一句代码,非常简洁
    db.ExecuteNonQuery("in sert into testTT (Col1,Col2,Col3) Values ('','','')")
    db.ExecuteNonQuery("Up date testTT set col1=2")
    db.CommitTrans '提交事务
						Catch ex As Exception
    db.RollbackTrans '遇到异常回滚事务
						End
						Try
加载表

加载表非常简单,跟狐表本身的加载表参数也差不多。

'具体的可以查看目录树里面的双击节点事件.
							Dim tb As Table = e.Form.Controls("tblDtl").Table
Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
Dim strSQLCmd As
							String="se lect Top * f rom testTT"
gs_dataFactory.Fill(tb,strSQLCmd,cmbSource.Text,False) '这个方法在对待Oracle数据库时,会自动打开表的DataRowAdding全局表事件。
一旦用此方法加载数据进入tb中之后,后面的操作我们就可以使用狐表中原来的一些方法了。比如tb.Datatable.ReplaceFor
批量插入数据到SQLServer

在需要对SQLServer数据库进行大批量的数据插入时,我们可以选择SqlBurkCopy,几万条数据也可以做到秒级插入。操作也极其简单。

Dim tb As Table = e.Form.Controls("tblDtl").Table
Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item(cmbSource.Text)
'第一个参数,要新增的Datatable.
								'第二个参数,要插入的数据库表名称.
								'第三个参数,要插入的目标数据库的名称.
gs_dataFactory.SqlBurkCopy(tb.DataTable.BaseTable,db.DatabaseTableName(tb.DataTable.BaseTable),cmbSource.Text)
[此贴子已经被作者于2018/8/21 11:41:22编辑过]

 回到顶部
帅哥,在线噢!
wangjian6931
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:899 积分:5489 威望:0 精华:0 注册:2014/6/2 20:54:00
  发帖心情 Post By:2018/8/21 11:34:00 [只看该作者]

Datatable操作

这里的Datatable指的是System.Data.Datatable,如果只有一个Table可以获得的情况下,可以通用tb.Datatable.BaseTable获得。

Datatable的操作有两种方式,一种是一句代码形式,一种是两句代码形式。

Datatable操作:LoadFilterLoadOrderLoadOverLoadPageLoadReverseTotalCountTotalPagesSaveSQLComputeSQLDe leteForSQLFindSQLGetComboListStringSQLGetValuesSQLLoadSQLReplace ForSQLSel ectSQLUp date都适合这两种形式)

a.一句代码形式,将Datatable作为方法、属性的第一个参数传递进去。

Dim tb As Table = e.Form.Controls("tblDtl").Table
gs_dataFactory.Save(tb.DataTable.BaseTable)
b.两句代码形式,先将Datatable作为参数赋值给ActiveDatatable属性,然后直接进行操作!
'另外一种保存方法
gs_dataFactory.ActiveDatatable=tb.DataTable.BaseTable
gs_dataFactory.Save()
(这种方法的好处就是,如果有批量操作时,可以少指定好多参数,如:)
gs_dataFactory.ActiveDatatable=tb.DataTable.BaseTable
gs_dataFactory.LoadTop = "100"
gs_dataFactory.LoadOrder = "日期 Desc"
gs_dataFactory.Load
 
直接编辑:
				
Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item(cmbSource.Text)
Dim dt As System.Data.DataTable=db.ExecuteDataTable("sel ect * from te stTT w here 1=2",True)
Dim dr As System.Data.DataRow=dt.NewRow  '注意跟狐表中的不同
dr("Col1")=1
dr("Col2")="字符"
dr("Col3")=Date.Now
dt.Rows.Add(dr) '注意跟狐表中的不同
gs_dataFactory.Save(dt)
[此贴子已经被作者于2018/8/21 11:43:09编辑过]

 回到顶部
帅哥,在线噢!
wangjian6931
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:899 积分:5489 威望:0 精华:0 注册:2014/6/2 20:54:00
  发帖心情 Post By:2018/8/21 11:34:00 [只看该作者]

DataRowValue使用

有些时候我们不得不对System.Data.Datatable进行操作,那么这时候,System.Data.DataRow很多时候读取数据的时候需要我们预先对空值进行判断处理,那么每次读取都作一下处理的话,那么这个将是一个非常麻烦的事情。狐表里面的DataRow已经帮我们处理了空值的问题,可是微软自带的System.Data.DataRow却需要我们自己处理。

正常处理空值是这样的:

Dim db As sanMuSoft.Data.IDatabase= gs_dataFactory.Item(strConnName)
Dim dt As System.Data.DataTable=db.ExecuteDataTable("sele ct * fr om testTT",False)
Dim dr As System.Data.DataRow=dt.Rows(0)
Dim strA As
			String=""
			If dr.IsNull("AA")=False
			Then
    strA=dr("AA")
End
			If
而使用了DataRowValue方法后可以变成这样:
							
Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item(cmbSource.Text)
Dim dt As System.Data.DataTable=db.ExecuteDataTable("sel ect * fr om testTT",True)
Dim tblDtl As Table = e.Form.Controls("tblDtl").Table
If dt IsNot
							Nothing
							AndAlso dt.Rows.Count>0
							Then
							For
							Each dr As System.Data.DataRow In dt.Rows
        gs_dataFactory.ActiveDataRow=dr
        Dim tr As Row=tblDtl.AddNew
        tr("Col1")=gs_dataFactory.DataRowValue("Col1")
        tr("Col2")=gs_dataFactory.DataRowValue("Col2")
        tr("Col3")=gs_dataFactory.DataRowValue("Col3")
    Next
							End
							If
[此贴子已经被作者于2018/8/21 11:45:13编辑过]

 回到顶部
帅哥,在线噢!
wangjian6931
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:899 积分:5489 威望:0 精华:0 注册:2014/6/2 20:54:00
  发帖心情 Post By:2018/8/21 11:34:00 [只看该作者]

视图编辑

工厂模式还添加了对视图编辑功能。

我们在系统开发过程中,经常会遇到将物料进行编号、给分公司、客户进行编号,在系统显示过程中,显示相应的名称,而实际存储到系统数据库中时,仅保存相应的编号。如果只是简单的一对一的关系的话,我们大可以用字典来解决这样的问题,可是有时候,我们需要显示更多列的信息,比如物料的颜色、尺寸、类别等等。这时候字典列就无法满足我们的需求了。如果我们能够界面显示的时候,显示所有信息,这一点视图可以解决我们的问题,可是问题是一般情况下视图无法直接保存。这里我们贴心地添加了视图保存功能。

优点:1.不用每个视图都要自己绞尽脑汁去写相应的SQL语句。
2.采用微软官方的保存方案,安全稳定。
3.使用非常简单。不用操心SQL语句如何写,执行SQL语句的顺序如何安排。
4.保存之后,新增行的自增长列自动会同步到库存中当前的真实ID值。后面再作任何修改都不会影响数据的正确性。
缺点:保存的视图有局限性,必须满足以下几个条件:
a.如果视图是由多个基础表组成的,那么只能保存其中的一个表。
b.必须指定要保存的这个基础表在数据库中的表名称。
c.视图中必须包含此更新表的主键。
d.视图中的字段与需要更新表的字段重合的部分,必须都来自此需要更新的表。
 
加载需要编辑的视图时
<!--StartFragment-->
Dim tb As Table = e.Form.Controls("tblDtl").Table
Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
Dim strSQLCmd As String="se lect Top * fr om vwtestTT"
gs_dataFactory.Fill(tb,strSQLCmd,cmbSource.Text,True) '正常加载
tb.AllowAddNew=True
tb.AllowDelete=True
tb.AllowEdit=True
gs_dataFactory.FillSchemaOfAutoIncrement(tb.DataTable.BaseTable,"testTT") '这一步千万不能忘记
保存视图时
<!--StartFragment-->Dim tb As Table = e.Form.Controls("tblDtl").Table
gs_dataFactory.SaveView(tb.DataTable.BaseTable,"testTT") '第二个参数就是视图中拥有主键的那个可以保存的数据库基础表名.
[此贴子已经被作者于2018/8/21 11:46:14编辑过]

 回到顶部
帅哥,在线噢!
wangjian6931
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:899 积分:5489 威望:0 精华:0 注册:2014/6/2 20:54:00
  发帖心情 Post By:2018/8/21 11:35:00 [只看该作者]

正常的增删改查

常规的操作,基本跟狐表平常的操作没有什么两样了。只是在处理Oracle数据库的表时,因为Oracle本身没有自增长字段,所以需要特殊处理一下,以最简单的方式让Oracle支持类似自增长的效果。

新增单行

Dim tb As Table=e.Form.Controls("tblDtl").Table
tb.AddNew

新增多行

Dim tb As Table=e.Form.Controls("tblDtl").Table
Dim Val As
			Integer = 5
			Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
gs_dataFactory.ActiveConnName=cmbSource.Text
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item(cmbSource.Text)
If InputValue(Val, "增加行", "请输入要增加的行数:") Then
			If db.SourceType=sanMuSoft.Data.SourceTypeEnum.Oracle Then
			If tb.DataTable.BaseTable.Columns.Contains("_Identify") Then
			'因为Oracel数据库没有自增长列,需要自己设定相应的主键值.
			Dim intID As
			Long=gs_dataFactory.GetOracleTableAutoIncreamentID(db.DatabaseTableName(tb.DataTable.BaseTable),Val)
            Dim intSort As
			Decimal=tb.DataTable.Compute("Max(_SortKey)")+1
            MsgBox(intSort)
            tb.StopRedraw
            SystemReady=False
			For i As
			Integer=0
			To Val-1
			Dim dr As System.Data.DataRow=tb.DataTable.BaseTable.NewRow
                dr("_Identify")=intID+i
                If tb.DataTable.BaseTable.Columns.Contains("_SortKey") Then
                    dr("_SortKey")=intSort+i
                End
			If
                tb.DataTable.BaseTable.Rows.Add(dr)
            Next
            SystemReady=True
            tb.ResumeRedraw
        Else
            tb.AddNew(val) '其他的数据源处理就使用狐表默认的方法
			End
			If
			Else
        tb.AddNew(val)
    End
			If
			End
			If
删除
'删除跟狐表正常的处理是一样的.
					Dim tb As Table = e.Form.Controls("tblDtl").Table
Dim Result As DialogResult
If tb.Current IsNot
					Nothing
					Then
    Result = MessageBox.Show("你确定要删除选择行数据吗?这样操作将会丢失选择的所有数据!", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    If Result = DialogResult.Yes Then
					With tb
            Dim IntBottom As
					Integer =.BottomPosition
            Dim IntTop As
					Integer =  .TopPosition
            tb.Select(IntBottom ,1)
            For i As
					Integer= IntBottom To IntTop Step -1
                .Rows(i).Delete
            Next
					End
					With
					End
					If
					Else
    MessageBox.Show("请先选择要删除的行后再执行此操作!","提醒",MessageBoxButtons.OK,MessageBoxIcon.Information)
End
					If
 
'保存
					
Dim tb As Table = e.Form.Controls("tblDtl").Table
gs_dataFactory.Save(tb.DataTable.BaseTable)

让Oracle变相支持自增长列

我们都知道,Oracle是不支持自增长列的。只能通过自己写函数来实现,而且实现起来很麻烦。但是我的一个小小的设计,就可以让Oracle数据库变相地支持类似自增长列的效果。我们都不用关心具体的实现逻辑,只需要像其他数据库一样操作数据即可。不过,我们需要在两个地方作一点点修改。

首先,在批量添加多行时:

Dim tb As Table=e.Form.Controls("tblDtl").Table
Dim Val As
							Integer = 5
							Dim cmbSource As WinForm.ComboBox = e.Form.Controls("cmbSource")
gs_dataFactory.ActiveConnName=cmbSource.Text
Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item(cmbSource.Text)
If InputValue(Val, "增加行", "请输入要增加的行数:") Then
							If db.SourceType=sanMuSoft.Data.SourceTypeEnum.Oracle Then
							If tb.DataTable.BaseTable.Columns.Contains("_Identify") Then
							'因为Oracel数据库没有自增长列,需要自己设定相应的主键值.
							Dim intID As
							Long=gs_dataFactory.GetOracleTableAutoIncreamentID(db.DatabaseTableName(tb.DataTable.BaseTable),Val)
            Dim intSort As
							Decimal=tb.DataTable.Compute("Max(_SortKey)")+1
            MsgBox(intSort)
            tb.StopRedraw
            SystemReady=False
							For i As
							Integer=0
							To Val-1
							Dim dr As System.Data.DataRow=tb.DataTable.BaseTable.NewRow
                dr("_Identify")=intID+i
                If tb.DataTable.BaseTable.Columns.Contains("_SortKey") Then
                    dr("_SortKey")=intSort+i
                End
							If
                tb.DataTable.BaseTable.Rows.Add(dr)
            Next
            SystemReady=True
            tb.ResumeRedraw
        Else
            tb.AddNew(val) '其他的数据源处理就使用狐表默认的方法
							End
							If
							Else
        tb.AddNew(val)
    End
							If
							End
							If
还有,在全局表事件DataRowAdding中添加如下代码:
'真正的项目中,这个代码要放到全局事件中去.
gs_dataFactory.ActiveDatatable=e.DataTable.BaseTable '当设置了ActiveDatatable属性后,ActiveConnName属性便会有值可以取到.
							Dim db As sanMuSoft.Data.IDatabase=gs_dataFactory.Item
If db.SourceType=sanMuSoft.Data.SourceTypeEnum.Oracle Then
							If e.DataTable.BaseTable.Columns.Contains("_Identify") Then
							'如果包含此列
							'这一句话是根据我设计的逻辑生成自增长值.
							Dim intID As
							Long=gs_dataFactory.GetOracleTableAutoIncreamentID(gs_dataFactory.ActiveConnName,db.DatabaseTableName(e.DataTable.BaseTable),1)
        e.DataRow.BaseRow("_Identify")=intID
        If e.DataTable.BaseTable.Columns.Contains("_SortKey") Then
            e.DataRow.BaseRow("_SortKey")=e.DataTable.Compute("Max(_SortKey)")+1
							End
							If
							End
							If
							End
							If
我们就只需要加入这两处代码即可,其他的需要配合我的另外一个数据管理软件使用,只有用我的那个软件创建的表,才支持类似自增长列的效果。
[此贴子已经被作者于2018/8/21 11:47:42编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
ufo20085
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:131 积分:1519 威望:0 精华:0 注册:2016/8/31 14:05:00
  发帖心情 Post By:2018/8/21 11:37:00 [只看该作者]

回复查看

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:23372 积分:119198 威望:0 精华:7 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/8/21 11:51:00 [只看该作者]

很好,顶一个

 回到顶部
帅哥哟,离线,有人找我吗?
aizaishuzui
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:183 积分:1458 威望:0 精华:0 注册:2014/3/25 14:24:00
  发帖心情 Post By:2018/8/21 12:37:00 [只看该作者]

mark   顶一个

 回到顶部
总数 101 1 2 3 4 5 6 7 8 9 10 下一页 ..11