台灣最大程式設計社群網站
線上人數
894
 
會員總數:240642
討論主題:186514
歡迎您免費加入會員
討論區列表 >> C# >> 登入mysql資料庫的exception處理,error code都是零
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
登入mysql資料庫的exception處理,error code都是零
價值 : 83 QP  點閱數:306 回應數:8

樓主

bon
門外漢
0 19
472 39
發送站內信

各位先進好

我想用try-catch處理mysql連線時發生的錯誤,但如果連線存取被拒的話,exception的error code都會是零。
我希望使用者登入時能提示原因,例如帳號密碼錯誤、已達最大連線數、存取的資料庫沒有權限等。但是都只會得到error code 0 - access denied.

從這個連結可以找到處理範例,但以上這些情況也都只能得到error code 0。


在下面連結的討論中,有人說明因為error code與error message是在資料庫設定的,所以沒有連線到資料庫就不會取得error code/message,但如果是因為密碼錯誤,實際上應該已經到資料庫的門口了,難道不能告訴我為什麼不開門嗎?


請問有沒有方法可以得知登入失敗、存取被拒時的原因?



搜尋相關Tags的文章: [ mysql ] , [ exception ] , [ error code ] ,
本篇文章發表於2017-01-04 18:14
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
你給的範例 1045的錯誤碼是 無效的帳號密碼
沒有權限的部份,應該是當下sql指令的時候,才會顯示出來。
這篇
1044就是因為沒有權限所以才顯示錯誤。
本篇文章回覆於2017-01-05 13:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

bon
檢舉此回應
謝謝回覆。

使用者會有以下幾種情境:
1.登入時帳密輸入錯誤,提示訊息為「帳密錯誤」。此時錯誤碼為0。
2.伺服器上存在多個資料庫Schema,當使用者試圖登入到不開放的Schema,提示訊息「無存取權限」。此時錯誤碼為0。
3.某Schema限制每小時內最大Select上限,當達到限制時,提示訊息為「已達最大搜尋次數,請稍後再試」。此時錯誤碼為0。
4.已登入,使用了沒有權限的sql語句。這個狀況就如Daimom所說的,可以正常抓取錯誤碼並提示對應的訊息。所以這點沒有問題。

前3點錯誤碼皆為0,所以我不曉得怎麼分辨並提示不同訊息。

多個Schema的原因是,有些資訊是公開的,隨便你抓;有些是只允許檢索少量資料,為了避免全部資料被Copy外帶,限制短時間內可讀的筆數與次數。
不過後來想想,把sql語句寫作資料庫的function,讓使用者只有使用function權限,有狀況的話就回傳錯誤訊息,或許2、3點的目標就能解決了。

本篇文章回覆於2017-01-05 17:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
1.以mysql上面的文件,錯誤的帳密應該是有值的。這點我不確定你那邊的情況。圖片
2.使用者不應該看得到沒有權限的資料庫。還是你是讓使用者自行運用指令去查詢?
3.沒此運用過...

你後面的想法我很贊成,因為給使用者開資料庫的帳號,直覺上就不太合理.......
如果是要做到權限控管,開資料表寫入user,並做功能權限的劃分,你上面的問題應該都不會存在。
能說說為什麼會開資料庫帳號給user嗎?
本篇文章回覆於2017-01-06 11:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

QOO
捐贈 VP 給 QOO 檢舉此回應
狀況一

Error:1045: Invalid user name and/or password.

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-connecting-errors.html


狀況三

Error: 1226 SQLSTATE: 42000 (ER_USER_LIMIT_REACHED)

Message: User '%s' has exceeded the '%s' resource (current value: %ld)

http://dev.mysql.com/doc/refman/5.7/en/user-resources.html


狀況二真是沒想過耶,讓使用者自行選擇查詢schema,這對使用者來說不一定好耶,使用者還得去了解table與schema的內容

如同您與DIAMOM大的想法,能先行做好權限管控的話,就不用考慮這些問題了
本篇文章回覆於2017-01-06 14:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

bon
檢舉此回應
我之前有試過mysql上handling connection errors example,但密碼輸入錯誤時得到的錯誤碼是0,不是1045。我使用的mysql版本是5.7,或許是新版本的問題?

剛開始規劃的時候,沒有多想就將資料庫的帳號管理應用在我程式的登入功能上,實際上我是不希望使用者能自己下sql語句,而且權限管理變得很難處理。目前的做法是在用戶端程式建立sql語句,然後根據使用者輸入去填空。

看來應該只開一個使用者帳號,然後利用資料庫function接收使用者輸入來建立sql語句,帳密另外用一個table管理,這樣的做法才是正確的?



本篇文章回覆於2017-01-06 18:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

QOO
捐贈 VP 給 QOO 檢舉此回應
我覺得也沒有什麼對錯啦

只是一般習慣的設計,會是您的系統(web or winForm)有自己的帳戶管理,而後端資料庫的帳號,可能只有數個而已

照您現在的設計,推測應該是一個開放介面,您在資料庫幫每個人開設帳號讓大家能使用

沒有不對,只是適不適當的問題而已


舉一個例子來說

假如說您的公司有1000人,所以您(DBA)就要替1000人在資料庫上開1000個帳號

但如果您將帳號的開設,放在系統之中,那帳號的異動,就是系統管理人員負責

依照您公司部門的權責劃分,在帳號的管理上,就可以有更細緻的分工,而不是全部交由DBA執行

畢竟,DB帳號開設的權利,不太可能交由您(DBA)以外的人吧


本篇文章回覆於2017-01-06 18:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
不錯的參考

Daimom
捐贈 VP 給 Daimom 檢舉此回應
樓上說得很對,
另外,非常不建議由使用者自行輸入sql語法,會有很多問題。
如果您的網站有對外,那就更危險了。
就算是對內,只要碰到有心人,隨便搞一下。也會出事。
可以參考一下 nuget上的identity 2.0
參考
看一下資料表的建立了哪些,以及怎麼設定權限。
本篇文章回覆於2017-01-09 10:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

bon
檢舉此回應
了解,感謝各位幫忙!
本篇文章回覆於2017-01-09 18:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.