同事寫了一段SQL在SQL2000執行正常,但在SQL2008R2無法執行
SQL中是動態組一段declare cursor的語法
模擬了一下SQL大概如下
declare @sql nvarchar(4000),@c1 nvarchar(10),@c2 int
set @sql = N'declare cur cursor for select ''col1'' as col1 ,1 as col2'
exec sp_executesql @sql
open cur
fetch next from cur into @c1,@c2
while @@FETCH_STATUS = 0
begin
print @c1
fetch next from cur into @c1,@c2
end
close cur
deallocate cur
在SQL2000執行正常,會print出 'col1'
但在SQL2008R2上,回傳了以下的錯誤
Msg 16916, Level 16, State 1, Line 3
A cursor with the name 'cur' does not exist.
Msg 16916, Level 16, State 1, Line 5
A cursor with the name 'cur' does not exist.
Msg 16916, Level 16, State 1, Line 11
A cursor with the name 'cur' does not exist.
Msg 16916, Level 16, State 1, Line 12
A cursor with the name 'cur' does not exist.
後來發現,在SQL2008R2另外幾個DB也可正常執行,就只有某個DB不行
查看了該DB的屬性,最後在option 的設定下有關Cursor的設定,有參數值Default Cursor = LOCAL,改成了GLOBAL後,就可利用dynamical sql宣告CURSOR了
2014年11月9日 星期日
2014年10月24日 星期五
windows 8 安裝sql server 2005無法啟動
為了測試需求要在windows 8安裝sql server 2005 標準版
結果安裝到一半出現錯誤
SQL Error: 29503 — The SQL Server service failed to start
參考這篇文章,解法有點瞎,真的太瞎了....
就是裝到一半出現這個錯誤時先別急取消,
先到一台已安裝過的SQL SERVER 2005目錄下(MSSQL\Binn) 把里頭的sqlos.dll及sqlserver.exe二個檔複製到正在安裝的主機目錄下,然後再按重試(RETRY)鍵,這樣就可以順利完成安裝了
安裝完畢後記得再更新到SP4。
你說 瞎不瞎啊~
結果安裝到一半出現錯誤
SQL Error: 29503 — The SQL Server service failed to start
參考這篇文章,解法有點瞎,真的太瞎了....
就是裝到一半出現這個錯誤時先別急取消,
先到一台已安裝過的SQL SERVER 2005目錄下(MSSQL\Binn) 把里頭的sqlos.dll及sqlserver.exe二個檔複製到正在安裝的主機目錄下,然後再按重試(RETRY)鍵,這樣就可以順利完成安裝了
安裝完畢後記得再更新到SP4。
你說 瞎不瞎啊~
2014年10月6日 星期一
SQL CLR部署到SQL Server 2005問題(6218)
今天將一個原本在SQL 2012上使用的CLR部署到SQL 2005 資料庫,結果出現了以下的錯誤
(161,1): SQL72014: .Net SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 組件 'SQLCLR' 的 CREATE ASSEMBLY 失敗,因為組件 'SQLCLR' 驗證失敗。請檢查參考的組件是否為最新的,而且受信任 (針對 external_access 或不安全) 於資料庫中執行。接著將會出現 CLR 驗證器的訊息 (如果有的話)
(161,0): SQL72045: Script execution error. The executed script:
參考這篇KB
http://msdn.microsoft.com/zh-tw/library/vstudio/dahcx0ww%28v=vs.100%29.aspx
SQL Server 2005 和 SQL Server 2008 僅支援使用 .NET Framework 2.0、3.0 或 3.5 版所建置的 SQL Server 專案。 如果您嘗試部署SQL Server專案,SQL Server 2005或SQL Server 2008,將顯示錯誤消息:Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(在進行校驗是您要部署的程式集的名稱)。
所以要將部署時的Target Framework改為 3.5的版本再部署即OK。
(161,1): SQL72014: .Net SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 組件 'SQLCLR' 的 CREATE ASSEMBLY 失敗,因為組件 'SQLCLR' 驗證失敗。請檢查參考的組件是否為最新的,而且受信任 (針對 external_access 或不安全) 於資料庫中執行。接著將會出現 CLR 驗證器的訊息 (如果有的話)
(161,0): SQL72045: Script execution error. The executed script:
參考這篇KB
http://msdn.microsoft.com/zh-tw/library/vstudio/dahcx0ww%28v=vs.100%29.aspx
SQL Server 2005 和 SQL Server 2008 僅支援使用 .NET Framework 2.0、3.0 或 3.5 版所建置的 SQL Server 專案。 如果您嘗試部署SQL Server專案,SQL Server 2005或SQL Server 2008,將顯示錯誤消息:Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(在進行校驗是您要部署的程式集的名稱)。
所以要將部署時的Target Framework改為 3.5的版本再部署即OK。
2014年9月30日 星期二
SQL Server Openquery Informix unicdoe db
在SQL SERVER 2008R2 10.50.2500 上建立一個LIKED SERVER連結INFORMIX,OPENQUERY時遇到了一個錯誤
testab中只有一個欄位coltest varchar(40),輸入一個UNICODE的字,查詢後出現錯誤
select * from openquery (ifx_v12,'select * from testab')
訊息 7339,層級 16,狀態 1,行 1 連結伺服器 'ifx_v12' 的 OLE DB 提供者 'MSDASQL' 傳回無效的資料給資料行 '[MSDASQL].coltest'。
若改用
execute(N'select * from bev') at ifx_v12
則可執行但回傳的字變成??了
Informix 12.10.FC3WE 64bit dynamic online , CLIENT_LOCALE、SERVER_LOCALE、DB_LOCALE皆為zh_TW.uft8
ODBC為 IBM INFOMRIX ODBC 4.10 FD3DE 64bit版本
測試改用OLE DB ,設好後有以下的錯誤。
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
Cannot initialize the data source object of OLE DB provider "Ifxoledbc" for linked server "ifx_v12". (Microsoft SQL Server, Error: 7303)
找了一些參考 http://www.sqlservercentral.com/Forums/Topic564076-17-1.aspx 也無法連結。
一直都是用ODBC設定LINKED SERVER,但之前的INFORMIX DB都是BIG5沒有問題,這次換成UNICODE版本後就無法正常使用OPENQUERY了。
testab中只有一個欄位coltest varchar(40),輸入一個UNICODE的字,查詢後出現錯誤
select * from openquery (ifx_v12,'select * from testab')
訊息 7339,層級 16,狀態 1,行 1 連結伺服器 'ifx_v12' 的 OLE DB 提供者 'MSDASQL' 傳回無效的資料給資料行 '[MSDASQL].coltest'。
若改用
execute(N'select * from bev') at ifx_v12
則可執行但回傳的字變成??了
Informix 12.10.FC3WE 64bit dynamic online , CLIENT_LOCALE、SERVER_LOCALE、DB_LOCALE皆為zh_TW.uft8
ODBC為 IBM INFOMRIX ODBC 4.10 FD3DE 64bit版本
測試改用OLE DB ,設好後有以下的錯誤。
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
Cannot initialize the data source object of OLE DB provider "Ifxoledbc" for linked server "ifx_v12". (Microsoft SQL Server, Error: 7303)
找了一些參考 http://www.sqlservercentral.com/Forums/Topic564076-17-1.aspx 也無法連結。
一直都是用ODBC設定LINKED SERVER,但之前的INFORMIX DB都是BIG5沒有問題,這次換成UNICODE版本後就無法正常使用OPENQUERY了。
參考幾篇討論,突然發現有人說SQL SERVER不支援UFT8??
再看了幾篇相關的討論文章,東拼西湊後,改回使用ODBC,最後算是找到解法了
1.先進入ODBC 64位元 設定,在Environment 頁籤下,Client Locale設為zh_TW.57372,Database Locale設為zh_TW.57372
2.在Advance頁籤中,勾選 Report Char columns as Wchar columns
3.在IBM Informix Client SDK 4.10 (64-bit)下開啟SetNet32 找到 GL_USEGLU將值設為1 (這個我在ODBC找不到可設定的地方,只能先在SetNet32 下設定)
4.重新啟動SQL SERVER (只要ODBC 參數或SetNet32 值有變動,最好都重啟一下SQL SERVER)
然後OPENQUERY中文字就正常啦,可以select 也可以insert。
再看了幾篇相關的討論文章,東拼西湊後,改回使用ODBC,最後算是找到解法了
1.先進入ODBC 64位元 設定,在Environment 頁籤下,Client Locale設為zh_TW.57372,Database Locale設為zh_TW.57372
2.在Advance頁籤中,勾選 Report Char columns as Wchar columns
3.在IBM Informix Client SDK 4.10 (64-bit)下開啟SetNet32 找到 GL_USEGLU將值設為1 (這個我在ODBC找不到可設定的地方,只能先在SetNet32 下設定)
4.重新啟動SQL SERVER (只要ODBC 參數或SetNet32 值有變動,最好都重啟一下SQL SERVER)
然後OPENQUERY中文字就正常啦,可以select 也可以insert。
2014年9月13日 星期六
IE11 ReportViewer Printer crash
網站是架在WINDOWS 2003 32bit,資料庫則是SQL Server 2005,共用一台主機
開發則是用VS2012 .NET FRAMEWORK4.0,REPORT VIEWER是用
在WINDOWS 7(32 & 64位元)機器上以 IE11測試網站功能,結果RDLC的報表工具列整個走樣。
GOOGLE後,在MASTER PAGE<HEAD>修改
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 為
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
工具列顯示正常了,但印表機圖示不見了??
再GOOGLE,將網站加入相容性檢視後,印表機小圖出現了,初次點選要安裝ACTIVEX元件
,完畢後,按下印表機,結果IE直接CRASH嗝屁了....
再GOOGLE,大都是SQL2008R2後的解決方法,不外乎都是說上到.NET 4.5 以及安裝最新版的 REPORT VIEWER 2012 RUNTIME 就好了。
於是先在WINDOWS 2003安裝REPORT VIEWER 2012 RUNTIME(要先裝SQLSysClrTypes.msi X86版本),但開啟網頁後檢視報表點選印表機圖示時,提示要下載安裝的RSClientPrint卻不是SQLSERVER 2012的版本仍是SQL SERVER 2008版本?
想了半天,原來忘了要更改WEB.CONFIG的設定,將原本RDLC的版本都改為11.0.0.0即可。
幸好是用VIRTUALBOX測試 ,整個再還原重來一次就好。
改好WEB.CONFIG
<system.web><compilation debug="false"><assemblies> 下
<add assembly="Microsoft.ReportViewer.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
<add assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
<pages ...> <controls>下
<add assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" namespace="Microsoft.Reporting.WebForms" tagPrefix="rsweb"/>
<httpHandlers> 下
<add verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" validate="false"/>
YA....印表終於正常了。
開發則是用VS2012 .NET FRAMEWORK4.0,REPORT VIEWER是用
在WINDOWS 7(32 & 64位元)機器上以 IE11測試網站功能,結果RDLC的報表工具列整個走樣。
GOOGLE後,在MASTER PAGE<HEAD>修改
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 為
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
工具列顯示正常了,但印表機圖示不見了??
再GOOGLE,將網站加入相容性檢視後,印表機小圖出現了,初次點選要安裝ACTIVEX元件
,完畢後,按下印表機,結果IE直接CRASH嗝屁了....
再GOOGLE,大都是SQL2008R2後的解決方法,不外乎都是說上到.NET 4.5 以及安裝最新版的 REPORT VIEWER 2012 RUNTIME 就好了。
於是先在WINDOWS 2003安裝REPORT VIEWER 2012 RUNTIME(要先裝SQLSysClrTypes.msi X86版本),但開啟網頁後檢視報表點選印表機圖示時,提示要下載安裝的RSClientPrint卻不是SQLSERVER 2012的版本仍是SQL SERVER 2008版本?
想了半天,原來忘了要更改WEB.CONFIG的設定,將原本RDLC的版本都改為11.0.0.0即可。
幸好是用VIRTUALBOX測試 ,整個再還原重來一次就好。
改好WEB.CONFIG
<system.web><compilation debug="false"><assemblies> 下
<add assembly="Microsoft.ReportViewer.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
<add assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
<pages ...> <controls>下
<add assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" namespace="Microsoft.Reporting.WebForms" tagPrefix="rsweb"/>
<httpHandlers> 下
<add verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" validate="false"/>
YA....印表終於正常了。
2014年8月7日 星期四
MVC Entity存檔錯誤值不能為 null。
Entity Framework 6.0
儲存資料表 呼叫SaveChanges(),出現這個錯誤
值不能為 null。
參數名稱: value
原來建立Eneity Model時,自訂的tt檔忘了維護某個欄位的Data Annotation Display屬性,造成欄位屬性變成
[Display(Name = "")]
public string LogDeptName { get; set; }
一度以為是傳入的欄位內容值有NULL,最後檢查了半天發現每個欄位都有值但為何還有這個錯誤。原來是Model的問題....
註記一下....
儲存資料表 呼叫SaveChanges(),出現這個錯誤
值不能為 null。
參數名稱: value
原來建立Eneity Model時,自訂的tt檔忘了維護某個欄位的Data Annotation Display屬性,造成欄位屬性變成
[Display(Name = "")]
public string LogDeptName { get; set; }
一度以為是傳入的欄位內容值有NULL,最後檢查了半天發現每個欄位都有值但為何還有這個錯誤。原來是Model的問題....
註記一下....
2014年7月11日 星期五
sql server openrowset 匯入文字檔之怪問題..(已解決)
還到一個無解的怪問題
schema.ini 內容如下
[test.txt]
ColNameHeader=False
Format=Delimited(;)
test.txt資料內容如下
test;1234;3FDS
test;1234;6F8S
查詢SQL如下
SELECT * FROM OPENROWSET( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP\;',
'SELECT * FROM test.txt' )
回傳結果如下
F1 F2 F3 F4
test 1234 NULL
test 1234 68.00
F4一欄的值都不對了。
參考 KB說明,在schema.ini加了MaxScanRows=0設定,就正常了
F1 F2 F3
test 1234 3FDS
test 1234 6F8S
巴特....把test.txt資料內容改成如下
test;1234;6F8S
test;1234;3FDS
結果卻又不正確了
F1 F2 F3
test 1234 68.00
test 1234 NULL
?F?S 到底隱藏著什麼密碼學呢?? 只要他放在第一行不管哪一欄就亂套了.....
這是什麼情形啊....無解
2014/07/17 更新
因為讀檔時,這個欄位變成數值型態的機率有點高,後來用了一個撇步去克服。
就是先建一個暫存檔,例temp.txt,里頭只放一筆全部都是字串態的資料行,例
XXXX;XXXX;XXXX
然後在OPENQUERY讀取前,利用xp_cmdshell 先把這個檔利用copy指令與暫存檔合併在一起
copy /b /y temp.txt+test.txt test_new.txt
schema.ini 內容加入MaxScanRows=1,強迫以第一行的型態來設定欄位型態
[test.txt]
ColNameHeader=False
Format=Delimited(;)
MaxScanRows=1
再讀取後排除第一筆暫存資料列,就可以正常寫入檔案內容了
SELECT * FROM OPENROWSET( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP\;',
'SELECT * FROM test_new.txt' ) WHERE F1 <> 'XXXX'
schema.ini 內容如下
[test.txt]
ColNameHeader=False
Format=Delimited(;)
test.txt資料內容如下
test;1234;3FDS
test;1234;6F8S
查詢SQL如下
SELECT * FROM OPENROWSET( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP\;',
'SELECT * FROM test.txt' )
回傳結果如下
F1 F2 F3 F4
test 1234 NULL
test 1234 68.00
F4一欄的值都不對了。
參考 KB說明,在schema.ini加了MaxScanRows=0設定,就正常了
F1 F2 F3
test 1234 3FDS
test 1234 6F8S
巴特....把test.txt資料內容改成如下
test;1234;6F8S
test;1234;3FDS
結果卻又不正確了
F1 F2 F3
test 1234 68.00
test 1234 NULL
?F?S 到底隱藏著什麼密碼學呢?? 只要他放在第一行不管哪一欄就亂套了.....
這是什麼情形啊....無解
2014/07/17 更新
因為讀檔時,這個欄位變成數值型態的機率有點高,後來用了一個撇步去克服。
就是先建一個暫存檔,例temp.txt,里頭只放一筆全部都是字串態的資料行,例
XXXX;XXXX;XXXX
然後在OPENQUERY讀取前,利用xp_cmdshell 先把這個檔利用copy指令與暫存檔合併在一起
copy /b /y temp.txt+test.txt test_new.txt
schema.ini 內容加入MaxScanRows=1,強迫以第一行的型態來設定欄位型態
[test.txt]
ColNameHeader=False
Format=Delimited(;)
MaxScanRows=1
再讀取後排除第一筆暫存資料列,就可以正常寫入檔案內容了
SELECT * FROM OPENROWSET( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP\;',
'SELECT * FROM test_new.txt' ) WHERE F1 <> 'XXXX'
2014年6月11日 星期三
sql server openrowset 匯入文字檔
要匯入一個內含分號(;)相隔的文字檔
在sql server要匯入文字檔或EXCEL檔當然以openrowset為首選的解決方法
可以使用以下二種方式匯入
--適用在32bit SQL SERVER
select * from OpenRowset('MSDASQL','Driver={Microsoft Text Driver (*.txt; *.csv)};
DefaultDir=C:\TEMP;','select * from test_1030612.txt')
適用在32/64 bit SQL SERVER,
但要安裝Microsoft Access Database Engine 2010 可轉散發套件
select * from OpenRowset( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP;',
'SELECT * FROM test_1030612.txt' )
過程中,試了多次 ,整理一個比較可行的方法
因為文字檔附檔名是依日期命名,例:test.1030612,openrowset不接受這種副檔名,執行後會有以下錯誤
Msg 7357, Level 16, State 2, Line 1
無法處理物件 "SELECT * FROM test.1030612"。連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.ACE.OLEDB.12.0" 指出物件沒有資料行,或是目前的使用者沒有使用該物件的權限。
故在讀取前要先將檔案改名為 test_1030612.txt (試改成 test.1030612.txt 也不行...)
檔名更改後,還得要配合Schema.ini的定義(如果是以逗號(,)相隔的文字檔就不用這個檔案設定)
Schema.ini的內容如下,且必需與文字檔案在相同目錄,第一行的檔名一定要和文字檔名一樣,第二行則是設定檔案是否有表頭,第三行則是設定Delimited符號 ,第四行就看是否要加什麼屬性設定,例如檔案內容是unicode,就可以加入CharacterSet=65001
[test_1030612.txt]
ColNameHeader=False
Format=Delimited(;)
1.逗號隔開的文字檔不需schema.ini存在,若要忽略表頭,則需在openrowset加入HDR=No; 屬性設定
2.非逗號隔開的文字檔都要有Schema.ini設定,而且皆以ini內的屬性設定為主
最後寫一段程式來自動化轉入
declare @cmd nvarchar(500),@filename nvarchar(50),@folder nvarchar(20)
declare @tab table (id int identity(1,1), myfile nvarchar(256))
declare @sql nvarchar(4000)
set @folder = 'c:\temp\' --要讀取的目錄
set @cmd = 'dir ' + @folder + 'test.*'
insert into @tab exec master..xp_cmdshell @cmd --目錄下要找的檔名
declare curfile cursor for
select substring(myfile,40,256)
from @tab
where myfile not like '%DIR%' and myfile not like ('%個檔案%')
and myfile not like ('%個目錄%')
and myfile not like ('%磁碟區%')
and myfile not like ('%的目錄%')
and myfile not like '%.ini%'
open curfile
fetch next from curfile into @filename
while @@fetch_status =0
begin
--先換檔名
set @cmd = 'rename ' + @folder+@filename + ' ' + replace(@filename,'.','_')+'.txt'
exec master..xp_cmdshell @cmd
--產生Schema.ini
set @filename = replace(@filename,'.','_')+'.txt'
set @cmd = 'echo [' + @filename+ '] > '+ @folder+'\Schema.ini'
exec master..xp_cmdshell @cmd
set @cmd = 'echo ColNameHeader=False >> '+ @folder+'\Schema.ini'
exec master..xp_cmdshell @cmd
set @cmd = 'echo Format=Delimited(;) >> '+ @folder+'\Schema.ini'
exec master..xp_cmdshell @cmd
--openrowset讀檔
set @sql = N'select * from OpenRowset(''Microsoft.ACE.OLEDB.12.0'',
''Text;Database='+ @folder+';'',
''select * from '+@filename+''') '
exec sp_executesql @sql
fetch next from curfile into @filename
end
close curfile
deallocate curfile
在sql server要匯入文字檔或EXCEL檔當然以openrowset為首選的解決方法
可以使用以下二種方式匯入
--適用在32bit SQL SERVER
select * from OpenRowset('MSDASQL','Driver={Microsoft Text Driver (*.txt; *.csv)};
DefaultDir=C:\TEMP;','select * from test_1030612.txt')
適用在32/64 bit SQL SERVER,
但要安裝Microsoft Access Database Engine 2010 可轉散發套件
select * from OpenRowset( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\TEMP;',
'SELECT * FROM test_1030612.txt' )
過程中,試了多次 ,整理一個比較可行的方法
因為文字檔附檔名是依日期命名,例:test.1030612,openrowset不接受這種副檔名,執行後會有以下錯誤
Msg 7357, Level 16, State 2, Line 1
無法處理物件 "SELECT * FROM test.1030612"。連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.ACE.OLEDB.12.0" 指出物件沒有資料行,或是目前的使用者沒有使用該物件的權限。
故在讀取前要先將檔案改名為 test_1030612.txt (試改成 test.1030612.txt 也不行...)
檔名更改後,還得要配合Schema.ini的定義(如果是以逗號(,)相隔的文字檔就不用這個檔案設定)
Schema.ini的內容如下,且必需與文字檔案在相同目錄,第一行的檔名一定要和文字檔名一樣,第二行則是設定檔案是否有表頭,第三行則是設定Delimited符號 ,第四行就看是否要加什麼屬性設定,例如檔案內容是unicode,就可以加入CharacterSet=65001
[test_1030612.txt]
ColNameHeader=False
Format=Delimited(;)
1.逗號隔開的文字檔不需schema.ini存在,若要忽略表頭,則需在openrowset加入HDR=No; 屬性設定
2.非逗號隔開的文字檔都要有Schema.ini設定,而且皆以ini內的屬性設定為主
最後寫一段程式來自動化轉入
declare @cmd nvarchar(500),@filename nvarchar(50),@folder nvarchar(20)
declare @tab table (id int identity(1,1), myfile nvarchar(256))
declare @sql nvarchar(4000)
set @folder = 'c:\temp\' --要讀取的目錄
set @cmd = 'dir ' + @folder + 'test.*'
insert into @tab exec master..xp_cmdshell @cmd --目錄下要找的檔名
declare curfile cursor for
select substring(myfile,40,256)
from @tab
where myfile not like '%DIR%' and myfile not like ('%個檔案%')
and myfile not like ('%個目錄%')
and myfile not like ('%磁碟區%')
and myfile not like ('%的目錄%')
and myfile not like '%.ini%'
open curfile
fetch next from curfile into @filename
while @@fetch_status =0
begin
--先換檔名
set @cmd = 'rename ' + @folder+@filename + ' ' + replace(@filename,'.','_')+'.txt'
exec master..xp_cmdshell @cmd
--產生Schema.ini
set @filename = replace(@filename,'.','_')+'.txt'
set @cmd = 'echo [' + @filename+ '] > '+ @folder+'\Schema.ini'
exec master..xp_cmdshell @cmd
set @cmd = 'echo ColNameHeader=False >> '+ @folder+'\Schema.ini'
exec master..xp_cmdshell @cmd
set @cmd = 'echo Format=Delimited(;) >> '+ @folder+'\Schema.ini'
exec master..xp_cmdshell @cmd
--openrowset讀檔
set @sql = N'select * from OpenRowset(''Microsoft.ACE.OLEDB.12.0'',
''Text;Database='+ @folder+';'',
''select * from '+@filename+''') '
exec sp_executesql @sql
fetch next from curfile into @filename
end
close curfile
deallocate curfile
2014年5月10日 星期六
oracle client 安裝 - 在SQLServer建立Linked Server
在SQL2008 R2或SQL2012要建立ORACLE 10gR2 linked server
原本用ODBCX64先建立連線,但一直有以下的錯
[Oracle][ODBC][Ora]ORA-12154: TNS:could not resolve the connect identifier specified
GOOGLE後,大都是說需要再安裝X64的ORACLE CLIENT,覺得好麻煩,再找了一下相關資源後,發現應該只需要在那台SQL SERVER 主機安裝ORACLE ODAC應就可以連結ORACLE了。
參考: Installing 64-bit Oracle ODAC 11.2 to Microsoft SQL Server 2008 R2 x64
記錄一下設定方法.
先去ORACLE網站下載ODAC xcopy版
原本先下載12c Release 但建好連結後,卻有"ORA-03134: Connections to this server version are no longer supported."的錯,所以就下載11.2 Release 6的版本
64-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows x64
解壓縮後,因為我只需要安裝ORACLE OLEDB(在SQL SERVER 2008R2的Linked Servers Providers下要可看得到OraOLEDB.Oracle) ,所以在DOS下執行以下安裝指令即可,其中安裝目錄是自已訂的
install.bat oledb c:\oracle_odac true
其他安裝指令可參考解壓縮後目錄ODAC112040Xcopy_64bit下的readme.htm有安裝說明。
按照參考文章的說法,還要做以下設定
1.在系統環境變數下設定一個變數 ORACLE_HOME = C:\oracle_odac,並在Path變數下加入以下C:\oracle_odac;C:\oracle_odac\bin;
2. 打開regedit 在HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_true 下,加入FetchSize =1000 (我是建QWord 64位元)
再將tnsnames.ora copy到c:\oracle_odac\network\admin\下,tnsnames.ora內容如下
ORAC=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.123)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORACDB)
)
)
接著執行以下tsql建立Linked Server
exec sp_addlinkedserver
'ORAServer', --@server 就是linked server名稱
'Oracle', --@srvproduct 隨便寫通常會寫DB產品
'OraOLEDB.Oracle', --@provider使用哪種provider
'myOracle' --@datasrc 要連結的Database name
再建立登入oracle的帳密
exec sp_addlinkedsrvlogin 'ORAServer', 'FALSE',NULL, 'user_name', 'user_password'
然後在Linked Servers Providers下的OraOLEDB.Oracle,按右鍵點選Properties,進入後,將Allow inprocess 選項勾選起來 ,若不勾選,則執行時會有以下錯誤
Msg 7302, Level 16, State 1, Line 1
無法建立連結伺服器 "accs" 的 OLE DB 提供者 "OraOLEDB.Oracle" 的執行個體。
最後重啟動SQL SERVER,然後下一段sql 測試一下
select * from openquery(ORAServer,'select * from all_tables')
應該就可順利查詢了。
ps.如果有安裝PL/SQL Developer工具,則需使用32bit的元件才能連線
32-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows X86
建立另一個目錄進行安裝即可,例 install.bat oledb c:\oracle_odac32 true
然後在系統環境變數建立另一個ORACLE_HOME32 變數及path。
在regedit下的機碼位置為HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_true。
安裝後,開啟 PL/SQL Developer ,在Tools\Preferences\Connection下設定Oracle Home = ORACLE_HOME32及OCI library=C:\oracle_odac32\oci.dll
然後再重開PL/SQL Developer應可正常連線。
原本用ODBCX64先建立連線,但一直有以下的錯
[Oracle][ODBC][Ora]ORA-12154: TNS:could not resolve the connect identifier specified
GOOGLE後,大都是說需要再安裝X64的ORACLE CLIENT,覺得好麻煩,再找了一下相關資源後,發現應該只需要在那台SQL SERVER 主機安裝ORACLE ODAC應就可以連結ORACLE了。
參考: Installing 64-bit Oracle ODAC 11.2 to Microsoft SQL Server 2008 R2 x64
記錄一下設定方法.
先去ORACLE網站下載ODAC xcopy版
原本先下載12c Release 但建好連結後,卻有"ORA-03134: Connections to this server version are no longer supported."的錯,所以就下載11.2 Release 6的版本
64-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows x64
解壓縮後,因為我只需要安裝ORACLE OLEDB(在SQL SERVER 2008R2的Linked Servers Providers下要可看得到OraOLEDB.Oracle) ,所以在DOS下執行以下安裝指令即可,其中安裝目錄是自已訂的
install.bat oledb c:\oracle_odac true
其他安裝指令可參考解壓縮後目錄ODAC112040Xcopy_64bit下的readme.htm有安裝說明。
按照參考文章的說法,還要做以下設定
1.在系統環境變數下設定一個變數 ORACLE_HOME = C:\oracle_odac,並在Path變數下加入以下C:\oracle_odac;C:\oracle_odac\bin;
2. 打開regedit 在HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_true 下,加入FetchSize =1000 (我是建QWord 64位元)
再將tnsnames.ora copy到c:\oracle_odac\network\admin\下,tnsnames.ora內容如下
ORAC=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.123)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORACDB)
)
)
接著執行以下tsql建立Linked Server
exec sp_addlinkedserver
'ORAServer', --@server 就是linked server名稱
'Oracle', --@srvproduct 隨便寫通常會寫DB產品
'OraOLEDB.Oracle', --@provider使用哪種provider
'myOracle' --@datasrc 要連結的Database name
再建立登入oracle的帳密
exec sp_addlinkedsrvlogin 'ORAServer', 'FALSE',NULL, 'user_name', 'user_password'
然後在Linked Servers Providers下的OraOLEDB.Oracle,按右鍵點選Properties,進入後,將Allow inprocess 選項勾選起來 ,若不勾選,則執行時會有以下錯誤
Msg 7302, Level 16, State 1, Line 1
無法建立連結伺服器 "accs" 的 OLE DB 提供者 "OraOLEDB.Oracle" 的執行個體。
最後重啟動SQL SERVER,然後下一段sql 測試一下
select * from openquery(ORAServer,'select * from all_tables')
應該就可順利查詢了。
ps.如果有安裝PL/SQL Developer工具,則需使用32bit的元件才能連線
32-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows X86
建立另一個目錄進行安裝即可,例 install.bat oledb c:\oracle_odac32 true
然後在系統環境變數建立另一個ORACLE_HOME32 變數及path。
在regedit下的機碼位置為HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_true。
安裝後,開啟 PL/SQL Developer ,在Tools\Preferences\Connection下設定Oracle Home = ORACLE_HOME32及OCI library=C:\oracle_odac32\oci.dll
然後再重開PL/SQL Developer應可正常連線。
2014年4月9日 星期三
RDLC Subreport 讀取
設計RDLC時,通常都是習慣先在BISD(後來改叫SSDT) 建一個報表專案,然後撰寫SQL設計LAYOUT確認報表內容沒問題後再將
讀取MAIN RDLC應該不是問題
讀取子報表,只需在原來讀取MAIN RDLC的程式碼加入以下
ReportVierwe1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SetSubReportData);
ReportViewer1.LocalReport.Refresh();
void SetSubReportData(object sender, SubreportProcessingEventArgs e)
{
int sn = int.Parse(e.Parameters["p_sn"].Values[0]); //子表傳遞參數值
string dsname= string.Empty; //每張子表的datasetname,不同子表要給不同名
DataTable dtsource =new DataTable();//報表資料來源,這里是用datatable回傳型態
switch(e.ReportPath) //依子表名稱(rdlc的檔名)來讀取資料
{
case "rdlcname1":
dsname = "DS1"; //dataset name in rdlc
dt = datasource1; //your sql data table ,code by self
break;
case "rdlcname1":
dsname = "DS2"; //dataset name in rdlc
dt = datasource2; //your sql data table ,code by self
break;
}
e.DataSources.Add(new ReportDataSource(dsname,dt )); //設定來源
}
讀取MAIN RDLC應該不是問題
讀取子報表,只需在原來讀取MAIN RDLC的程式碼加入以下
ReportVierwe1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SetSubReportData);
ReportViewer1.LocalReport.Refresh();
void SetSubReportData(object sender, SubreportProcessingEventArgs e)
{
int sn = int.Parse(e.Parameters["p_sn"].Values[0]); //子表傳遞參數值
string dsname= string.Empty; //每張子表的datasetname,不同子表要給不同名
DataTable dtsource =new DataTable();//報表資料來源,這里是用datatable回傳型態
switch(e.ReportPath) //依子表名稱(rdlc的檔名)來讀取資料
{
case "rdlcname1":
dsname = "DS1"; //dataset name in rdlc
dt = datasource1; //your sql data table ,code by self
break;
case "rdlcname1":
dsname = "DS2"; //dataset name in rdlc
dt = datasource2; //your sql data table ,code by self
break;
}
e.DataSources.Add(new ReportDataSource(dsname,dt )); //設定來源
}
2014年3月25日 星期二
SQL Server 不允許遠端連接
一台機器,原本裝了SQL Server 2005 Express, Instance Name 為ABC。(port:1433)
後來,在同一台機器上又裝了SQL Server 2005 Standard+SP4,Instance Name為XYZ。(port 1533)
結果當由外部透過另一台機器的SSMS連線到XYZ時,出現了以下的訊息
在建立連接至伺服器時發生錯誤。當連接至 SQL Server 2005 時,失敗的原因可能是,在預設設定下,SQL Server 不允許遠端連接。 (provider: SQL 網路介面, error: 26 - 搜尋指定的伺服器/執行個體時發生錯誤) (Microsoft SQL Server, 錯誤: -1)
先檢查防火牆,該機器皆有設定以上的例外連接埠。
再查看SQL SERVER DAC也是有開啟的。
後來再試了幾台機器的SSMS都有相同的錯誤,只有其中一台機器可正常連線。
利用netstat-b查看連接埠,確定都是1533。
後來只好在伺服器以指定連接埠的方式連線,像這樣
192.168.0.111\XYZ,1533
就可以正常登入了。
後來,在同一台機器上又裝了SQL Server 2005 Standard+SP4,Instance Name為XYZ。(port 1533)
結果當由外部透過另一台機器的SSMS連線到XYZ時,出現了以下的訊息
在建立連接至伺服器時發生錯誤。當連接至 SQL Server 2005 時,失敗的原因可能是,在預設設定下,SQL Server 不允許遠端連接。 (provider: SQL 網路介面, error: 26 - 搜尋指定的伺服器/執行個體時發生錯誤) (Microsoft SQL Server, 錯誤: -1)
先檢查防火牆,該機器皆有設定以上的例外連接埠。
再查看SQL SERVER DAC也是有開啟的。
後來再試了幾台機器的SSMS都有相同的錯誤,只有其中一台機器可正常連線。
利用netstat-b查看連接埠,確定都是1533。
後來只好在伺服器以指定連接埠的方式連線,像這樣
192.168.0.111\XYZ,1533
就可以正常登入了。
2014年3月20日 星期四
WindowsXP SP2 SSL 網站無法連線
最近一個新系統上線後,有些人連登入頁都看不到,出現無法連線。
都是WINXP+IE8 的環境。 但同樣的環境有人可以看得到首頁有人則不行。
模擬了可能的VM環境測試也都很正常。
無意中發現只要是WINXP SP2的環境都有問題,升級到SP3後就都正常了。
後來看到這篇文章,才知道WINXP SP2不支援SHA2。
到GCA網站問與答即可查到
都是WINXP+IE8 的環境。 但同樣的環境有人可以看得到首頁有人則不行。
模擬了可能的VM環境測試也都很正常。
無意中發現只要是WINXP SP2的環境都有問題,升級到SP3後就都正常了。
後來看到這篇文章,才知道WINXP SP2不支援SHA2。
SHA2 and Windows
因為網站申請的SSL是SHA2 2048位元,WINDOWS XP SP2以前是不支援SHA2功能的。到GCA網站問與答即可查到
15 | 請問SHA2憑證之支援性為何? |
2014年1月6日 星期一
informix GLS-cr
informix DB 版本 更新到IBM Informix Dynamic Server Version 11.50.FC9
無法查詢條件 like '許%'
因為許這個字的low byte 為\,造成系統誤判後頭字元為保留字,所以無法正確查詢。
更新DB後需再次安裝GLS以確保中文查詢正確。
無法查詢條件 like '許%'
因為許這個字的low byte 為\,造成系統誤判後頭字元為保留字,所以無法正確查詢。
更新DB後需再次安裝GLS以確保中文查詢正確。
訂閱:
文章 (Atom)
自動記錄滑鼠點選操作
為了一個需求,需要人工去點選幾個滑鼠的點選行為,找了幾種工具,覺得GS Auto Clicker最實用,極符合我的需求,尤其是多個固定位置的button點擊,解決了一個很耗時間的工作。 最後設定完預設hotkey F8為啟用鍵,就可以開始自動做工了。再按F8結束工作。 GS Au...
-
上網找了免費的白箱檢測工具,找到了 puma scan 因為支援OWASP TOP 10的檢測,所以這是一個符合客戶需求又能與Visual studio結合的工具(白話說...交差了事矣....) 更重要的是這不用錢....檢測工具都貴森森的,尤其是源碼檢測工具。 ht...
-
建了一個工作排程,定時執行batch檔。 batch中寫了一段xcopy,主要針對有異動較新檔案時才複製。 echo off for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find...
-
改用SQL Server Management Studio 2017有一段時間了。 在執行一段之前寫的SQL要組出一段語法時,里頭包含了使用CHAR(10)當作換行符號的文字,在輸出結果中,使用複製貼上的方式要進行執行時,發現換行符號都失效了。 但如果使用Results...