数据表视图
视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。视图看上去非常像数据库的物理表,对它的 *** 作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,而有些则不能(仅仅能查询)。
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查, *** 作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
是可以的。
public DataTable Query(string sql)
{
DataSet ds = null;
DataTable dt = null;
try
{
ds = new DataSet();
dt = new DataTable();
innerCommandCommandText = sql;
innerDataAdapterFill(ds);
}
catch (Exception err)
{
throw err;
}
dt = dsTables[0]Copy();
return dt;
}
这是返回一个数据表对象的后台函数,在cs文件中DataTable dt=对象Query(sql),是可以的。
从EXCEL到FineReport
以下摘自中国报表工具第一品牌帆软FineReport资料库:
这年头,excel真是个好用的东西,不管是什么项目,最终用户总会要求把报表导出到excel,不仅仅数据要导出,格式也要导出,样式还不能失真,实在烦死了程序员。更有甚者,不少最终用户在项目需求的初期,就给程序员提供了一大堆的excel表样,还理直气壮的说,看,表样都给你们画好了,你们可以直接用,不需要画表样了。一句话足可以让你哑巴吃黄连,有苦说不出。
最终用户想要的说白了就是要把数据库中的数据按他们要求的格式展现出来。EXCEL能满足用户对表样的需求,但也有局限的地方,比如不能动态感知数据库。最终用户除了要动态感知数据库还要求可以动态显示数据库或是要求可以完全通过网页来查看数据等
如果从数据库写代码也是可以做报表的,但是数据库只管理纯数据但不管理数据的录入和展示。当然,数据的录入和展示也可以自己写出来,但是写代码实在太烦琐,想到就头大……
现在市面上的报表工具也好,报表控件也好,大都是基于控件拖拽式的。俗话说,鼠标拖拖拽拽画报表,似乎很容易,可实际上只有程序员知道,中国式报表讲究的是格线对齐,控件拖拽是很难格线对齐的,能把人眼珠子看直了!偏偏最终用户还那么热爱excel,所有的报表都希望和excel平滑导入导出!控件拖拽式的报表在界面模型上和excel完全不同,能否平滑导入导出,严重取决于控件的对齐程度,因此难度可想而知。
当然也有一种报表工具,完全借鉴了excel的界面模型,利用单元格的合并和拆分,利用单元格的边框来组织报表样式,其表样的编辑方式和excel完全相同,两者之间可以平滑的导入导出。可是基于单元格合并拆分的模型和基于二维表的数据库物理表模型没法有机的结合起来,因此这种报表几乎都只能做静态报表,需要靠程序员编程来实现动态行列报表的制作。
FineReport报表在研究了几千张中国式报表的基础上,提出了一套完整的数学模型,终于把类excel的界面模型和数据库的二维物理表有机的结合起来了,不仅仅解决了动态行列的问题,还解决了跨行组运算的问题,可以说从根本上解决了中国式报表无规则表样和无规则运算的问题。 *** 作也非常简单,花个几分钟配置下服务器,然后就是做模版,接着就剩直接COPY了。
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
解析:
Visual BasicNET快速开发MIS系统
摘 要 本文介绍微软最新技术Visual BasicNET在数据库开发方面的应用。结合数据库系统开发的知识,介绍了物理表 *** 作的方法,利用Visual BasicNET的面向对象的特征,利用类的继承知识,简化了数据库系统开发过程。
引言
以前版本的Visual Basic虽然号称自己是一种OOP(面向对象)编程语言,但却不是一个地地道道的OOP编程语言,最多只是半个面向对象的编程语言。但Visual BasicNET已经是一种完全的面向对象的编程语言。他支持面向对象的所有基本特征:继承、多态和重载。这使得以前在Visual Basic中很难或根本实现不了的问题,在Visual BasicNET中可以顺利的用简单的方法实现。
自定义数据 *** 作类
定义一个数据访问的基类,并编写有关数据库 *** 作的必要方法。
定义一个数据访问类,类名为CData。定义连接Oracle数据库的方法ConnOracle,获取数据集的方法GetDataSet, 获取物理表的方法GetDataTable, 向物理表中插入一行数据的方法Insert, 向物理表中删除数据的方法Delete, 向物理表中更新数据的方法Update。其实现方法不是本文的重点,在此仅给出代码,不作详细分析。代码如下:
Public Class CDataBase
Dim OleCnnDB As New OleDbConnection()
@#连接Oracle数据库,ServerName:服务器名,UserId:用户名,UserPwd:用户密码
Public Function ConnOracle(ByVal ServerName As String, ByVal UserId As String, ByVal UserPwd As String) As OleDbConnection
Dim OleCnnDB As New OleDbConnection()
With OleCnnDB
ConnectionString = "Provider=MSDAORA1;Password=@#" & UserPwd & "@#;User ID=@#" & UserId & "@#;Data Source=@#" & ServerName & "@#"
Try
Open()
Catch er As Exception
MsgBox(erToString)
End Try
End With
mOleCnnDB = OleCnnDB
Return OleCnnDB
End Function
@#获取数据集。TableName:表名,strWhere:条件
Public Overloads Function GetDataSet(ByVal TableName As String, ByVal strWhere As String) As DataSet
Dim strSql As String
Dim myDataSet As New DataSet()
Dim myOleDataAdapter As New OleDbDataAdapter()
myOleDataAdapterTableMappingsAdd(TableName, TableName)
strSql = "SELECT FROM " & TableName & " where " & strWhere
myOleDataAdapterSelectCommand = New OleDbCommand(strSql, mOleCnnDB)
Try
myOleDataAdapterFill(myDataSet)
Catch er As Exception
MsgBox(erToString)
End Try
Return myDataSet
End Function
@#获取物理表。TableName:表名
Public Overloads Function GetDataTable(ByVal TableName As String) As DataTable
Dim myDataSet As New DataSet()
myDataSet = GetDataSet(TableName)
Return myDataSetTables(0)
End Function
@#获取物理表。TableName:表名,strWhere:条件
Public Overloads Function GetDataTable(ByVal TableName As String, ByVal strWhere As String) As DataTable
Dim myDataSet As New DataSet()
myDataSet = GetDataSet(TableName, strWhere)
Return myDataSetTables(0)
End Function
@#向物理表中插入一行数据。TableName:表名,Value:行数据,BeginColumnIndex:开始列
Public Overloads Function Insert(ByVal TableName As String, ByVal Value As Object, Optional ByVal BeginColumnIndex As Int16 = 0) As Boolean
Dim myDataAdapter As New OleDbDataAdapter()
Dim strSql As String
Dim myDataSet As New DataSet()
Dim dRow As DataRow
Dim i, len As Int16
strSql = "SELECT FROM " & TableName
myDataAdapterSelectCommand = New OleDbCommand(strSql, mOleCnnDB)
Dim custCB As OleDbCommandBuilder = New OleDbCommandBuilder(myDataAdapter)
myDataSetTablesAdd(TableName)
myDataAdapterFill(myDataSet, TableName)
dRow = myDataSetTables(TableName)NewRow
len = ValueLength
For i = BeginColumnIndex To len - 1
If Not (IsDBNull(Value(i)) Or IsNothing(Value(i))) Then
dRowItem(i) = Value(i)
End If
Next
myDataSetTables(TableName)RowsAdd(dRow)
Try
myDataAdapterUpdate(myDataSet, TableName)
Catch er As Exception
MsgBox(erToString)
Return False
End Try
myDataSetTablesRemove(TableName)
Return True
End Function
@#更新物理表的一个字段的值。strSql:查询语句,FieldName_Value:字段及与对应的值
Public Overloads Sub Update(ByVal strSql As String, ByVal FieldName_Value As String)
Dim myDataAdapter As New OleDbDataAdapter()
Dim myDataSet As New DataSet()
Dim dRow As DataRow
Dim TableName, FieldName As String
Dim Value As Object
Dim a() As String
a = strSqlSplit(" ")
TableName = a(3)
a = FieldName_ValueSplit("=")
FieldName = a(0)Trim
Value = a(1)
myDataAdapterSelectCommand = New OleDbCommand(strSql, mOleCnnDB)
Dim custCB As OleDbCommandBuilder = New OleDbCommandBuilder(myDataAdapter)
myDataSetTablesAdd(TableName)
myDataAdapterFill(myDataSet, TableName)
dRow = myDataSetTables(TableName)Rows(0)
If Value <> Nothing Then
dRowItem(FieldName) = Value
End If
Try
myDataAdapterUpdate(myDataSet, TableName)
myDataSetTablesRemove(TableName)
Catch er As Exception
MsgBox(erToString)
End Try
End Sub
@#删除物理表的数据。TableName:表名,strWhere:条件
Public Overloads Sub Delete(ByVal TableName As String, ByVal strWhere As String)
Dim myReader As OleDbDataReader
Dim myCommand As New OleDbCommand()
Dim strSql As String
strSql = "delete FROM " & TableName & " where " & strWhere
myCommandConnection = mOleCnnDB
myCommandCommandText = strSql
Try
myReader = myCommandExecuteReader()
myReaderClose()
Catch er As Exception
MsgBox(erToString)
End Try
End Sub
End Class
定义一 *** 作数据库中物理表的类CData,此类继承CDataBase,即:
Public Class CData:Inherits CDataBase
此类应该由供用户提供所 *** 作的物理表的表名,指定了表名就可取得该表的所有性质。该表主要完成插入、删除、更新功能。定义其属性、方法如下:
申明类CData的变量:
@#所要 *** 作的表名
Private Shared UpdateTableName As String
@#所要 *** 作的表对象
Public Shared UpdateDataTable As New DataTable()
@#对应表的一行数据197
Public Shared ObjFields() As Object
@#表的字段数
Public Shared FieldCount As Int16
@#主关键字。我们假设每个物理表都有一个主关键字字段fSystemID
Public Shared SystemID As String
说明:Shared 关键字指示一个或多个被声明的编程元素将被共享。共享元素不关联于某类或结构的特定实例。可以通过使用类名或结构名称或者类或结构的特定实例的变量名称限定共享元素来访问它们。
申明类CData的属性UpdateTable,当向UpdateTable赋给了一个已知表的表名,就可确定表的字段数,定义出数据行。这里,先打开表,再重新定义数据行
Public Property UpdateTable() As String
Get
UpdateTable = UpdateTableName
End Get
Set(ByVal Value As String)
UpdateTableName = ValueTrim
UpdateDataTable = DBGetDataTable(UpdateTableName)
UpdateTableFieldNames = UpdateDataTableClone
FieldCount = UpdateDataTableColumnsCount
ReDim ObjFields(FieldCount - 1)
End Set
End Property
@#删除由主关键值fSystemID指定的数据行
Public Sub Delete()
Dim strSQL As String
strSQL = "Delete from " & UpdateTableName & " where fSystemID=" & SystemID
DBDelete(strSQL)
UpdateDataTableRowsRemove(GetRow)
End Sub
@#向表UpdateTableName中插入一行数据。数据由ObjFields给出
Public Function Insert() As Boolean
DBInsert(UpdateTableName, ObjFields)
End Function
@#更新表UpdateTableName所指定的行
Public Shadows Sub Update()
Dim SetField As String
Dim i As Int16
For i = 1 To FieldCount - 1
SetField = UpdateTableFieldNamesColumns(i)ColumnName & "=" & ObjFields(i)
UpdateField(SetField)
Next
End Sub
Public Sub UpdateField(ByVal SetField As String)
Dim StrSQL As String
StrSQL = "select from " & UpdateTableName & " where fSystemID= " & SystemID
DBUpdate(StrSQL, SetField)
End Sub
@#填充网络数据
Public Overloads Sub FillGrid(ByVal GridName As DataGrid)
GridNameDataSource = UpdateDataTable
End Sub
@#把数据网格的当前行数据定写入到输入控件中
Public Sub DataGridToText(ByVal frm As Form)
Dim RowIndex, i As Int16
Dim value
Dim obj As Control
Dim DataGrid As New DataGrid()
If FieldCount = 0 Then Exit Sub
For Each obj In frmControls
If objGetTypeName = "DataGrid" Then
DataGrid = obj
Exit For
End If
Next
RowIndex = DataGridCurrentRowIndex
For i = 1 To FieldCount - 1
value = DataGridItem(RowIndex, i)
If IsDBNull(value) = True Then
value = ""
End If
For Each obj In frmControls @#
If objTabIndex = i Then
objText = value
Exit For
End If
Next
Next
End Sub
数据库架构schema实现了,数据库对象与数据库用户直接映射的分离,用户与数据库对象可以通过schema来映射控制。
数据库对象(视图,表,函数等)可以属于某个schema数据库用户可以属于某个schema,表示拥有某个schema下对象的权限。如果未指定,数据库对象属于架构(schema)dbo,sa用户默认属于dbo架构(dbo:database owner)。当用户访问数据库对象时,如采用serverobjects时默认寻找对应schema下的数据库对象:比如用户tmp_user属于schema:tmp,则上述访问默认转变成:servertmpobjects
创建用户,并指定用户默认的schema:
PgSQL
CREATE LOGIN [User_tmp] WITH PASSWORD = N'123456'
CREATE USER [User_tmp] FOR LOGIN [User_tmp] WITH DEFAULT_SCHEMA = [tenant]
1
2
CREATE LOGIN [User_tmp] WITH PASSWORD = N'123456'
CREATE USER [User_tmp] FOR LOGIN [User_tmp] WITH DEFAULT_SCHEMA = [tenant]
创建scheme:
PgSQL
CREATE SCHEMA [tenant] AUTHORIZATION [dbo]
1
CREATE SCHEMA [tenant] AUTHORIZATION [dbo]
给schema设置权限:
PgSQL
GRANT INSERT, SELECT, UPDATE, DELETE, EXECUTE, REFERENCES ON SCHEMA:: [tenant] TO User_tmp
1
GRANT INSERT, SELECT, UPDATE, DELETE, EXECUTE, REFERENCES ON SCHEMA:: [tenant] TO User_tmp
创建带schema的数据库对象,比如创建一个视图:
PgSQL
CREATE VIEW tenantPrinterCookies
WITH SCHEMABINDING
AS
SELECT ticket_no, user_agent, create_date, create_by
FROM dboPrinterCookies
GO
1
2
3
4
5
6
CREATE VIEW tenantPrinterCookies
WITH SCHEMABINDING
AS
SELECT ticket_no, user_agent, create_date, create_by
FROM dboPrinterCookies
GO
注意:带WITH SCHEMABINDING标记时,如果对应的表做了修改(增加字段除外),需要删除原视图,再去修改对应的物理表,再建带schema的视图。
用户登录时,只显示他所在schema下的所有数据库对象,如上述用户只显示带tenant的对象,无法查看其它dbo的数据库对象。但tenant的所有者是dbo,所以dbo下可以看到所有tenant的对象。
同样的,因为之前给tenant分配了数据库的增,删,改查权限,可以对tenant下的数据对象作相应的 *** 作权限。
当使用下面的SQL语句时:SELECT FROM SqlTestPrinterCookies,当用用户[User_tmp]登录查找时,会匹配到SqlTesttenantPrinterCookies视图对象,而用dbo登录时,会匹配到SqlTestdboPrinterCookies物理表对象。当然,各自查询呈现的数据是不一样的。
综上所述,基于schema的不同,我们可以规约出很多不同的权限。同时,根据schema的默认匹配,可将数据库的物理表逻辑往上层通过schema来管理控制。从而让不同的登录用户,有差别的访问同一个数据库资源,达到数据管理的目的。
一 视图概念
视图是原始数据库数据的一种变换 是查看表中数据的另外一种方式 可以将视图看成是一个移动的窗口 通过它可以看到感兴趣的数据
视图是从一个或多个实际表中获得的 这些表的数据存放在数据库中 那些用于产生视图的表叫做该视图的基表 一个视图也可以从另一个视图中产生
视图的定义存在数据库中 与此定义相关的数据并没有再存一份于数据库中 通过视图看到的数据存放在基表中
视图看上去非常象数据库的物理表 对它的 *** 作同任何其它的表一样 当通过视图修改数据时 实际上是在改变基表中的数据 相反地 基表数据的改变也会自动反映在由基表产生的视图中 由于逻辑上的原因 有些视图可以修改对应的基表 有些则不能(仅仅能查询)
二 视图的作用
简单性 看到的就是需要的 视图不仅可以简化用户对数据的理解 也可以简化他们的 *** 作 那些被经常使用的查询可以被定义为视图 从而使得用户不必为以后的 *** 作每次指定全部的条件
安全性 通过视图用户只能查询和修改他们所能见到的数据 数据库中的其它数据则既看不见也取不到 数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上 但不能授权到数据库特定行和特定的列上 通过视图 用户可以被限制在数据的不同子集上
使用权限可被限制在基表的行的子集上
使用权限可被限制在基表的列的子集上
使用权限可被限制在基表的行和列的子集上
使用权限可被限制在多个基表的连接所限定的行上
使用权限可被限制在基表中的数据的统计汇总上
使用权限可被限制在另一视图的一个子集上 或是一些视图和基表合并后的子集上
逻辑数据独立性 视图可帮助用户屏蔽真实表结构变化带来的影响
三 视图的安全性
视图的安全性可以防止未授权用户查看特定的行或列 是用户只能看到表中特定行的方法如下
在表中增加一个标志用户名的列
建立视图 是用户只能看到标有自己用户名的行
把视图授权给其他用户
四 逻辑数据独立性
视图可以使应用程序和数据库表在一定程度上独立 如果没有视图 应用一定是建立在表上的 有了视图之后 程序可以建立在视图之上 从而程序与数据库表被视图分割开来 视图可以在以下几个方面使程序与数据独立
如果应用建立在数据库表上 当数据库表发生变化时 可以在表上建立视图 通过视图屏蔽表的变化 从而应用程序可以不动
如果应用建立在数据库表上 当应用发生变化时 可以在表上建立视图 通过视图屏蔽应用的变化 从而使数据库表不动
如果应用建立在视图上 当数据库表发生变化时 可以在表上修改视图 通过视图屏蔽表的变化 从而应用程序可以不动
lishixinzhi/Article/program/Oracle/201311/16872
以上就是关于标题如果要修改数据表中的某一条记录,应该在什么视图下进行修改全部的内容,包括:标题如果要修改数据表中的某一条记录,应该在什么视图下进行修改、数据库中,什么叫视图游标是什么、c#中DataTable是否可以表示数据库中表的一个对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)