在VFP里来操作和管理SQL-SERVER
来源:优易学  2011-12-9 18:46:10   【优易学:中国教育考试门户网】   资料下载   IT书店


  2.建表
  oDB=oServer.Databases("MyNewDB") &&数据库对象
  oTable=CreateObject("SQLDMO.Table") &&表对象
  oTable.Name="FirstTable" &&表名
  oTable.FileGroup="Primary" &&文件群
  oCol1=CreateObject("SQLDMO.Column") &&列对象(字段)
  oCol1.Name="Num" &&列名
  oCol1.Datatype="Int" &&数据类型
  oCol1.Identity=.T. &&是否IDENTITY字段
  oCol1.IdentityIncrement=1 &&增加量
  oCol1.IdentitySeed=1 &&种子
  oCol1.AllowNulls=.F. &&是否允许NULL
  **第2列
  oCol2=CreateObject("SQLDMO.Column")
  oCol2.Name="UserName"
  oCol2.Datatype="varchar"
  oCol2.Length=10
  oCol2.AllowNulls=.F.
  **第3列
  oCol3=CreateObject("SQLDMO.Column")
  oCol3.Name="Email"
  oCol3.Datatype="varchar"
  oCol3.Length=30
  oCol3.AllowNulls=.F.
  **添加列到表对象里
  oTable.Columns.Add(oCol1)
  oTable.Columns.Add(oCol2)
  oTable.Columns.Add(oCol3)
  **添加表到数据库里
  oDB.Tables.Add(oTable)
  3. 给表增加主键
  oFirstTable=ODB.Tables("FirstTable") &&创建表对象
  oKey=CreateObject("SQLDMO.Key") &&创建索引对象
  oKey.Name="FirstTable_PK" &索引名字
  oKey.KeyColumns.Add("Num") &&索引列
  oKey.Clustered=.T. &&是否物理索引
  oKey.Type=1 && 索引类型 1- 主键 2- 唯一键 3 - 外部键(Foreign)
  oFirstTable.BeginAlter &&修改表对象
  oFirstTable.Keys.Add(oKey) &&添加索引
  oFirstTable.DoAlter &&保存修改

 4. 添加登录用户
  oLogin=CreateObject("SQLDMO.Login") &&创建登录对象
  oLogin.Name="myf1" &&登录名
  oLogin.Type= 2 && 登录类型 2 - SQL 登录 0 -NT 用户 1 -NT 用户群
  oServer.Logins.Add(oLogin) &&添加到服务器。 密码为空
  oServer.Logins("myf1").SetPassword("","www1") &&添加成功后,修改密码
  oDBUser=CreateObject("SQLDMO.User") &&创建数据库用户对象
  oDBUser.Name="myf1" &&数据库用户名,可以和登录名不同
  oDBUser.Login="myf1" &&登录名
  oDB.Users.Add(oDBUser) &&添加到数据库
  5. 给用户授权
  **假设上边的表对象还存在
  oFirstTable.Grant(1,"myf1") &&第一个参数: 1 - Select 2 - Insert 4 - Update 8 - Delete 63 - 所有权限
  oFirstTable.Deny(4,"myf1","Email") &&可以把权限限制到列。 这条命令是拒绝该用户对EMAIL列的修改
  oFirstTable.Grant(63,"myf1") &&所有权限

  数据导入和导出
  1. 导出SQL SERVER数据到TEXT文件
  oServer=CreateObject("SQLDMO.SQLServer") &&创建SERVER对象
  oServer.Connect("Snoopy","sa","778899") &&连接到服务器snoopy
  oTable=oServer.Databases("PUBS").Tables("Titles") &&建立表对象
  oBulk=CreateObject("SQLDMO.BulkCopy") &&建立BULKCOPY对象
  oBulk.DataFilePath="C:\Temp\Title.Txt" &&目标文件和路径
  oBulk.DataFileType= 1 && 数据文件类型 1- 文本文件,以逗号作为字段分隔符, 回车和换行符作为行分隔符
  oBulk.TruncateLog=.T. &&导出成功后,删除日志文件,否则日志文件会变得很大
  oBulk.FirstRow=1 &&从第一行开始,可以任意设置,但必须在文件包含的行数范围内,下面的属性也是这样
  oBulk.LastRow=10 &&最后一行
  oBulk.ErrorFilePath="C:\Temp\ErrLog.txt" &&错误信息存放文件
  oBulk.MaximumErrorsBeforeAbort=1 &&遇到几个错误后退出
  oTable.ExportData(oBulk) &&执行导出任务
  2. 从TEXT文件导入数据到SQL表
  oTable=oServer.Databases("MyNewDB").Tables("FirstTable")
  oBulk=CreateObject("SQLDMO.BulkCopy")
  oBulk.DataFilePath="C:\Temp\Test1.txt"
  oBulk.DataFileType= 1
  oBulk.TruncateLog=.T.
  oBulk.ErrorFilePath="C:\Temp\ErrLog.txt"
  oBulk.ColumnDelimiter="," &&字段分隔符为逗号
  oBulk.ServerBCPKeepIdentity=.T. &&该属性控制IDENTITY字段的表现,如果为.T., 则文本文件的该字段值会插入到SQL表里,即SQL表的INDENTITY功能暂时关闭。 如果为.F., 则SQL表会自动生成IDENTITY值,文本文件里该列的值被忽略(但该列不能省略,否则格式不对会出错)
  oBulk.ServerBCPKeepNulls=.T. &&是否允许NULL
  oBulk.UseServerSideBCP=.T. &&执行服务器端的BCP(而不是ODBC端的), 因为有IDENTITY,设置必须如此设置
  oTable.ImportData(oBulk) &&导入数据
  **改变IDENTITY设置,再试一次
  oBulk.ServerBCPKeepIdentity=.F.
  oTable.ImportData(oBulk)
  TEST1.TXT文件里包含下面的内容:(因为论坛会自动给@前加IE图标,EMAIL地址里我没有加这个符号)
  1,Zhang3,zhang3.abc.com
  2,Li4,li4.abc.com
  5,Wang5,wang5.abc.com
  如果在VFP里使用COPY TO Delimited把DBF文件输出到TEXT文件,然后再导入到SQL SERVER里,有一个毛病,就是字符型数据全部加上了引号,而SQL SERVER会把引号当作字段内容导入。所以在导入前需要先想法把引号去掉。

  运行SQL命令和获取数据
  DMO的SERVER对象,可以运行TSQL命令或者操作系统的命令,这也为我们在程序里运行操作系统命令提供了一个接口。
  oServer.CommandShellImmediate("Calc.exe") &&打开WINDOWS下的计算器
  oServer.CommandShellImmediate("Notepad.exe") &&运行Notepad
  **DATABASE对象,可以运行TSQL命令
  oDB=oServer.Databases("PUBS") &&创建数据库对象
  oDB.ExecuteImmediate("Update Titles Set Title=''''Sushi, anyone else?'''' Where Title_ID=''''TC7777''''")&&执行Update命令
  oResult=oDB.ExecuteWithResults("Select * From Titles") &&运行SELECT命令,结果放到一个结果集里
  ? oResult.Rows &&显示总行数
  ? oResult.Columns &&总列数
  ? oResult.ColumnName(1) &&第一列字段名
  ? oResult.ColumnType(5) &&第5列数据类型
  **注意下面的命令,因为这是完全在代码方式下操作,返回的数据结果总是一个值,可以用行号和列号来返回任何一个记录的某个字段的值,但只能用列号,不能用列名, 如果一定想用列名,那就得通过oResult.Column(i).Name来判断,这样可以得到列号。
  ? oResult.GetColumnString(5,3) &&以字符串格式返回第5行第3列数据
  ? oResult.GetRangeString(1,1,10,5) &&将范围从第一行第一列数据到第10行第5列数据组合成一个字符串
  SQL-DMO系列文章暂时写到这里。有时间我想在VFP里做个界面,把大部分DMO的功能加进去, 用做VFP里管理SQL SERVER的界面, 做完后会贴出来. 我把这些文章都合并到第一个贴子里。
  有个比较重要的部分是, DMO很多对象都有自己的事件,比如BACKUP对象,有PercentCompletes事件,可以返回完成备份的百分比。在VFP里需要建立相应的类,把这些事件捆绑到VFP自己的事件里,才能捕捉到这些事件。因为没法在命令窗口里测试,而且需要比较多的时间,也许我会放在以后的实例里。

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训