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.dllsqlserver.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。

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了。

參考幾篇討論,突然發現有人說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。

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....印表終於正常了。

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的問題....

註記一下....


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'

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
 


VS CODE離線安裝套件方式-續

去年 vscode離線安裝 powershell nupkg 今年在一台無外網的 windwos 2025上安裝時遇到了powershell版本一直讀取到了5.1的版本,鬼打牆了一下午,在VM還原重測測了好幾回,應該是可行了。 將下載到的免安裝powershell 解壓縮到...