2016年11月8日 星期二

超過 249 個非叢集索引或資料行統計資料

SQL Server 2000,一個資料表上要建立索引時,出現以下訊息,

不得在一個資料表上建立超過 249 個非叢集索引或資料行統計資料

Cannot create more than 249 nonclustered indices or column statistics on one table.


 先查看索引數,當然不可能有249個,所以查詢了統計資訊。

select 'drop statistics '+object_name(a.id)+'.'+a.name 
   from  sysindexes a inner join .sysindexkeys b
     on a.id = b.id and a.indid = b.indid inner join syscolumns  c
     on b.id = c.id and b.colid = c.colid
  where indexproperty(a.id, a.name, 'IsStatistics') = 1 
    and object_name(a.id) = 'your_table'  


先確認是否已有249個統計值,如果有,就先刪除不要的,再建一次index應該就行了。

2016年10月20日 星期四

JSON回傳內容含backslash

同事提供一段使用C# MVC 寫的JSON回傳

return Json(JsonConvert.SerializeObject(new { status = "SUCCESS", message = "資料傳送成功" }), "text/html", JsonRequestBehavior.AllowGet);
結果回傳

"{\"status\":\"SUCCESS\",\"message\":\"資料傳送成功\"}" 

 
他問說可否不要反鈄線 及前後的雙引號,要像這樣

{"status":"SUCCESS","message":"資料傳送成功"}

 查了一下,原來是JsonConvert.SerializeObject造成的,改用物件傳入就可以解決了。

改成以下這樣,就OK了

var data = new { status = "SUCCESS", message = "資料傳送成功" };
 
return Json(data, "application/json", JsonRequestBehavior.AllowGet);

記錄一下....


2016年9月23日 星期五

IE IFRAME 遺失SESSION問題

在一個ASP開發的網站,以IFRAME方式顯示另一個網站的MVC WEBSITE功能。

結果在部份機器的IE瀏覽器上,會有SESSION遺失的問題。但在FIREFOX或GOOGLE CHROME上則不會有問題。

找了很久,突然想到在之前舊的WEB FORM網站,在頁面Page_Load事件會加入一段程式碼

 HttpContext.Current.Response.AddHeader("p3p", "CP=""IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT""")





於是在新網站,Global.asax.cs檔加入以下事件及程式碼


 protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
        }

  
解決問題了.       

2016年8月22日 星期一

iisreset無法啟動



查看事件檢視器


按著錯誤訊息開啟相關服務,iisreset 就OK了.

windows問題,先看事件檢視器,十之八九都能找到蛛絲馬跡。

2016年7月7日 星期四

bcp 轉出uft-8 檔案

sql server 2014前的版本的bcp 不支援匯出utf-8格式。

但sql server 2016的bcp則已有支援,以下是MSDN上的說明

13 版之前的版本 (SQL Server 2016) 不支援字碼頁 65001 (UTF-8 編碼)。 開頭為 13 的版本可以將 UTF-8 編碼匯入舊版的 SQL Server。

測了一下,DB仍是用SQL 2014,然後去下載sql 2016的odbc driver 13及command line utilities 13,可轉出UTF-8格式資料。

Microsoft® ODBC Driver 13 (Preview) for SQL Server® – Windows

Microsoft® Command Line Utilities 13 for SQL Server®

安裝後,使用C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\下的bcp 來進行資料轉出,如不確定bcp版本,可執行

bcp -v



最後指定code page完成UFT-8檔的轉出囉.

"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\bcp" "exec zspTest 123" queryout "c:\temp\test.csv" -cC65001 -T -StestServer

2016年7月2日 星期六

informix Routine (equal) can not be resolved

使用TSQL慣了,再來寫其他資料庫的SQL時都覺得好痛苦。

尤其是寫INFORMIX的STORED PROCEDURE,更是覺得自已的效率好低。

因為不習慣在VI下編輯(足以證明我年紀還沒老到那個TERMINAL MODE的年代...),所以通常都是用NOTEPAD++寫好,再貼到VI下執行dbaccess(其實是VI不太會用啦...)

今天寫了一個漏漏長的SP,執行後一直有個錯誤

informix Routine (equal) can not be resolved

搞啥啊,找了半天根本也沒有一個叫equal的函數,用debug file方式下trace,才發現原來有一段SQL做了二個欄位的比較,回傳boolean的型態,結果我用了數值0/1來判斷造成的錯誤。(應該要用 variablename = 'T' 或 variablename = 'F'來判斷)

這訊息也太不直覺了吧。

每次寫完一個SP,都有點昏的感覺。

2016年5月20日 星期五

ASP.MVC dropdownlistfor selected not binding

使用ViewBag方式進行前端VIEW的下拉選單binding。
其中有個欄位的下拉選單一直無法顯示正確的值。

測了半個小時,看到這一篇,才猛然想到....這個問題以前同事講過啊....
 
http://stackoverflow.com/questions/2278056/dropdownlistfor-not-selecting-value


總之ViewBag的名稱不要取得和欄位名稱一樣,MVC會發瘋的。

2016年4月8日 星期五

SQLServer備份與還原

有錢做備份很好,花錢買軟體,OP還會幫你還原。
沒錢做備份也好,花心血練習,以後還到事就【大丈夫】 囉。

只有一台SQL SERVER主機,這樣設計
每天做一次資料庫完整備份,並複製到另一台主機做檔案備份 。
每天每30分鐘做一次交易備份, 並複製到另一台主機做檔案備份 。
 
機器掛掉時 ,找一台相同版本DB的主機,把最後一次完整DB備份還原,依序將交易日誌還原,運氣好的話,RPO ( Recovery Point Objective )可忍受資料遺失的時間長度為30分鐘或1小時。
就看系統重不重要,急迫性如何了。
 
備份指令

use master
go
--step 1: 每天完整的備份資料  
declare @fileName = 'MyDB_' + right( '00'+ cast(datepart(day,getdate()) as nvarchar(10)),2) +'.bak'
BACKUP DATABASE MyDB TO DISK = @fileName
WITH COMPRESSION ,NOFORMAT, INIT,  NAME = N'完整 資料庫 備份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10 

--step 2:每天完整備份後的第一次LOG備份要為INIT, 且LOG命名固定
declare @logname nvarchar(50)
set @logname =(select 'D:\DBLog\MyDB_'+  convert(char(8),getdate(),112)+'_first.TRN')
BACKUP LOG MyDB TO DISK = @logname WITH COMPRESSION,INIT
GO

--step 3:每小時備份LOG
set @logname =(select 'D:\DBLog\MyDB_'+  convert(char(8),getdate(),112)+'_'+ right('00'+cast(datepart(hour,getdate()) as nvarchar(4)),2) +
                       case when datepart(minute,getdate()) <=30 then '00' else '30' end  +'.TRN')
BACKUP LOG MyDB TO DISK = @logname WITH COMPRESSION
GO


還原指令
 --獨佔
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
go
--Restore到上一個完整的備份
RESTORE DATABASE MyDB FROM DISK = 'C:\temp\DB\MyDB_07.BAK' WITH NORECOVERY,  REPLACE
GO

--依序還原前一日完整DB備份後的第一個TRN檔,以WITH NORECOVERY 才可逐檔還原
RESTORE LOG MyDB FROM  DISK = 'C:\temp\Log\MyDB_20160407_first.TRN' WITH NORECOVERY
GO
--產出LOG還原指令
declare @stm datetime,@etm datetime,@tm datetime,@sql nvarchar(200)
set @stm='2016/04/07 22:00:00'
set @etm = '20104/08 19:00:00'
while @stm <= @etm
begin
   set @sql =(select 'RESTORE LOG MyDB FROM DISK = ''C:\temp\Log\MyDB_' +
                       convert(char(8),@stm,112)+'_'+ right('00'+cast(datepart(hour,@stm) as nvarchar(4)),2) +
                          right('00'+ cast(datepart(minute,@stm) as nvarchar(4)) ,2)  +'.TRN'' WITH NORECOVERY ;'  ) 
   set @stm = dateadd(minute,30,@stm)
   exec sp_executesql @sql
end
--最後強制回復
RESTORE DATABASE MyDB WITH RECOVERY,REPLACE

--切為多人模式
ALTER DATABASE MyDB SET MULTI_USER WITH ROLLBACK IMMEDIATE
go

2016年4月7日 星期四

RDLC匯出PDF無法正確顯示中文問題

人客反應,RDLC上的一張表,畫面上預覽中文都很正常,但匯出成PDF後,有一個中文字變成口了。


咦,這似曾相似的中文問題

看來狀況不同,因為這個中文字不是自造字,字型也都設了細明體/標楷體,畫面上預覽也很正常,但匯出PDF就變成細細長長的四方框了。但奇妙的是把rdlc換回rdl在report designer上預覽及匯出也都很正常。

確認後,這個字原來是第二字面的中文字,輸入法中得要勾選包中日韓統一的表文字擴充A與擴充B,才能選得到這些字,難怪大家手忙腳亂的用了注音、速成、倉頡輸入法都找不到這個字。

經過幾天胡測亂測,最後竟然發現解決的方法,跟似曾相識的中文問題解法一樣。

網站是用vs2013開發,當初web.config參考是用Microsoft.ReportViewer.WebForms是11.0版本,那天心血來潮,下載了report viewer runtime 2015 ,把report viewer版本的換成12.0的版本。

結果匯出來的PDF中文竟然顯示正常了。

歡呼。

web.conifg,在<system.web> <assemblies> 下 ,
        <add assembly="Microsoft.ReportViewer.WebForms, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845DCD8080CC91"/>
        <add assembly="Microsoft.ReportViewer.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845DCD8080CC91"/> 


<system.webServer> <handlers>下,
<add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />

publish error allowDefinition='MachineToApplication'

一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...