﻿# 使用強型別資料集(Typed DataSet)需注意欄位長度的陷阱

強型別資料集(Typed DataSet)我已經很久沒用了，不過還是有些舊案子還在維護多少會用到，今天在寫程式時發現有個非常詭異的現象，研究出來後才發現這可能會引發一些**潛在的**資安問題，因此寫起來提醒各位。

我有個**強型別資料集** (Typed DataSet) 的 Typed DataTable，該表格的 Primary Key 欄位長度為 10，在資料庫中定義的欄位是 Varchar2(10)   \[ 備註: 我這次用的是 Oracle 資料庫，但此陷阱應該跟 DB 無關 \]

![Properties: 我有個強型別資料集 (Typed DataSet) 的 Typed DataTable，該表格的 Primary Key 欄位長度為 10，在資料庫中定義的欄位是 Varchar2(10)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0be626dad1822d17b261-image.png "Properties: 我有個強型別資料集 (Typed DataSet) 的 Typed DataTable，該表格的 Primary Key 欄位長度為 10，在資料庫中定義的欄位是 Varchar2(10)")

當我利用 Typed TableAdapter 進資料庫查詢時，剛好傳入的 ID 長度為 10，例如：

```
ta.GetDataByID("A12345679");
```

而資料庫中也正好有 A123456789 這筆資料，所以資料可以正常取回。

但是當我測試輸入一個不存在的 ID 值時，竟然也回傳資料，如下範例：

```
ta.GetDataByID("A123456790");ta.GetDataByID("A12345679ABCDE");ta.GetDataByID("A12345679------");ta.GetDataByID("A12345679A12345679");
```

很詭異吧！

我查看了一下我的 Typed TableAdapter 中定義的參數清單，發現我傳入的 ID 參數大小也設定為 10

![Parameters Collection Editor](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/50ddf8f061d908f37cd6-image.png "Parameters Collection Editor")

最後我才發現，只要傳入的資料超過參數設定的 Size 上限就會自動被截斷，然後才傳入資料庫查詢，雖然資料庫收到的只有前 10 個字元，但在你原本的 .NET 程式若也有用到這個傳入參數時，你可能不會料想到會有這種行為，也很可能會發生未預期的錯誤發生。

例如你若透過**強型別資料集**提供的方法進行驗證登入是否成功，驗證過後就以登入的帳號對資料庫進行操作，雖然驗證通過，但帳號卻是錯誤的，這時就不知道會發生什麼事了。

雖然不是什麼嚴重的問題，但你也可能跟我一樣覺得很困惑(confuse)，所以在寫程式時可能要特別注意。
