找回密码
 加入
搜索
楼主: xuanniao110

[AU3基础] [已解决]关于查找与判断SQL表中列的存在问题,请指教怎么判断有或者无

[复制链接]
 楼主| 发表于 2019-10-15 09:23:07 | 显示全部楼层
ADO Recordset 对象属性
属性
描述
AbsolutePage设置或返回一个可指定 Recordset 对象中页码的值。
AbsolutePosition设置或返回一个值,此值可指定 Recordset 对象中当前记录的顺序位置(序号位置)。
ActiveCommand返回与 Recordset 对象相关联的 Command 对象。
ActiveConnection如果连接被关闭,设置或返回连接的定义,如果连接打开,设置或返回当前的 Connection 对象。
BOF如果当前的记录位置在第一条记录之前,则返回 true,否则返回 fasle。
Bookmark设置或返回一个书签。此书签保存当前记录的位置。
CacheSize设置或返回能够被缓存的记录的数目。
CursorLocation设置或返回游标服务的位置。
CursorType设置或返回一个 Recordset 对象的游标类型。
DataMember设置或返回要从 DataSource 属性所引用的对象中检索的数据成员的名称。
DataSource指定一个包含要被表示为 Recordset 对象的数据的对象。
EditMode返回当前记录的编辑状态。
EOF如果当前记录的位置在最后的记录之后,则返回 true,否则返回 fasle。
Filter返回一个针对 Recordset 对象中数据的过滤器。
Index设置或返回 Recordset 对象的当前索引的名称。
LockType设置或返回当编辑 Recordset 中的一条记录时,可指定锁定类型的值。
MarshalOptions设置或返回一个值,此值指定哪些记录被返回服务器。
MaxRecords设置或返回从一个查询返回 Recordset 对象的的最大记录数目。
PageCount返回一个 Recordset 对象中的数据页数。
PageSize设置或返回 Recordset 对象的一个单一页面上所允许的最大记录数。
RecordCount返回一个 Recordset 对象中的记录数目。
Sort设置或返回一个或多个作为 Recordset 排序基准的字段名。
Source设置一个字符串值,或一个 Command 对象引用,或返回一个字符串值,此值可指示 Recordset 对象的数据源。
State返回一个值,此值可描述是否 Recordset 对象是打开、关闭、正在连接、正在执行或正在取回数据。
Status返回有关批更新或其他大量操作的当前记录的状态。
StayInSync设置或返回当父记录位置改变时对子记录的引用是否改变。


请各位大神帮忙看看应该用什么表达   才能获取到的判断值
发表于 2019-10-15 09:39:41 | 显示全部楼层
xuanniao110 发表于 2019-10-14 13:39
SQL数据库   select count(*) from information_schema.columns where table_name = '01mon' and column_ ...

以下代码将数据集作为一个数组返回,再搜索数组中有没有你需要的列。
因为是自己平时用的,看起来很长,其实在 92 行的循环中可以加判断有没有存在你要的 列名。不生成数组也可以。
#include <Array.au3>

$Server = ""
$Username = ""
$Password = ""
$Database = ""

$Obj = _MsSQL_Connect($Server, $Username, $Password, $Database)
If Not @error Then
   $ARRAY = _MsSQL_SelectTable($Obj, "sys.columns", "name", "object_id=object_id('    ')")
   If Not @error Then
          _ArrayDisplay($ARRAY)
   Else

   EndIf
EndIf


Func _MsSQL_Connect($sServer, $sUsername, $sPassword, $sDatabase, $Auth = True, $sPort=1433, $sDriver = "{SQL Server}")
   If $sServer = "" Or $sUsername = "" Or $sPassword = "" Or $sDatabase = "" Then
          SetError(1)
          Return
   EndIf

   Local $v = StringMid($sDriver, 2, StringLen($sDriver) - 2)
   Local $val = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", $v)        ;检查OBDC驱动是否安装
   If @error Or $val = "" Then
          SetError(3)
          Return
   EndIf

   $conn = ObjCreate("ADODB.Connection")
   If Not IsObj($conn) Then
          SetError(4)
          Return
   EndIf

   If $sPort = "" Then $sPort = 1433
   If $sPort = 1433 Then
          $Port = ''
   Else
          $Port = ',' & $sPort
   EndIf

   If $Auth = True Then
          ConsoleWrite("driver={SQL Server};server="&$sServer&$Port&";uid="&$sUsername&";pwd="&$sPassword&";database="&$sDatabase & @CRLF)
          $conn.Open("driver={SQL Server};server="&$sServer&$Port&";uid="&$sUsername&";pwd="&$sPassword&";database="&$sDatabase)        ;主机名IP127.0.0.1,UID=用户,PWD=密码,database=数据库名 ?
   Else
          ConsoleWrite("driver={SQL Server};server="&$sServer&$Port&";uid="&$sUsername&";pwd="&$sPassword&";database="&$sDatabase&";Integrated Security=SSPI" & @CRLF)
          $conn.Properties.Value("Integrated Security") = "SSPI"
          $conn.Properties("uid") = $sUsername
          $conn.Properties("pwd") = $sPassword
          $conn.Open("driver={SQL Server};server=" & $sServer & ";database="&$sDatabase)
   EndIf

   If @error Then
          SetError(5)
          Return
   Else
          Return $conn
   EndIf
EndFunc

Func _MsSQL_SelectTable($Obj, $Table, $Field = '*', $Condition = '', $Distinct = 0, $OrderByCMD = "")                ;表查询,Condition = WHERE, Distinct <> 0 将去掉重复项,只返回不重复的值
   If Not IsObj($Obj) Then
          SetError(1)
          Return
   ElseIf $Table = "" Then
          SetError(2)
          Return
   EndIf

   $RS = ObjCreate("ADODB.Recordset")
   $RS.ActiveConnection = $Obj

   Local $WHERE = "", $DIS = "", $OrderBy = ""
   If $Condition <> "" Then $WHERE = " WHERE " & $Condition
   If $OrderByCMD <> "" Then $OrderBy = " ORDER BY " & $OrderByCMD
   If $Distinct = 1 Then $DIS = "DISTINCT "                        ;排除重复项

   ConsoleWrite("SELECT " & $DIS & $Field & " FROM " & $Table & $WHERE & $OrderBy & @CRLF)
   $RS.Open("SELECT " & $DIS & $Field & " FROM " & $Table & $WHERE & $OrderBy)

   Local $FieldNum = $RS.Fields.Count
   If $FieldNum = 1 Then
          $FieldNum2 = 2                ;虽然数据只有1列,但数组是二唯的,容量发生混乱,干脆生成二唯数组
   Else
          $FieldNum2 = $FieldNum
   EndIf

   Local $Num = 0, $Array[1][$FieldNum2] = [[0]], $text = ""
   While Not $RS.eof And Not $RS.bof
          For $i = 0 To $FieldNum-1                                                        ;循环读取字段值
                 $Text &= $RS.Fields($i).value & "|"
          Next

          _ArrayAdd($Array, StringTrimRight($Text, 1))                ;通常会多加一个|,会导致数组维数不对
          $text = ""
          $Num += 1
          $RS.movenext;下一笔资料
   WEnd
   $RS.close

   If $Num = 0 Then
          SetError(5)
          Return
   Else
          $Array[0][0] = $Num
          Return $Array
   EndIf
EndFunc

 楼主| 发表于 2019-10-15 10:13:46 | 显示全部楼层
yhxhappy 发表于 2019-10-15 09:39
以下代码将数据集作为一个数组返回,再搜索数组中有没有你需要的列。
因为是自己平时用的,看起来很长, ...

感谢   我只有换种思路了  A我查询了数据集  所有的都不是我想要的  只有罗列所有列名  然后再判断了  如果有列名  执行后面的操作  没有列名 就创建新列名  再继续运行后面的操作了   
 楼主| 发表于 2019-10-15 10:57:04 | 显示全部楼层
yhxhappy 发表于 2019-10-15 09:39
以下代码将数据集作为一个数组返回,再搜索数组中有没有你需要的列。
因为是自己平时用的,看起来很长, ...

我可不可以这样呢   就是查询这个数据表中的那一列的列名  例如  2019sx  然后再判断   如果列名相等  那就执行保存   如果列名 = @error   那就创建?
发表于 2019-10-15 11:04:06 | 显示全部楼层
xuanniao110 发表于 2019-10-15 09:23
ADO Recordset 对象属性

请各位大神帮忙看看应该用什么表达   才能获取到的判断值

我可以了解 一下你的用意嗎???

你現在是 是 資料表 裡面 的 欄位名稱 跟 數量 是變動的  而你想知道 資料表裡面 有啥欄位名稱嗎??
发表于 2019-10-15 11:05:35 | 显示全部楼层
xuanniao110 发表于 2019-10-15 09:23
ADO Recordset 对象属性

请各位大神帮忙看看应该用什么表达   才能获取到的判断值

你使用甚麼資料庫作業
 楼主| 发表于 2019-10-15 11:10:19 | 显示全部楼层
kk_lee69 发表于 2019-10-15 11:04
我可以了解 一下你的用意嗎???

你現在是 是 資料表 裡面 的 欄位名稱 跟 數量 是變動的  而你想知道  ...

KK   我是这样的   我利用SQL语句查询数据表01mon中是否有2019sx这一列   如果有,则执行下面的保存操作  如果没有就要新创建2019sx这一列  然后再进行保存  
我用SQL工具  进行SQL语句执行  能得到如图所示的判断值  有此列  那判断值为1  没有此列  那判断值为0  
或者就是另外一种方式   查询数据表01mon中 2019sx 的列名   如果查询出来的列名和我2019sx相等  那就直接执行操作   如果查询出来报错   就执行新创建列  
我不知道我这样表达的意思你能不能明白?
 楼主| 发表于 2019-10-15 11:11:52 | 显示全部楼层
kk_lee69 发表于 2019-10-15 11:05
你使用甚麼資料庫作業

SQLServer  数据库
 楼主| 发表于 2019-10-15 11:15:30 | 显示全部楼层

数据库格式如下  

比如到新的一年了     数据列中没有2019sx   那就应该创建这一列了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-10-15 12:00:47 | 显示全部楼层
xuanniao110 发表于 2019-10-15 11:15
数据库格式如下  

比如到新的一年了     数据列中没有2019sx   那就应该创建这一列了


select b.name from sysobjects as a, syscolumns as b where a.xtype = 'U' and a.id = b.id and a.name='資料表單名稱'
发表于 2019-10-15 12:01:52 | 显示全部楼层
xuanniao110 发表于 2019-10-15 11:15
数据库格式如下  

比如到新的一年了     数据列中没有2019sx   那就应该创建这一列了

先跑


select b.name from sysobjects as a, syscolumns as b where a.xtype = 'U' and a.id = b.id and a.name='資料表單名稱'

把 名稱改為你要查詢的資料表  然後就會列出 所有的欄位名

再去比對  你就知道你缺啥了
 楼主| 发表于 2019-10-15 12:27:31 | 显示全部楼层




执行你给的SQL数据查询语言   不管有没有列   都是执行结果  空白

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-10-15 13:04:09 | 显示全部楼层
xuanniao110 发表于 2019-10-15 12:27
执行你给的SQL数据查询语言   不管有没有列   都是执行结果  空白

你弄錯了
是表名   不是欄位名稱  你錯了 根據你的資料表 你的表名為 01MON
 楼主| 发表于 2019-10-15 13:08:30 | 显示全部楼层
kk_lee69 发表于 2019-10-15 13:04
你弄錯了
是表名   不是欄位名稱  你錯了 根據你的資料表 你的表名為 01MON

那栏位名称要修改的是U?
发表于 2019-10-15 13:09:51 | 显示全部楼层
不是  你先查 你有啥欄位 就會知道 你缺甚麼   

要增加 欄位 是另外的語法 跟這個無關
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 17:45 , Processed in 0.072371 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表