顯示具有 SQL Server 標籤的文章。 顯示所有文章
顯示具有 SQL Server 標籤的文章。 顯示所有文章

2011年12月31日

[SQL SERVER] SQL SERVER 無法使用帳號登入之原因

坎尼和同學們最近要為論文寫資訊系統
剛好以 SQL Server 2008 R2 當資料庫系統
沒想到同學們沒用過,所以發生了不少設定上問題
所以把初心者在使用 SSMSE 時,無法登入的可能原因整理成一篇


I. 伺服器安全性設定

S 同學照著網路上的範例建立好資料庫
沒想到寫好一個程式之後,怎樣都無法用帳號登入
但用 Windows 整合驗證是正常的

坎尼檢查了一下才發現,S同學忘了修改伺服器驗證屬性
SL01 如上圖把伺服器驗證改為SQL Server及Windows驗證模式即可

II. 帳號安全性

C同學已修改過上述屬性,但仍是有帳號無法登入之問題
檢查之後才發現同學在帳號屬性中,選了強制執行密碼逾期
所以寫程式去連接時,會有帳號密碼已逾期之例外發生
無奈現在年輕人都不怎麼靜下心來看錯誤訊息寫什麼

坎尼修改該帳號登入屬性之後程式就可以跑了,可喜可賀
SL02

III. 小結

最近在幫同學們處理這些問題,發現並不是工具不好用
反而是使用者常常會忽略工具所提供的訊息
  • 看到警告視窗→確定
  • 不管內容寫什麼,點 同意 就對了
不知道是不是現在人接觸太多資訊科技
已經被一些好用的應用程式慣壞了?

但反過來想,程式設計師在設計這些訊息的時候
是不是也該想想使用者會有什麼樣的反應發生呢?

2010年6月4日

[ASPNET] 客製化傳入 DataSource 控制項的參數

坎尼最近玩了一下許久未用的 DataSource 控制項
對於傳入的 Parameter 有些疑問 (見下圖)
op03如果是用精靈視窗,Control 會自動帶入預設的 Property
若是想要用其他的屬性來當作參數值該怎麼辦呢?

I. 取得資料來源

這邊坎尼用到了前幾天講的技巧,建立了一個暫存表並回傳查詢值
op01
另外還用了 SQL Server 2008 才有的 Mutli-Insert 語法:
在 Values 後面,以 「,」隔開 要建立的值

最後再回傳符合條件的查詢結果
可以看到範例中是用 Like,所以要記得加 %

II. 實戰

在畫面上放一個 DropDownList,當作查詢條件的傳入值
另外再放一個 GridView 來呈現資料
op02建立一個 ObjectDataSource
並用精靈選擇 DropDownList 當作參數值來源
op03預設是用 .SelectedValue 屬性當作傳入值
但以上面 DropDownList 目前的設定來看,會查不到任何資料

所以坎尼偷偷的切換到 Source 視窗
靜悄悄地把 SelectedValue 改成 SelectedItem.Text
op04 
按下瀏覽來查看一下成果
op05
狸貓換太子成功!!!  收工!

III. 小結

了解可以自定要傳入的屬性當參數後
DataSource 控制項在使用上也能更有彈性 :)

2010年6月1日

[ADO.NET] 善用 SqlDataAdapter 執行大量指令並傳回查詢資料

今天來介紹一下好用的 DataAdapter

I. 前言

很久很久以前,坎尼常遇到一個問題
「新增完一筆資料之後,要回傳該資料的ID」

如果 ID 是自己取 Max + 1 就還能控制
但要是遇到是用 sequence 方式建立的流水號
往往還要拆成兩段語法,建立完資料之後再取出

其實大可不必那麼麻煩,可以將 SQL Statement 串接在一起
(記得用 ; 隔開不同的指令)
再用 SqlCommandSqlDataAdapter 執行即可

II. 實戰

下圖綠色框部分,用 Sql Server 提供的 Temp Tables 語法
分別建立了兩個臨時資料表,並各加入兩筆資料
再用 SELECT 語法將兩個資料表 JOIN 的結果回傳
ms01既然 CreateInsert 語法都在 SelectCommand
參數當然也是要加進 SelectCommand 裡 (見上圖藍色框)
記得不要放到 UpdateCommand 或 InsertCommand 去

實際執行情況:確實建立了 Table 並取得 JOIN 成功的資料
ms03

另外坎尼又做了小小的測驗,驗證一下臨時資料表有沒有被砍掉
ms02 
事實證明,在上一次 .Fill 結束之後,暫存資料表是會自動清掉
而 Temp Table 的定義是:只存在該使用者連線時
ms04 
這表示 DataAdapter 在 .Fill 之後就會自動把連線關閉
下一次的 .Fill 其實是另外再重新開啟另一個連線

III. 小結

坎尼以前常看到有人用 DataAdapter
卻在執行前後加上 Connection.Open() 及 Connection.Close()
其實這些動作都是不必要的

DataAdapter 在執行時,都會檢查目前和 DB 的連線
執行結束後即會自動關閉與 DB 的連線

希望這些觀念對讀者們有幫助 :)

2009年2月21日

快速製作大量資料的資料表

碎碎念改了新版面囉
大家感覺這樣的配色如何呢?

這次要來講一個謎樣的 SQL 語法:Insert Into Table1 Select * From Table2
意思是:從 Table2取出資料後,通通塞進Table1
不過有個限制就是:兩邊欄位數量、順位、類型必須相符

好了,坎尼利用了這個特性來講如何快速的製作測試大量資料表

首先,先新增一個資料表
範例裡只有兩個欄位,且 oid 的類型是 identity

在 Table 裡加入一筆資料

接著打開指令輸入視窗
不過要注意的是,坎尼將 oid 設 identity
若是強制 Insert 到 identity 欄位,Sql Server 只會說:No, you can't.

所以指令會改成下圖中第二句
可以看到坎尼用的偷吃步就是:目的來源的資料表為同一個

由於一開始只有1筆,所以畫面上只會 Insert 一筆
「一筆有什麼好了不起的?」也許Tim會這麼講
不過當坎尼按了十數次的執行語法後

可以發現,資料已經成長到十數萬筆
原因就是:由於是同一資料表,所以每做一次就成長一倍
換言之,也就是2的N次方

以這種速度按下去,再按個幾次就會有千萬筆的資料了!!!!

可是當資料成長的愈快,每次執行的速度也就愈久
所以坎尼又改了一下語法 (如下圖)

一次只取 5000 速度只有快!!! 天下武功,唯快不破
「如果要三千萬的資料,啊你是要我按到手斷掉啊」Tim又開口了
『孩子,請照顧好自己的身體健康,寫個for迴圈來跑就好』

最後來看一下前面做了那些動作的成果

See? 坎尼只是邊看電視邊按執行鍵,資料輕輕鬆鬆的成長到十萬筆 XDD

要是需要大量的資料來測試自己系統執行效率
就可以試試坎尼這個方法 :p
坎尼當年就被要求要一千萬筆資料來做壓力測試 orz

備註:
這個語法坎尼只在 MS Sql Server 裡用過
不過 Google 大神好像講說其他資料庫也能這麼做
這點坎尼目前的機器上沒法驗證,有需求的人就試試看吧 :D

2008年12月25日

最近很紅的 SQL Server 漏洞 + 如何訂閱 Microsoft Security Advisory

最近跟 SQL Server 有關的新聞不少,一開始我是在一個印度的 SQL Server MVP 的 Blog 上看到關於 SQL Server 2005 SP3 的消息(12/18),沒想到很快的在 12/22 就收到微軟的窗口的 mail,提醒說微軟已經發布 Security Advisory 961040,結果昨天(12/24) iTHome 就已經看到相關的中文報導,還有祭司的 blog 上也有相關消息,最後是今天在保哥的 blog 上也看到相關的消息了,看來有在隨時注意新知的人都能很快跟上進度。

看以上那些報導就可以對這個漏洞有一定程度的瞭解,所以我就不多廢話了,
主要是今天忽然想到,到底 MS Security Advisory 有沒有 RSS Feed 可以訂閱呢?
 
於是我連回 Security Advisory 961040 的網頁,點了網頁上方的 Security Advisory 連結:
Microsoft_SecurityAdvisory

果然順利找到了 RSS Feed:
Microsoft_SecurityAdvisory_RSS

接下來又看到下面還可以訂閱 Windows Live Alert,於是繼續點進去(登入頁略):
WindowsLive_SecurityAlert_Choose

直接全選之後,還有進階設定,我就繼續全選:
WindowsLive_SecurityAlert

最後設定完成的樣子:
WindowsLive_SecurityAlert_MyAlerts

這樣以後就更不容易 miss 掉微軟重要的姿安訊息囉!
最後補充一下前天安裝 SQL Server 2005 SP3 的心得:
  • 安裝前大約花了 1.5 HR 看了 Readme, Installation Guide
    (裡面有說,裝了 SP3 之後,若 SQL Server 相關 Component 發生異常,則無法修復,請整個 server 砍掉重練。雖然聽起來有點恐怖,但發生機率應該極低)
  • 裝的過程大約 30 ~ 45 分鐘,沒什麼困難 (No SSAS, SSRS, Failover Cluster)
  • 共安裝兩台,一台從 RTM –> SP3,另一台從 SP2 –> SP3,裝完都沒甚麼副作用
  • 還沒有安裝的朋友,趕快安裝吧!!

2008年10月14日

SqlParameters 應用篇

雖然標題是應用篇  但坎尼好像也沒寫過入門篇 (抓頭

回正題
本篇的應用是 隨著 user 選項不同  而執行不同的 t-sql 語法
且參數部分不盡相同

「為什麼說不盡相同呢?」 先來看下面抓圖
假設這是一個複合條件選擇的頁面
坎尼會依 user 選擇 而從 t1、t2、t3 三個資料表中分別取出資料
t1可能是個人資料、t2則為職業、t3為連絡資料
(先把 join 給放一邊  這個只是範例)

可以看到
i = 0 時  需要參數 id name birth
i = 1 時  需要參數 id job
i = 2 時  需要參數 id name tel

有發現嗎? id 這個參數重覆出現了三次  name 則是兩次
這種情況下  大部份的人應該都會寫成上圖的方式
利用 if 判斷 再將 parameter 加入 SqlCommand 當中
但這樣不嫌重覆造了太多輪子了嗎?

這邊坎尼要提供個簡單的方式
不過這邊要注意的是  這個方法好像支援 .NET 2.0 以上
1.1 似乎不能這麼寫  SqlCe 似乎也不能這麼做 (這個會再發一篇詳細講解)
直接來看抓圖吧


可以看到  坎尼把參數通通移到 if 的外面
在這邊 ADO.NET 會自動的判斷 parameter 的 name
所以就算加了 10 個 parameters  但.NET執行Sql指令時
也只會抓取它所需的那3個 parameters (依給予的參數名稱
「這樣做不會有問題嗎?!」
坎尼用 vs 2005 來做 一直都是 ok 的  如果有問題請寄信給坎尼 :D

好啦  講完啦  XDDDD   (被踹飛

其實真正的應用不在於 select  (坎尼覺得用 select 當範例大家會比較了解
而是 insert update 時  許多資料表的欄位很像 但又不太一樣
應客戶要求又要做在同一頁  (對他們來說  這幾張 Table 可能是相同的)

此時  苦命的 Programmer 就要像第一張圖那樣
利用 if 或 switch 去做判斷  再將資料 insert (或update) 進去資料庫
(別懷疑  這是坎尼工作上遇到的實際例子)

為了讓自己可以早點下班  以後維護也比較簡單(這地方見人見智)
坎尼不小心發現了這個偷吃步的方式
不過效能上有沒有影響倒是沒有測過  哪天比較空閒時再來測測看

最後補充個一點  在加入 Parameters 之前  記得習慣將 Parameters 清空
尤其是要用 for 迴圈跑 insert 或 update 的人

2008年10月13日

Sql Server V.S. Sql Server Compact

繼昨天講解 ADO.NET 會自動判斷參數名稱 後
今天要來講 PC 和 PPC 的 SQL Server 的差異性比較

PC上是使用 System.Data.SqlClient
PPC 則是使用 System.Data.SqlServerCe (需安裝 .NET Compact Framework

再來是要了解一點
PPC上所支援的 API 較 PC 少  (為了縮減容量的關係吧?)
所以常常可以見到的是
同一個 Class 上  在 PPC 所支援的方法及屬性 大多會所剩無幾

MSDN 上查詢Class成員時
會看到某些 方法 或 屬性 前有個手機的 Icon   那就表示是支援 PPC 開發

以上大概是 PC 和 PPC 的一些小講解
再來是 PPC 上用的小型許多的 SqlServer -- SqlCe

如同之前所講的  PPC 許多 Class 都會受限
但是坎尼沒想到 SqlCe 上也有如此情況!?
比方講 isnull 這個在Sql常用的函式  到了SqlCe上竟然不在了 囧>
應該是說  它變成回傳 true/false ( 但MSDN上是寫不支援
坎尼只好用 case when 來做判斷

接下來是要承接 上篇 所講的SqlParameter

在 .NET Compact Framework 上寫入 SqlParamter 就不像上篇所講的那麼簡單
因為 SqlCe 會判斷目前 Sql 句子裡有幾個 Parameters
然後再將 SqlCeCommand 裡的 Parameters 的值給寫入   少傳多傳都會出現例外
講這麼多就是一句話 : 
子句的參數數目要和 SqlCeParameters 的數量相同啦!!!

因此坎尼 上篇 所介紹的這個傳入參數的方式就不適用
但是偏偏這個 PPC 的開發和上一篇所講的是同一個案子
坎尼打開 SqlCe 的資料庫  又看到了許多重覆欄位分散在不同的資料表 orz

山不轉 坎尼轉轉轉   綜合之前所提的兩種方式
坎尼將共同的 SqlParameter 寫於外層
內層的判斷則是依不同需求  傳入所需的 Parameter

可以看到  範例中只有 id 是共通  所以移到最外層
name 雖然也有兩個情況下會出現  但是..恩..很抱歉...你知道的...
(坎尼案子裡共同的parameter約有七八個 orz

傳入 Parameter的方法大概介紹到這邊
最後回應一下 Tim 上篇留言所說的
這個方式雖然可以分開管理共同及私用的 Parameters
但還是 Tim 所說的  直接再開個方法來寫  還比較好維護
這個四不像希望以後坎尼負責的案子不會再用到它
(那你幹嘛發明它  找死啊= =

這篇實在是寫得很亂   很感謝能看到這裡的人  <(_ _)>
下篇會挑個 scope 比較小的東西來寫

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D