[已解决]关于查找与判断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
#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
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
能创建新列了 chzj589 发表于 2019-10-13 10:04
#cs ____________________________________
例子: ...
请问大哥 这个表示什么意思 $RS.fields.count
xuanniao110 发表于 2019-10-13 11:20
请问大哥 这个表示什么意思 $RS.fields.count
请问 怎么在AU3中来判断 这个执行结果?
$RS.fields.count 这样的写法是不对的 怎么判断都是1
xuanniao110 发表于 2019-10-13 11:47
请问 怎么在AU3中来判断 这个执行结果?
$RS.fields.count 这样的写法是不对的 怎么判断 ...
打开数据库文件,读取指定表所有字段名称 本帖最后由 xuanniao110 于 2019-10-13 13:05 编辑
chzj589 发表于 2019-10-13 12:17
打开数据库文件,读取指定表所有字段名称
请问 怎么在AU3中来判断 这个执行结果?
$RS.fields.count 这样的写法是不对的 怎么判断都是1
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
chzj589 发表于 2019-10-13 13:08
2楼代码能读取ACCESS数据库表里的字段名
判断一下表中是否字段名的存在
好 只有试试你这种方法了 SELECT name FROM sys.columns WHERE object_id=object_id('table')
可以得到表中的所有列清单,自己再搜索下 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: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: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 xuanniao110 发表于 2019-10-14 16:13
你用的是ACCESS数据库吗?
看来帮不了你,我用的语法不一样。 chzj589 发表于 2019-10-14 17:04
你用的是ACCESS数据库吗?
看来帮不了你,我用的语法不一样。
是 SQLServer数据库 不是 ACCESS