0%

LinqToSql ExcuteQuery回傳Binary的問題

最近發現用LinqToSQL的物件模型,使用ExecuteQuery<Binary>的方式執行SQL會回傳
型別’System.Data.Linq.Binary’ 必須宣告預設(無參數)建構涵式,才能在對應時加以建構,
的問題

實際案例如下:

  • 先在DB裡建立一個Function ```sql
    create function [dbo].[fb_CreatePWD]
    (
    @Param1 varchar(150)
    )
    RETURNS varbinary (150)
    AS
    BEGIN
    DECLARE @ResultVar varbinary(150)
    select @ResultVar = pwdencrypt(@Param1)

    RETURN @ResultVar
    

    END

1
2
3
4
5
6
7
```sql
</pre>
* 接著在MSSMS上測試是可以正常的[![](http://4.bp.blogspot.com/-9so5HU0Hkr0/Vih51QjzYZI/AAAAAAAAHe8/mIYlcdaDToA/s1600/1.png)](http://4.bp.blogspot.com/-9so5HU0Hkr0/Vih51QjzYZI/AAAAAAAAHe8/mIYlcdaDToA/s1600/1.png)

* 然後移到LinqToSql的DataContext試試看```csharp
var result = this.ExecuteQuery<binary>("select dbo.fn_CreatePWD({0})","ok").FirstOrDefault();
</binary>

得到以下錯誤訊息
型別 ‘System.Data.Linq.Binary’ 必須宣告預設 (無參數) 建構函式,才能在對應時加以建構

  • 網路上找到有人說用byte[]接可以,所以立馬做一下測試 ```csharp
1
2
<pre class="brush:csharp">var result = this.ExecuteQuery<binary>("select dbo.fn_CreatePWD({0})","ok").FirstOrDefault();
</binary>

結果一樣GG, 型別 ‘System.Byte[]’ 必須宣告預設 (無參數) 建構函式,才能在對應時加以建構。

接著改用Entity Framework 6.0來試試看* 一樣不行

  • 換成Byte[]就可以了!!!

    所以還是趕快放棄LinqToSql這個被放棄掉的產品,投入Entity Framwork的懷抱吧XD

*
這邊特別備註一下,如果今天是直接用物件模型將function拉進來,並且直接對xxxDataContext.fn_CreatePWD()操作是可以運作沒問題.

但因為我今天的狀況是在Repository Pattern的情況下,並不會真的對實體做操作,而是全部都對基底類別DataContext做執行,所以沒有這個Method可以使用

我想以上狀況應該是LinqToSql的Bug吧!!網路上也查了滿久的資料,好像沒有人對這塊有比較好的處理方式,如果有再補充上來~