找回密码
 加入
搜索
查看: 10498|回复: 59

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

[复制链接]
发表于 2019-10-13 09:14:59 | 显示全部楼层 |阅读模式
本帖最后由 xuanniao110 于 2019-10-16 13:34 编辑

如题
在搞一个程序需要判断数据表中一列是否存在    如果存在  则继续执行    如果不存在   则新建列
在判断是否存在列名的方向屡次失败,程序报错!请各位指点一二
如果数据表中有列名 则程序不会报错  继续执行  没任何问题
代码如下:
$mon = GUICtrlRead($Combo4);读取月份
                        $yjhlm = @YEAR
                        $addfld = ObjCreate("ADODB.Connection")
                        $addfld.Open("driver={SQL Server};server=" & $mdb_data_Server & ";uid=" & $mdb_data_id & ";pwd=" & $mdb_data_pwd & ";database=" & $mdb_data_Company)
                        $RS = ObjCreate("ADODB.Recordset")
                        $RS.ActiveConnection = $addfld
                        $RS.Open("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'YJH' and COLUMN_NAME = '" & $yjhlm & "'")
                        $yjhbm = $RS.Fields(0).value
                        $RS.close
                        $addfld.close
                        If $yjhbm = $yjhlm Then
                                ysz()
                        Else
                                $addfld = ObjCreate("ADODB.Connection")
                                $addfld.Open("driver={SQL Server};server=" & $mdb_data_Server & ";uid=" & $mdb_data_id & ";pwd=" & $mdb_data_pwd & ";database=" & $mdb_data_Company)
                                $RS = ObjCreate("ADODB.Recordset")
                                $RS.ActiveConnection = $addfld
                                $RS.Open("ALTER TABLE [YJH] ADD [" & $yjhlm & "] FLOAT DEFAULT 'null'")
                                $RS.close
                                $addfld.close
                        EndIf
发表于 2019-10-13 10:04:33 | 显示全部楼层

#cs ____________________________________
 例子:        示例 2
 描述:        打开数据库文件,读取指定表所有字段名称
 语法:        SELECT * FROM 表名称
 参数:        $RS.fields.count = 字段总数
              $RS.fields($I).name = 字段名
#ce _______________脚本开始_________________
#AutoIt3Wrapper_UseX64 = n
$adSource = @ScriptDir & "\DB1.mdb"
$adTable = "Table1"
$addfld = ObjCreate("ADODB.Connection")
$addfld.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $adSource)
$RS = ObjCreate("ADODB.Recordset")
$RS.ActiveConnection = $addfld
$RS.Open("SELECT * FROM " & $adTable)
$Fc = $RS.fields.count
If $Fc > 0 Then
        $Rtn = ''
        For $I = 0 To $Fc - 1
                $Rtn &= $RS.fields($I).name & '|'
                MsgBox(0, "搜索结果", $RS.fields($I).name)
        Next
        MsgBox(0, "搜索结果", $Rtn)
EndIf
$RS.close
$addfld.Close
 楼主| 发表于 2019-10-13 11:09:08 | 显示全部楼层
chzj589 发表于 2019-10-13 10:04
[au3]
#cs ____________________________________
例子:         ...

我这边继续探索了下   SQL   
select count(*) from information_schema.columns where table_name = '" & $mon & "mon" & "'  and column_name = '" & $sxlm & "'
能得到 column的值    如果有   则是  1   如果没有则是 0
修改代码如下:
                $conn = ObjCreate("ADODB.Connection")
                $RS = ObjCreate("ADODB.Recordset")
                $conn.Open("driver={SQL Server};server=" & $mdb_data_Server & ";uid=" & $mdb_data_id & ";pwd=" & $mdb_data_pwd & ";database=" & $mdb_data_Company)
                $RS.ActiveConnection = $conn
;~              $RS.open("select COLUMN_NAME from information_schema.COLUMNS where table_name = '" & $mon & "mon" & "' and COLUMN_NAME = '" & $sxlm & "'")
                $RS.open("select count(*) from information_schema.columns where table_name = '" & $mon & "mon" & "'  and column_name = '" & $sxlm & "'")
;~                                 select count(*) from information_schema.columns where table_name = '" & $mon & "mon" & "'  and column_name = '" & $sxlm & "'
                                If @error = 0 Then 
                                $conn = ObjCreate("ADODB.Connection")
                $RS = ObjCreate("ADODB.Recordset")
                $conn.Open("driver={SQL Server};server=" & $mdb_data_Server & ";uid=" & $mdb_data_id & ";pwd=" & $mdb_data_pwd & ";database=" & $mdb_data_Company)
                $RS.ActiveConnection = $conn
                                $RS.Open("ALTER TABLE [" & $mon & "mon" & "] ADD [" & $sxlm & "] FLOAT DEFAULT 'null'")
                                $conn.close
                                Else
                                MsgBox(0,"实销列名",$sxlm)
                                EndIf

能创建新列了   
 楼主| 发表于 2019-10-13 11:20:49 | 显示全部楼层
chzj589 发表于 2019-10-13 10:04
[au3]
#cs ____________________________________
例子:         ...

请问大哥    这个表示什么意思   $RS.fields.count

 楼主| 发表于 2019-10-13 11:47:25 | 显示全部楼层
xuanniao110 发表于 2019-10-13 11:20
请问大哥    这个表示什么意思   $RS.fields.count


请问   怎么在AU3中  来判断   这个执行结果?
$RS.fields.count    这样的写法是不对的   怎么判断都是1

本帖子中包含更多资源

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

×
发表于 2019-10-13 12:17:33 | 显示全部楼层
xuanniao110 发表于 2019-10-13 11:47
请问   怎么在AU3中  来判断   这个执行结果?
$RS.fields.count    这样的写法是不对的   怎么判断 ...

打开数据库文件,读取指定表所有字段名称
 楼主| 发表于 2019-10-13 13:03:57 | 显示全部楼层
本帖最后由 xuanniao110 于 2019-10-13 13:05 编辑
chzj589 发表于 2019-10-13 12:17
打开数据库文件,读取指定表所有字段名称

请问   怎么在AU3中  来判断   这个执行结果?
$RS.fields.count    这样的写法是不对的   怎么判断都是1


本帖子中包含更多资源

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

×
发表于 2019-10-13 13:08:50 | 显示全部楼层
xuanniao110 发表于 2019-10-13 13:03
xuanniao110 发表于 2019-10-13 11:20
请问大哥    这个表示什么意思   $RS.fields.count

2楼代码能读取ACCESS数据库表里的字段名
判断一下表中是否字段名的存在

$Fc = $RS.fields.count
If $Fc > 0 Then
        $Rtn = ''
        $Rtn1 = 'kname6';搜索字段名
        For $I = 0 To $Fc - 1
                $Rtn &= $RS.fields($I).name & '|'
                MsgBox(0, "搜索结果", $RS.fields($I).name, 1)
        Next
        If $Rtn1 = $Rtn Then
                MsgBox(0, "结果", $Rtn, 1)
        Else
                MsgBox(0, "搜索结果", "表里未有字段名  " & $Rtn1)
        EndIf
        MsgBox(0, "搜索结果", $Rtn)
EndIf
$RS.close
$addfld.Close
 楼主| 发表于 2019-10-13 13:17:37 | 显示全部楼层
chzj589 发表于 2019-10-13 13:08
2楼代码能读取ACCESS数据库表里的字段名
判断一下表中是否字段名的存在
[au3]

好   只有试试你这种方法了
发表于 2019-10-14 10:40:07 | 显示全部楼层
SELECT name FROM sys.columns WHERE object_id=object_id('table')

可以得到表中的所有列清单,自己再搜索下
 楼主| 发表于 2019-10-14 13:39:58 | 显示全部楼层
yhxhappy 发表于 2019-10-14 10:40
SELECT name FROM sys.columns WHERE object_id=object_id('table')

可以得到表中的所有列清单,自己再 ...

SQL数据库   select count(*) from information_schema.columns where table_name = '01mon' and column_name = '2019sx'   查询数据表01mon 中 2019sx 列是否存在  
在SQL数据库上运行  如果列存在  会返回值1   不存在  会返回值0   我现在卡在怎么来获取这个返回值   在AU3中不知道怎么表达
在数据集中  也就是$RS = ObjCreate("ADODB.Recordset")   $RS.Fields.count   这个表示列数
但是返回值   真的不知道怎么表达

就是图片上显示的  执行结果  COLUMN1   不知道在AU3中怎么表达   
数据库的语句   我是知道的

发表于 2019-10-14 16:00:35 | 显示全部楼层
本帖最后由 chzj589 于 2019-10-14 16:01 编辑
xuanniao110 发表于 2019-10-14 13:39
SQL数据库   select count(*) from information_schema.columns where table_name = '01mon' and column_ ...

是这样子吗?

#cs ____________________________________
        例子:        示例 2
        描述:        打开数据库文件,读取指定表所有字段名称
        语法:        SELECT * FROM 表名称
        参数:        $RS.fields.count = 字段总数
        $RS.fields($I).name = 字段名
#ce _______________脚本开始_________________
#AutoIt3Wrapper_UseX64 = n
$adSource = @ScriptDir & "\----.mdb";数据库文件
$adTable = "01mon";数据库文件表名称--查询数据表01mon 中 2019sx
$mdb_data_key = "12345";数据库密码
$addfld = ObjCreate("ADODB.Connection")
$addfld.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $adSource)
;$addfld.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $adSource & ";Jet Oledb:Database Password=" & $mdb_data_key)
$RS = ObjCreate("ADODB.Recordset")
$RS.ActiveConnection = $addfld
$RS.Open("SELECT * FROM " & $adTable)
$Fc = $RS.fields.count
If $Fc > 0 Then
        $sComboTxt = ''
        $Rtn = ''
        $Rtn1 = '2019sx';搜索字段名
        For $I = 0 To $Fc - 1
                $Rtn &= $RS.fields($I).name & '|'
                $Rtna = $RS.fields($I).name
                If Not StringInStr($sComboTxt, $Rtna) Then $sComboTxt &= $Rtna & '|'
        Next
        Local $aDays = StringSplit($sComboTxt, "|") ; 使用分隔符 "," 和默认标志值拆分字符串.
        Local $a = "未有"
        Local $aa = "0"
        For $I = 1 To $aDays[0] ; 遍历 StringSplit() 返回的数组, 循环显示单个值.
                $Rtn2 = $aDays[$I]
                If StringInStr($Rtn2, $Rtn1) Then ;如果搜索字段名中包含“kname2”,认定有字段名,执行。。。。。
                        $a = "有"
                        $aa = "1"
                EndIf
        Next
        MsgBox(0, "搜索结果", $sComboTxt & @CRLF & "表里" & $a & "字段名  =  " & $aa)
EndIf
$RS.close
$addfld.Close


 楼主| 发表于 2019-10-14 16:13:08 | 显示全部楼层
本帖最后由 xuanniao110 于 2019-10-14 16:16 编辑
chzj589 发表于 2019-10-14 16:00
是这样子吗?
[au3]
#cs ____________________________________
...
Case $Msg[0] = $Button4 ;保存
                        $mon = GUICtrlRead($Combo1) ;读取月份
                        $new_year = GUICtrlRead($Combo3) ;读取年份
                        If $new_year <> @YEAR Then
                                GUICtrlSetData($Edit1, "输入年份与当前年份有出入,无法保存到数据库!")
                        Else
                                $sxlm = $new_year & "sx"
                                $cslm = $new_year & "cs"
                                $conn = ObjCreate("ADODB.Connection")
                                $RS = ObjCreate("ADODB.Recordset")
                                $conn.Open("driver={SQL Server};server=" & $mdb_data_Server & ";uid=" & $mdb_data_id & ";pwd=" & $mdb_data_pwd & ";database=" & $mdb_data_Company)
                                $RS.ActiveConnection = $conn
;~                                 $pdz = $RS.open("select * from [" & $mon & "mon" & "]")
;~                                 $pdz = $RS.open("select 1 from syscolumns where name = '2019sx' and id = object_id('[01mon]')")
                                $RS.open("select count(*) from information_schema.columns where table_name = '[01mon]' and column_name = '2019sx'");判断有没有此列.如果有此列返回值为1  没此列返回值为0
;~                                 $RS.Open("select COLUMN_NAME from information_schema.COLUMNS where table_name = '[01mon]' and COLUMN_NAME = '2019sx'") ;读取这一列的列名称
;~                                 select 1 from syscolumns where name = '2019sx' and id = object_id('01mon')
;~              select count(*) from information_schema.columns where table_name = '[01mon]' and column_name = '2019sx'
                                $ls = $RS.Fields.count;此位置真不知道在AU3中是如何用数据集里面的参数来表达返回值的
;~                                 $RS.Fields.count;这是数据集中表示返回表中有多少列的表达式
;~                                 $RS.Fields.value;这是数据集中表示返回数据的表达式
                                MsgBox(0, "判断值", $ls)
                                If $ls = 1 Then
                 bc()
                                Else
                                        $conn = ObjCreate("ADODB.Connection")
                                        $RS = ObjCreate("ADODB.Recordset")
                                        $conn.Open("driver={SQL Server};server=" & $mdb_data_Server & ";uid=" & $mdb_data_id & ";pwd=" & $mdb_data_pwd & ";database=" & $mdb_data_Company)
                                        $RS.ActiveConnection = $conn
                                        $RS.Open("ALTER TABLE [" & $mon & "mon" & "] ADD [" & $sxlm & "] FLOAT DEFAULT 'null'")
                                        $RS.Open("ALTER TABLE [" & $mon & "mon" & "] ADD [" & $cslm & "] FLOAT DEFAULT 'null'")
                                        $conn.close
                                        bc()
;~                                         EndIf
                                EndIf
                        EndIf
发表于 2019-10-14 17:04:14 | 显示全部楼层

你用的是ACCESS数据库吗?
看来帮不了你,我用的语法不一样。
 楼主| 发表于 2019-10-14 18:52:58 | 显示全部楼层
chzj589 发表于 2019-10-14 17:04
你用的是ACCESS数据库吗?
看来帮不了你,我用的语法不一样。

是   SQLServer  数据库   不是 ACCESS
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-24 11:04 , Processed in 0.083185 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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