xuanniao110 发表于 2019-10-13 09:14:59

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

本帖最后由 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 ADD [" & $yjhlm & "] FLOAT DEFAULT 'null'")
                              $RS.close
                              $addfld.close
                        EndIf

chzj589 发表于 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

xuanniao110 发表于 2019-10-13 11:09:08

chzj589 发表于 2019-10-13 10:04

#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

能创建新列了   

xuanniao110 发表于 2019-10-13 11:20:49

chzj589 发表于 2019-10-13 10:04

#cs ____________________________________
例子:         ...

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

xuanniao110 发表于 2019-10-13 11:47:25

xuanniao110 发表于 2019-10-13 11:20
请问大哥    这个表示什么意思   $RS.fields.count


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

chzj589 发表于 2019-10-13 12:17:33

xuanniao110 发表于 2019-10-13 11:47
请问   怎么在AU3中来判断   这个执行结果?
$RS.fields.count    这样的写法是不对的   怎么判断 ...

打开数据库文件,读取指定表所有字段名称

xuanniao110 发表于 2019-10-13 13:03:57

本帖最后由 xuanniao110 于 2019-10-13 13:05 编辑

chzj589 发表于 2019-10-13 12:17
打开数据库文件,读取指定表所有字段名称
请问   怎么在AU3中来判断   这个执行结果?
$RS.fields.count    这样的写法是不对的   怎么判断都是1


chzj589 发表于 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

xuanniao110 发表于 2019-10-13 13:17:37

chzj589 发表于 2019-10-13 13:08
2楼代码能读取ACCESS数据库表里的字段名
判断一下表中是否字段名的存在



好   只有试试你这种方法了

yhxhappy 发表于 2019-10-14 10:40:07

SELECT name FROM sys.columns WHERE object_id=object_id('table')

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

xuanniao110 发表于 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   这个表示列数
但是返回值   真的不知道怎么表达
http://www.autoitx.com/data/attachment/forum/201910/13/130445evf787fdfvri0r7v.pnghttp://www.autoitx.com/data/attachment/forum/201910/13/114555patt824di6du46pp.png
就是图片上显示的执行结果COLUMN1   不知道在AU3中怎么表达   
数据库的语句   我是知道的

chzj589 发表于 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 ; 遍历 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


xuanniao110 发表于 2019-10-14 16:13:08

本帖最后由 xuanniao110 于 2019-10-14 16:16 编辑

chzj589 发表于 2019-10-14 16:00
是这样子吗?

#cs ____________________________________
...
Case $Msg = $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('')")
                              $RS.open("select count(*) from information_schema.columns where table_name = '' and column_name = '2019sx'");判断有没有此列.如果有此列返回值为1没此列返回值为0
;~                                 $RS.Open("select COLUMN_NAME from information_schema.COLUMNS where table_name = '' 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 = '' 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

chzj589 发表于 2019-10-14 17:04:14

xuanniao110 发表于 2019-10-14 16:13


你用的是ACCESS数据库吗?
看来帮不了你,我用的语法不一样。

xuanniao110 发表于 2019-10-14 18:52:58

chzj589 发表于 2019-10-14 17:04
你用的是ACCESS数据库吗?
看来帮不了你,我用的语法不一样。

是   SQLServer数据库   不是 ACCESS
页: [1] 2 3 4
查看完整版本: [已解决]关于查找与判断SQL表中列的存在问题,请指教怎么判断有或者无