發表文章

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

C# LINQ語法與SQL語法

圖片
  LINQ語法其實跟SQL語法還蠻像的,說蠻像基本上就是拿SQL語法來程式內使用而已。 學習過SQL的人太概都知道SQL的好處,雖說不上萬能,但是在找尋資料時卻是很好用的一種語法。 很多時候,不靠SQL資料庫要處理龐大內存資料真是一種痛苦,由其是不靠資料庫處理大量檔案資料或是內存資料時就是如此。如果有兩種資料須要JOIN就會需要很多程式碼,很多for/foreach迴圈去跑,因此總會希望程式碼在處理內存資料時會有像SQL這樣簡單的語法可以使用。 當然很多地方大都有在說LINQ和SQL的詳細寫法,我這邊也不再描述,我這邊主要是讓大家看看這兩種語法相似之處。 假如我有兩個資料表 學生基本資料(Student) 和 學等(Grade): Student StudentID Name Gender AddressCity AddressArea A0001 吳山汝 Female 台北市 萬華區 A0045 卓凱耀 Male 台中市 北區 A0107 劉立沛 Male 高雄市 鼓山區 Grade StudentID Class Score A0001 1.4 550 A0045 2.5 490 A0107 3.1 581 我們看看 幾個比較 假如我要選取學生資料表(Student)裏面的姓名(Name),然後過濾條件是住在台中市(AddressCity)會怎麼做呢? SQL語法: Select a.Name From Student a Where a.AddressCity = '台中市' 這三行分別就是: 選擇輸出的資料欄(Select) 資料來源(From) 過濾條件(Where) 注意: SQL對指令沒有大小寫分別,對字串不是使用雙引號,而是單引號 其中那個 a 是『別名』 如果用LINQ來寫,就會像如下: var result = ( from a in Student                       where a.AddressCity == "台中市"                      

FirebirdSQL 新增資料庫使用者與資料表權限

圖片
Firebird 資料庫有個最高權限的 SYSDBA 帳號,正常上線使用下最好將它的密碼進行變更,然後再新增一個使用者並賦予資料表的權限,這樣比較安全。 這些調整指令都透過使用 isql 介面來完成 ※注意,使用 isql 調整資料庫相關設定前,先把 Firebird 服務/引擎 先關閉,以免發生占用衝突。 假設我們資料庫是在 D:\NEWDB\test.fdb 首先,變更 SYSDBA 的密碼 C:\FB3>isql -user SYSDBA D:\NEWDb\test.fdb↵ Database: D:\NEWDb\test.fdb, User: SYSDBA SQL> ALTER USER SYSDBA password 'mustKey';↵ SQL> COMMIT;↵ SQL> 這樣就把密碼變更為 mustKey 了 (注意,Firebird 對帳號沒有大小寫分別,但是密碼有分別) 一、新增使用者 SQL> CREATE USER user01 password 'userPass01';↵ 或是創建時同時賦予角色權限(例如管理者權限) SQL> CREATE USER user01 password 'userPass01' GRANT ADMIN ROLE;↵ ※參考  SQL user management commands ※參考  ROLE ※參考  The RDB$ADMIN role 二、對使用者賦予資料表權限 假設我有一個資料表 EMPL SQL> GRANT SELECT , INSERT , UPDATE ON TABLE EMPL TO USER user01;↵ 這代表我只賦予 user01 對 EMPL 只能操作 SELECT、INSERT、UPDATE 三種權限。 基本上,資料表操作權限只有 SELECT、INSERT、UPDATE、DELETE、REFERENCES 這四種,要 CREATE/DROP/ALTER 資料表只能由 SYSDBA 來做。 REFERENCES 這權限是用來讀取資料表的 關聯 資訊(foreign key)的。

FirebirdSQL 以單次執行

圖片
這個是繼 上篇文章 之後,如果不希望這資料庫一直以服務狀態執行,而是希望 Client App 啟動時才執行的方法。 其實,就跟前一篇一樣的設定,就是不要做 install_service 的動作。 只是有幾個要先做的步驟還是少不了 一、要註冊 Firebird  到 Register 裡面 執行 instreg,這個動作在一部 電腦只需要做一次就好 D:\FB3\instreg install -z 二、在客戶端程式執行時 啟動 Firebird 引擎 呼叫方法大致分兩種 (1) 經典模式 D:\FB3\firebird -a (2)超級伺服器模式 D:\FB3\firebird -a -m ※兩種模式參考 說明書 其實在 Windows 下這兩種模式都差不多,選擇一種就可以,啟動後可以在工作列圖式看到這個圖案。 這個引擎會一直開著直到 Windows 關閉為止,或是手動 Shutdown 它。

FireBirdSQL 小型(崁入型)資料庫 初探、下載、建立、設定

圖片
常常會有些時候,開發一些工具程式會需要自帶資料庫的時候。 在10年前,那時候最好的一些開發工具選擇可能還是 Foxpro 吧。 但是自從微軟不再對 Foxpro 做更新時,就已經是末路之流了。 近年來,桌機上的商用主流依然是 Windows 無誤,開發工具從我孰悉的 powerbuilder 漸漸轉向了 C# 。 雖然 powerbuilder 沒辦法使用 Embedded Database ,然而業務開發又需要提供具有資料庫能力的『單機版』程式,雖然說是單機版,但實際使用上通常都會在 3 ~ 5人左右的程式。 因為公司是希望開發好的程式/資料庫可以打包一起,然後是由不是很懂 IT 的業務人員去客戶那邊安裝(最好能一鍵安裝或傻瓜安裝就搞定)的。 MS SQL express 是不錯的選擇,但是太過肥大,安裝又是囉哩叭縮,要包成自動安裝難度太高,如果又要網路共享需要比較懂得人才有辦法去設定啊,也不是一般業務人員可以搞定啊。 雖然,MySQL、 、MariaDB 也是不錯,但還要安裝 ODBC 來分享這也不好搞的。 SQL lite 太過單機,小型群組分享資料庫是做不到了,還得透過 API 指令。 Access DB、Excel table 等太過精簡,操作一個不小心未正常關檔,檔案就掛了,欲哭無淚。Excel table 資料庫沒有加密,等於裸奔狀態。 游網之餘,看到了這個 FireBirdSQL ,其前身是 Interbase 也算元老級的,但支援小群組共同使用,支援加密、StoreProcedure、可以當 Embedded DB 也可以當 C/S 資料庫,雖然效能不怎樣,但是這樣在小程式上真的綽綽有餘,所以趕快來研究看看吧。 FireBirde官方網站 一、下載主程式 本篇討論使用的是 Firebird 3.0.4 版  ,由於需要能夠被打包所以就下載這個 ZIP 壓縮檔版本 為什麼下載 32-bit 版本? 因為沒辦法保證客戶使用的 Windows 平台是 64-bit 的,所以保險起見就用 32-bit 來執行。 下載 ZIP 檔案回來後解壓縮後(通常會放在 C:\FB3 ,實際依需求去放),就可以開始設定了。 二、建立一個放資料檔案的路徑 (我的範例是 D:\NEWDB) 三、建

C# 存取 Sybase 資料庫

圖片
要讓 dotNet 程式存取 Sybase 資料庫,首先,你必須取得 Sybase PC Client 的幾個DLL檔案: Sybase.Data.AseClient.dll sybdrvado11.dll sybdrvssl.dll 如果是開發者,可能需要先安裝 PC Client <<這裡下載>> ,安裝完後再到 Visual Studio的專案下,把 Sybase.Data.AseClient.dll 加入參考 當要執行時,記得把 sybdrvado11.dll、sybdrvssl.dll 一並複製到執行路徑下(Sybase.Data.AseClient.dll 會自動在編譯時加入到路徑下所以不用特別拷貝) 使用時要引用: using Sybase.Data.AseClient; 程式流程部分 : 1、建立連線 → 2、建立SQL命令 → 3、建立傳遞參數(如果需要) → 4、傳遞參數值(如果有建立傳遞參數) → 5、執行命令 → 6、取得查詢資料 連線資料庫 //連線資料庫 AseConnection aseCon; aseCon = new AseConnection ( "DataSource= ServerIPorName ;Port= 5000 ;Database= Windstone ;UID= sa ;PWD= adminPassw0rd " ); aseCon.Open(); SQL指令準備有兩種處理方式 : 一次性執行或是重複執行。 //一次執行的方式 string employeeNo = "052419" ; DateTime inDate = new DateTime (2016,5,1); AseCommand GetEmplName = new AseCommand ( "SELECT empl_name FROM employee WHERE empl_no = '" + employeeNo + "' and job_date > '" + inDate.toString( "yyyy/MM/dd"

sybase 資料庫查詢 table ID 和 table name 對應

連入指定資料庫後,查詢指令 Select name , id , uid , sysstat From sysobjects Where type = 'U' 其他類型資料庫例如MS SQL,where好像用 xtype 來查: Select name , id From sysobjects Where xtype = 'U'

[記錄]快速刪除 SQL Server 前 1000 筆資料的方法 Using Common Table Expressions

【注意】CTE 這個方法只適用於MS SQL Server 一般我們刪除指定資料範圍的方式都會用這種方法: delete from [myTable] where YourConditions 但是有時候,我們因為某些需要刪除資料庫前1000筆資料時卻好像沒辦法用 where 去達成條件。 我們都知道選擇前 1000 筆資料方式: select top 1000 field1,field2,field3 from [myTable] 如果把前述條件當成Conditions來用,就必須 join 欄位 delete from [myTable] where field1 in (select top 1000 field1 from [myTable]) 但很不幸,如果資料龐大,又 field1 不是 Primary Key 的第一欄位, 又或是 Primary Key 是多重組合,則可能造成資料庫大量 LOCK, 使用者得查詢會幾乎被 BLOCK 起來。 這時候我們可以用 CTE 指令方式,這是個類似 Store Procedure 的處理方式,但不需要像 Store Procedure 那樣複雜的語法。 ;WITH CTE AS ( SELECT TOP 1000 * FROM [myTable] ORDER BY field1 ) DELETE FROM CTE 看!簡單多了! 關於 CTE 使用方式可以參考  https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms190766(v=sql.105) ※好像SQL2005以上有提供下面指令可以達到效果,但我個人是沒有用過 DELETE TOP (1000) FROM [myTable] WHERE YourConditions

Coldfusion 對 query 語句生成

一般的 query 查詢方式 <cfquery name="QryName" DataSource="ConnecttionName"> SELECT field-A,field-B FROM TableName WHERE strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)# </cfquery> 上面是純粹帶『查詢資料』進去 Query 語句時所使用的方式,SQL語句屬於固定類的, 但若你把它改成動態語句: <cfset qs = "strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)#"> <cfquery name="QryName" DataSource="ConnecttionName"> SELECT field-A,field-B FROM TableName WHERE #qs# </cfquery> 這個語句絕對會失敗的, 因為 Coldfusion 為了防止 SQL injection 所以會對 生成 SQL語句的變數裡 ' single-quotation 產生escape 字元,導致生成了不是你想像中的語句。 正確的作法,如果你希望使用動態語句生成,那就是加個指令要求ColdFusion不要去處理 single-quotation 問題即可解決: <cfset qs = "strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)#"> <cfquery name="QryName" DataSource="ConnecttionName"> SELECT fi

Coldfusion 來自不同資料庫的join作法

Coldfusion server 提供了許多資料庫的Native Connection方式,或是Jconnect的方式,在我認為效率總是比ODBC好多了,所以我寫的網頁常常遊走在不同資料庫上,我最常用的資料庫不外乎Sybase ASE 與 MS SQL (或是更早的MSDE)這兩種資料庫,所以需要用到兩種BD來源的Table需要Join的問題: 這技術需要用到 inMemory Query 的作法就可以達成 首先從各資料庫先取出需要 join 的資料(可以盡量使用篩選過的,減少記憶體用量) <cfquery name="emp" datasource="SYB_CONN"> SELECT empl_no,empl_name,title_no FROM rmployee WHERE depart_no = 'sales' </cfquery> <cftransaction action="commit" /> <cfquery name="ttl" datasource="MSSQL_CONN"> SELECT title_no,title_name FROM outsider_title WHERE title_kind = 'S' </cfquery> <cftransaction action="commit" /> Join 兩邊的資料源 <cfquery name="emptlo" dbtype="query"> SELECT a.empl_name,b.title_name FROM emp a, ttl b WHERE a.title_no = b.title_no </cfquery> 輸出測試 <cfloop query="emptlo"> <cfoutput>#empl_name# , #title_name# <br /></cfou

Coldfusion 多個 query 合併

簡單的用法: <cfquery name="q1" datasource="store1" blockFactor="100">  select * from sales_lists where sale_date = '2013/05/02' </cfquery> <cfquery name="q2" datasource="store2" blockFactor="100">  select * from sales_lists where sale_date = '2013/05/02' </cfquery> <cfquery name="datesales" dbtype="query">  select * from q1  union  select * from q2  order by sale_employee </cfquery> 把多個 DB 查詢用 in memory 查詢 union 起來。 那如果是 LOOP 迴圈連續查詢的 query 呢? 那就讓 query name 不一樣就可以了,然後再用LOOP把query union 起來 <cfloop from="1" to="#ListLen(employeelist)#" index="i">  <cfquery name="qresult#i#" datasource="db1">   select * from employee where employee_no = '#ListGetAt(i)#'  </cfquery> </cfloop> <cfquery name="combine" dbtype="query">   <cfloop fro

Coldfusion Query 的 Commit

最近由coldfusion 操作資料庫查詢時發生的一件事情 在sybase資料庫 做 Replication 的兩部資料庫: A-DB 與 B-DB, 本來,Web-Base的作業都連線在 B-DB 上,App-Base都連在 A-DB上 後來因為B-DB資料區有異常,就把 coldfusion 連線全部連到 A-DB , 接下來,慘事發生了...... A-DB 三不五時發生嚴重 lock ,導致所有作業都停擺,細查原因,發現: 1、全部 lock 都是來自 coldfusion 的 connection ,而且都是 jdbc 驅動連線 2、如果 coldfusion 使用 Sybase 驅動連線,不會發生此現象 3、ColdFusion 不管何種連線到 B-DB 都不太會發生 lock 過久問題 4、Web-Base 的查詢幾乎都是大範圍資料查詢 所以,查了一下設定發現,B-DB 的 lock 範圍強制設定在 row lock等級, Read isolation 屬 uncommit ,這樣的設定應該是為了提高網頁端大量查詢的效率 而 A-DB 屬於內部作業使用有需要極高的正確性,因此屬於page lock等級, Read isolation 屬 commit,因此 App-Base 開發時只要使用到 insert/update 一律要 commit/rollback才能繼續。 以上設定應該是因應公司營業型態調整的 所以,如果在不知道細節的情況下, Coldfusion 的 <cfquery> 指令下完之後 ,無論是Select / Insert / Update 都記得要下一行: <cftransaction action="commit" /> 或是 <cftransaction action="rollback" /> 才不至於出現過度lock狀況,當然這也是比較正統的撰寫習慣 至於 sybase driver connector 與 jdbc driver connector為什麼有不一樣的行為, 應該是差在 select 這個指令,sybase driver 對 select 指令會自動 commit 掉, 但是jdbc d

SQL [Sybase] 於輸出數值前方補上0

參考來自 這篇文章 ,只是 Sybase SQL 的指令不如 Microsoft 來得多,所以改寫成自己要的方式。 很多時候,公家機關特別喜歡的EDI格式都是固定長度的欄位資料,尤其是數字前面要補零的。 在 SQL 語法上就沒那麼便利像 Powerbuilder 的 String 指令,可以直接給一個 Format, 因此就需要一點變通了, 先來看一看舊式寫法好了,這是使用長度計算後的捕入方式: DECLARE @Number INT ,@Digits INT ,@Result CHAR(8) SELECT @Number  = 123 SELECT @Digits = 8 SELECT replicate('0',@Digits - char_length(Convert(varchar , @Number)))+Convert(varchar , @Number) Convert(varchar , @Number) 將該數值先轉換成字串值,使用 varchar 可以得到與數值相同字元長度的字串。

設計DataWindow的好習慣:SQL Plan

圖片
PowerBuiler中的DataWindow就是SQL Result的視覺化物件。在.net中的物件中類似是DataGrid。 當你設計一個 DataWindow 時,很大的機會都會用到 SQL 查詢。 但是很方便的設計工具,不代表你可以有效的使用它。 雖然我這裡的範例使用的是 ASE SQL Server, 而且 SQL 語句都是在 SQL server 上執行的, 但是本質上 SQL 查詢的指令和模式都有很大的雷同, 所以這裡沒有指定是哪一種 SQL Server ,我要提供的只是觀念。