跳到主要內容

發表文章

目前顯示的是有「MSSQL」標籤的文章

Entity Framework Inner Join and Left Join

Inner Join  就是合併兩張表中有交集的資料 Left Join  也是在合併兩張表,但不同於Inner Join的是, 若在右方表格找不到對應於左方表格的資料時, 預設會給null代替 在Entity Framework中如何實現Inner Join from c in Students join o in Addresses on c.StudentId equals o.StudentId select new { c.StudentName , o.AddressName} 對應的T-SQL SELECT [t1].[StudentName], [t0].[AddressName] FROM [Students] AS [t0] INNER JOIN [Addresses] AS [t1] ON [t1].[StudentId] = [t0].[StudentId] 在Entity Framework中如何實現Left Join from c in Categories join o in Products on c.CategoryID equals o.CategoryID  as ps from p in ps.DefaultIfEmpty() select new { c.CategoryName ,p.ProductID, p.ProductName } ps.DefaultIfEmpty 表示join後的結果會存在ps, 若在Products中找不到對應資料就會回傳null 對應的T-SQL SELECT [t0].[Categories], [t1].[Products] FROM [Categories] AS [t0] LEFT OUTER JOIN [Products] AS [t1] ON [t1]. CategoryID = [t0].[CategoryID]

[ 解決方法] LINQ to Entities does not recognize the method System.String Format

前言 相信.NET的開發者對Entity Framework(簡稱EF)絕對不陌生, 這是基於.NET的ORM框架, 除了可以讓開發者用存取物件的方式與資料庫溝通之外, 還可以搭配LINQ to Entity的技術, 更輕易地撰寫查詢邏輯, EF底層會自動將這些邏輯轉換為對應的SQL語法,然後執行在SQL Server上 雖然LINQ to Entity很方便, 但在使用上也必須小心, 不然有可能在編譯的時候都OK, 但Runtime時卻跳出以下的錯誤訊息 錯誤訊息 LINQ to Entities does not recognize the method System.String Format 錯誤的使用方式 這個問題出在於Select 的時侯呼叫了 string . Format   在這個情況下使用LINQ to Entities時, C#會告訴SQL Server去執行 string . Format , 但由於SQL Server上沒有相對應的指令, 所以才會出現這個錯誤訊息 解決方法 可以將Query分成兩段, 前半段最後呼叫 .AsEnumerable() 將資料讀到記憶體中, 後半段Query就能以LINQ to Objects的方式來操作資料, string . Format 也可以正常的被呼叫

Code First Migration: 什麼是Automatic Migration

Automatic Migration 這個功能可以在Configuration.cs中設定 若下所式     internal sealed class Configuration :  DbMigrationsConfiguration<AcerVoiceAssistant.Models.AvaBotDataContext>     {         public Configuration()         {             AutomaticMigrationsEnabled = true;         }         protected override void Seed(AcerVoiceAssistant.Models.AvaBotDataContext  context)         {             //  This method will be called after migrating to the latest version.             //  You can use the DbSet<T>.AddOr...

MigrateDatabaseToLatestVersion: 發布程式時同時更新資料庫

若想要在發布程式的時候連同資料庫一起更新那該如何作? 方法一 在Global.asax檔案裡, 找到protected void Application_Start 加入 initializer MigrateDatabaseToLatestVersion 如下所示    protected void Application_Start()  {     Database.SetInitializer(new MigrateDatabaseToLatestVersion<AvaBotDataContext, Configuration>());     new AvaBotDataContext().Database.Initialize(true); 加入之後, runtime時在資料庫初始化的階段, initializer會去查資料庫中的migration紀錄, 當程式裡的migration比較新就會去套用他來更新資料庫 方法二 直接在發布時勾選 Execute Code First Migration 他的效果跟方法一一樣, 只是不需要額外寫code而是透過config的方式去告訴initializer作跟MigrateDatabaseToLatestVersion一樣的事

快速了解什麼是Code First Migration

什麼是Code First Migration 簡單的說Code First Migration是一種建置管理資料庫的方式, 以往要建立或修改資料庫時, 通常是先寫SQL去作增刪修, 然後再去修改程式裡映射的類別  而Code First Migration的作法恰好相反 先建立映射的類別或是直接修改映射的類別中的屬性,  然後再透過Entity Framework幫我們把差異的部分直接同步回資料庫 基本上有三個步驟, 依序執行底下三個指令 Enable-Migration 初始化Migration 的環境, 指令執行完後專案底下會多 Configuration.cs 用來設定Migration的方式 如: AutomaticMigrationsEnabled = false; Add-Migration <名稱> 這個指令會去抓Web.config中的 connection string, 然後連到DB去檢查Table的schema跟目前程式中映射的類別有無衝突, 然後建立DbMigration類別, 所有的衝突都會被填到DbMigration類別中 以下的例子是執行了Add-Migration Init,     public partial class Init : DbMigration     {         public override void Up()         {             CreateTable(                 "dbo.Employe...

在Azure SQL上新增使用者

實務上, 當我們開放資料庫給其他人存取時, 通常不會給管理者帳密讓他們去連資料庫, 而是新增一個新User並給予適當的權限, 以下就是實作步驟 首先, 建立一個帳號用來登陸SQL Server (這個SQL語法必須對master資料庫執行) CREATE LOGIN [abotuserlogin] WITH PASSWORD ='ooo12345678' GO 替master新增使用者 CREATE USER [aauser] FOR LOGIN [abotuserlogin]  GO 針對要開放的資料庫新增使用者 在Object Explorer上右鍵你想要動的資料庫 CREATE USER [aauser] FOR LOGIN [abotuserlogin]  GO 有了使用者之後我們就可以來設定權限 基本上有兩種方法 設定Role(通常一個Role就包含數個權限) 直接調整權限 總共有底下這麼多權限可以使用 若只想要開放資料的增刪修查, 那可以增加db_datareader, db_datawrite這兩個Role EXEC sp_addrolemember 'db_datareader', [aauser]; GO EXEC sp_addrolemember 'db_datawriter', [aauser]; GO 注意: 上面給的權限只能用來處理資料, 所以如果要加Table或是砍Table的話, 會出現access denied 的喔 最後, 如果這個User用不到了, 想要刪除的話, 可以Security 下找到我們剛剛加的 abotuserlogin 還有我們剛剛新增的aauser 右鍵這些名稱, 我個就可以看到刪除選項 Ref: https://azure.microsoft.com/en-us/blog/adding-users-to-your-sql-azure-database/ https://...

Azure SQL 如何輸出 table schema

假設你有一個架在Azure 雲端上的資料庫, 今天你可能想要輸出他的table schema 好在本地端建立另一個分身做測試或者是開發時,   只要打開SSMS(2016) 接著對你雲上的資料庫點擊滑鼠右鍵 然後你就會看到Generate Scripts, 此時大力地給他按下去後, 就會跳出另一個視窗要你選擇輸出的目的地, 還有想要輸出的Table 最後, 就會產生一份.SQL讓你輕鬆地在本地端建立分身了

[解決] Update-database 時遇到錯誤訊息: Cannot open server requested by the login. Client with IP address is not allowed to access the server.

簡單的描述一下遇到的狀況 Azure上面有一個我新建的Database, 當我試著使用Entity Framework Code Migration去更新資料的時候, add-migration initialModels update-database visual studio 卻拋出以下的錯誤訊息 Cannot open server 'avbotdata' requested by the login. Client with IP address '108.123.1.251' is not allowed to access the server.  To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range. It may take up to five minutes for this change to take effect. 原因很明顯, 我們想要存取資料庫的時候, Azure 認為發出請求的IP不在Whitelist裡面, 所以擋住了update的請求 解法其實很簡單 Step 1. 選擇你要設定的資料庫, 在搜尋列上輸入 Firewall Step 2. 輸入你要加入的IP後存檔

MS SQL Store Procedure 簡易教學

前言: 簡單的說Store Procedure 可以讓我們預先寫好一段SQL語法, 等要用的時候再去呼叫他 EXEC     @return_value = [dbo].[GetImgByProject] 這麼做的好處是我們可以讓複雜的query便精簡, 除此之外由於Store Procedure是已經編譯完後且最佳化完後的產物, 所以執行Store Procedure也可以提升query的整體效率 以下是以MS SQL示範如何建立使用Store Procedure 環境: MS SQL 建立Store Procedure Step 1. 編寫建立語法 起手式 Create Procedure  YOURNAME AS YOURQUERY 列如: Create Procedure GetImgByProject AS SELECT TOP 1000 [SID] ,[Name] ,[PartNumber] ,[Brand] ,[ProjectName] ,[CreateDatetime] ,[UpdateDatetime] FROM [ DATA . MDF ].[dbo].[modelname] 如果需要帶參數進來, 可以在Create Procedure後加入參數名, 型別, 長度 @PARAM   varchar (50)  列如: Create Procedure GetImgByProject @ProjectName varchar (50) AS SELECT TOP 1000 [SID] ,[Name] ,[PartNumber] ,[Brand] ,[ProjectName] ,[CreateDatetime] ,[UpdateDatetime] FROM [ DATA . MDF ].[dbo].[modelname] WHERE ProjectName = @ProjectName Step 2. 執行Execute建立 Store P...

Simple setup tutorial for MSSQL LocalDb

Install LocalDB Use SQLLocalDB.msi Install SSMS to manage our DB Use "Web PlatForm Installer" Create LocalDB instance: SQLLocalDB.exe  Create   ["Instance Name"] For example: SQLLocalDB.exe  Create  "MSSQLLocalDB" Start LocalDB  instance : SQLLocalDB.exe  Start   ["Instance Name"] For example: SQLLocalDB.exe  Start  "MSSQLLocalDB" Deploy DB file: -Deploy by visual studio -Set Access Permission of APP_DATA folder for Application Pool in IIS Attach DB(or Attach MDF file) by SSMS: Login\Connect to SQL server Attach MDF          -Right click "Database" & select Attach...            - press "Add.." and select you MDF file Check LocalDB is installed: by looking for this registry: Debug LocalDB: -Check log file %localappdata%\Microsoft\Microsoft SQL Server Local DB\Instan...

Cannot get a local application data path. Most probably a user profile is not loaded

當初開發時為了圖個方便, 所以直接把資料庫檔案(mdf)跟web service 透過 visual studio 部屬到機器內, 然後直接在機器上跑LocalDb, 結果卻出現以下的錯誤訊息 Cannot get a local application data path. Most probably a user profile is not loaded. If LocalDB is executed under IIS, make sure that profile loading is enabled for the current user. 很明顯地, 這個訊息表示我們必須設定IIS的 user profile 因為執行LocalDb的相關檔案是儲存在使用者資料夾裡面, 如: C:\Users\ Administrator \AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB 而跑在IIS上的web service預設是以 ApplicationPoolIdentity的身分去執行, 所以如果沒有load user profile的話, 就無法得知實際LocalDb instance的路徑 解法很簡單: Step 1. 在IIS上打開Application pool的頁面 Step 2. 選擇你的application pool Step 3. 點擊 Advanced Settings Step 4. 找到Load User Profile並選擇True Ref: https://blogs.msdn.microsoft.com/sqlexpress/2011/12/08/using-localdb-with-full-iis-part-1-user-profile/

The database could not be exclusively locked to perform the operation

這個問題是, 當我用SSMS更改資料庫的名稱時, 結果遇到以下的錯誤訊息, The database could not be exclusively locked to perform the operation. 原因是目前尚有其他connection正在連接資料庫, 所以我們的請求被拒絕了 解決的方法很簡單, 宣告單人模式(single user)來搶資源 ALTER DATABASE [C:\APS\APP_DATA\BOTDATA.MDF] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ; ALTER DATABASE [C:\APS\APP_DATA\BOTDATA.MDF] SET SINGLE_USER ; --Do something ALTER DATABASE [BotData] SET MULTI_USER WITH ROLLBACK IMMEDIATE ; ALTER DATABASE [BotData] SET MULTI_USER ;

Cannot connect to localdb

前言: LocalDb 是微軟推出的另一種小型資料庫, 運作起來其實跟SQL Express幾乎沒什麼差別, 好處是讓developer在開發階段時, 不需特別去維護像SQL Express這麼大的資料庫, 快速的安裝, 而且不需要特別的設定(zero-configuration)是他的優點 除此之外, 由於他執行的實體是launched on demand, 所以在需要的時候用的才會被啟動, 不像SQL Expresss runs as a service 常駐於系統  Run as user process, 所以當我們同時試圖以不同的windows user(IIS, SSMS)去存取mdf檔案時, mdf 會被第一個user鎖住, 造成第二個user無法使用 Not for multi-user scenario, 產生的問題如上 回到正題, 若使用LocalDb的時候遇到以下的錯誤訊息時該如何處理: Cannot connect to localdb 使用以下的指令檢查是否有正確安裝LocalDb的引擎 C:\Program Files\Microsoft SQL Server\130\LocalDB\Binn\SqlLocalDB.exe   /? 或是到registry 看: HKLM\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions\13.0

[C#] LINQ 查詢, 刪除重複的資料

最簡單的方法是使用 .Distinct() 來達成 .Distinct() 會根據查詢結果裡的所有欄位的值來決定是否為重複資料 若今天的資料如下 ID ProjectName Price Country CreateDatetime 1001 hello_kity 1000 TW 2017/04/07 1002 hulk 2000 TW 2017/04/05 1003 hulk 2000 US 2017/04/06 當我們沒有使用 .Distinct()   時, 若以底下的語法查詢ProjectName 與 Price的話, var _info = (from m in _DB.tblmodel                           select new                                 {                                     ProjectName = m.ProjectName,                               ...