顯示包含「SQL Server」標籤的文章。顯示所有文章
顯示包含「SQL Server」標籤的文章。顯示所有文章

2013年11月22日星期五

Bug in Entity Framework 6 w/ SQL Server 2012

若你的程式有使用EF6 + SQL Server 2012,很大機會會遭遇兩個錯誤:
Sys.WebForms.PageRequestManagerServerErrorException: The provider did not return a ProviderManifest instance.
Could not determine storage version; a valid storage connection or a version hint is required.

以我的情況來說,是ASP.NET 4.5 Webforms Project,有部份頁面的GridView或WebService是有使用SQLDataSource和EntityDataSource,
在升級到EF6後,就會出現上述的錯誤。



上Google搜尋,並沒有統一的答案,而Microsoft Connect上的Bug Report還是未解決狀態。

一輪苦戰之後,最後找到一個解決方法,就是把Data Model (*.edmx) 中的ProviderManifestToken的值,由"2012"設回"2008",再Rebuild Solution就OK。

2013年8月27日星期二

SQL Server Replication - 遠端TCP/IP連線解決方法

若設定SQL Server Replication,照著Wizard指示,Step-by-Step做設定,問題應該不大。
若Publisher跟Subscriber在同一個網絡,相方都可以用電腦名稱或Instance Name去連接 (e.g. SQLPC\SQLSERVER)。

但若果任何一方是在遠極端(Remote),當你一如正常使用IP做伺服器位置時,SQL Server便會出現錯誤訊息。
Sql Server replication requires the actual server name to make a connection to the server. Connections through a server alias, IP address or any other alternate name are not supported. specify the actual server name


正如訊息所說,設定Replication連接必須要電腦實名。
以我的情況為例,SYSERP這部Publisher電腦IP是10.128.88.5,Dynamic Port : 49304
但怎樣設定才能令本機電腦(Subscriber)知道SYSERP的IP是10.128.88.5呢?
修改電腦System中的Host檔案?

若你第一時間上Google Search,其中一個解決方法是叫你修改SQL SERVERNAME。
例如 : http://ramymahrous.wordpress.com/2010/02/25/replication-error-sql-server-is-unable-to-connect-to-server/

因為SQL Server不會自動去更新本機名稱,所以使用這個方法,只有因曾經人手修改電腦名稱。
我個人建議不要使用這種做法。

最安全和無風險的做法就是隱藏在SQL Server Configuration Manager,平時最不起眼的Aliases


Aliases就是讓你設定別名,以IP對行Mapping。

以下圖為例,就可以把SYSERP主機換算成10.128.88.5:49304。


之後返回設定Subscriber時,輸入"SYSERP\SQLEXPRESS"就可以了。

若反來是Publisher連不到Subscriber,亦可以照著這方法去做。

2011年10月19日星期三

修改電腦名稱後SQL Server Replication失效解決方法

在公司中,我自己的電腦都會跟Production Server做Replication,當然Server會是Publication,而我是Subscriber。
上星期,我把自己的本機電腦名稱修改,到今天看看Replication Monitor,發現這段時間一直都是"Uninitialized subscription"狀態。
過了一段時間才驚醒自己修改了電腦名稱,故兩者的Connection當然是不同了。
我試過重建,但奈何多次都不成功。上網找答案,原來是SQL Server並沒有記著新的電腦名稱。
下圖中,可見其實SQL Server中,Name與Data Source可以是兩個不同的值。


因為我是選擇"Snapshot replication pull model",故以下一切Command都應該在本機Subscriber電腦做,請注意。
上網爬文,有人說去System Databases中的Master DB,再到System Views中的sys.servers修改記錄。但世事又怎會那麼簡單....
Edit後出現"Ad hoc updates to system catalogs are not allowed."


其實可以執行兩個System SP去做一下檢查:
sp_helpserver - 顯示SQL Server內,已知或已註冊做replication Server的資料。
select @@SERVERNAME - 執行該Query Command的Server名稱。

就以下圖為例,顯然兩者並不一致,所以就要作出修正。


在本地執行以下SQL,目的是把沒有用的Server記錄刪除,再新增正確的Server資料。
sp_dropserver @server='MING-WINDOWS-7'
GO
sp_addserver @server='MingCheung-PC', @local='LOCAL'
GO
執行後,應該就可以重建Replication了。

2011年5月19日星期四

Free MSSQL Server Profiler

免費的MSSQL Profiler其實選擇不多,現在我一直就用這個AnjLab的SqlProfiler。
所謂Profiler就是即時監測SQL Server的活動,當然包括最重要的SQL Statement執行進程。
因為我自己寫程式已經優先使用LINQ2SQL或Entity Framework關係,很多時候都需要知道LINQ或Entity SQL在Runtime時轉變成什麼SQL Statement,所以Profiler很重要。

AnjLab的SqlProfiler介面其實還算很陽春,但在功能應用上是沒有問題。支援SQL Server 2005/2008/R2 任何版本,包括Express。

往官網下載安裝後,一打開好像什麼都沒有。
你需要按New Trace按鈕,軟件會打開新Trace Properties,選擇你需要觀看的資料。
就我而言只想知道正在執行什麼SQL Statement的話,設定如下圖 :



按確定後,那一個新的Trace設定就完成,每次當SQL Server有什麼活動都會顯示,如下圖我可以知道不同程序(.NET SqlClient / Report Server etc.)正在對SQL Server做什麼。
另外有一個使用小Tips是,如果你跟我一樣有使用MSSQL Reporting Service或有什麼定時執行SQL Query的軟件,或許你會覺得Profiler不停更新,你很困難才找到你想看的資訊。
這個時候你便要在Filter中設定顯示規則。例如我只想看ASP.NET所發出的Query,我在Filter中設定"ApplicationName LIKE '.NET SqlClient'就可以了。

2011年5月12日星期四

Microsoft SQL Server Management Studio加速

一直都覺得Microsoft SQL Server Management Studio起動速度很慢,但又算不上是大食(相比VS2010)。
看過這裡,原來是有方法加快開啟速度的。

Microsoft SQL Server Management Studio is too Slow

In a corporate environment it is not uncommon for Microsoft SQL Server Management Studio (SSMS) for SQL Server 2005 to take over 45 seconds to start as well as lags and delays when opening various windows and dialog boxes from within the application. If you are experiencing this issue, then a quick fix is to add an entry in your HOSTS. file that points crl.microsoft.com to 127.0.0.1

  1. Exit SSMS
  2. Press the keys [Win] + [R]
  3. Enter the following..
  4. notepad %systemroot%\system32\drivers\etc\hosts. Append the following..
  5. 127.0.0.1 crl.microsoft.com
  6. Save the file.
  7. Start SSMS (ah! much better)

The reason why it is slow is because .Net Runtime tries to contact crl.microsoft.com to ensure that the certificate in various .Net packages that were shipped with SSMS is valid.
If you are behind a firewall/proxy as is the usual case then there is no direct route out to the internet to crl.microsoft.com to validate the certificate(s) and it eventually times out. The wait for the time out causes the delay for each and every package it checks.

With the change to the HOSTS. file, you are forcing the certificate checks to crl.microsoft.com to route to the local host which immediately fails and the certificate checks are ignored.

2010年6月10日星期四

Windows Vista / 7 / Server 2008 不能安裝SQL Server 2008 R2解決方法

今天剛安裝好Windows 7後,去Windows Update完全更新後,就下載SQL Server 2008,我的版本是Express R2 64Bit中文版本,但安裝時出現程式錯誤,而且是強行關閉那種,我執行安裝程式的System Configuration Checker,發現出現一個錯誤 : PerfMonCounterNotCorruptedCheck

中文版Error Message :
檢查現有的效能計數器登錄區是否一致。效能計數器登錄區已損毀。若要繼續,您必須修復效能計數器登錄區。如需詳細資訊,請參閱 http://support.microsoft.com/kb/300956。

英文版Error Message :
Checks if existing performance counter registry hive is consistent. The performance counter registry hive is corrupted. To continue, you must repair the performance counter registry hive. For more information, see http://support.microsoft.com/kb/300956.

我唯有試試32Bit版本,結果依然,再試之前原先在Vista上使用的非R2英文版本,竟然錯誤都一樣。



於是我就去http://support.microsoft.com/kb/300956看看,老實說,MS提供的解決方法極度複雜。
我唯有上Google Search "PerfMonCounterNotCorruptedCheck",果然有很多人都有同樣問題,亦有很多不同的建議,但我試過了都不行。
甚至很多人說在[執行]以下的會成功,我都不行。
lodctr /R:PerfStringBackup.INI 

綜合不同受害者的結論,花了幾個小時去研究,最後發現這是Windows語言版本問題,所以為什麼依據別人的方法都不能解決問題。

首先大家要知道我的OS是Windows 7 Ultimate 64Bit 香港中文版 (請注意"香港中文版"了,這是關鍵!)
而問題成因的效能計數器登錄區是藏在registry中的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Perflib\

細看之下,裡面只有[009]和[0404]兩個項目,而大家大概都知道這是LCID,"009"代表英文,"0404"代表台灣中文,那香港中文的"0C04"呢?
假如SQL Server安裝程式會檢查我的OS語系的話,應該大概就是因為這樣沒有"0C04"而錯誤吧?
那我新建一個"0C04"項目,直接由"0404"人手Copy&Paste過"0C04"再重新開機。



再次試試安裝中文版,依然都是一樣,但試英文版64Bit時,竟然可以完成安裝,而且用了兩天都沒有問題。
所以解決方法很明顯就是新建一個自己Windows語系的LCID。
雖然中文版未解決,但我亦覺得用英文版本都沒有所謂。

這是一個十分奇怪的Bugs,當我上網找答案時,連台灣中文的用家都說有這問題,甚至日文,英文,德文的用家都有出現,全部都有一個共同點就是使用Windows Vista / 7 / 2008 Server,顯然這是一個Vista核心在特定情況才出現的Bugs。
但我的Windows 7是Clean Install,只是上了Windows Update的Patch,Windows 7是由MSDN Subscription下載的,所以我個人幾乎肯定香港中文用戶90%會中招。

2010-11-29更新
發現台灣網友同樣出現這個問題,他們都有提供自家的解決方法。
大家可以去參考一下:
安裝MS SQL Server時發生 效能計數器登錄區一致性的錯誤
Win7上安裝SQL2008 效能計數器登錄區一致性的錯誤解決辦法