2010-12-17 89 views
4

我實現了自定義DbProviderFactory除了我添加了以下邏輯CreateCommand爲什麼我的DbProviderFactory與SqlClientFactory執行的操作不同?

public override DbCommand CreateCommand() 
{ 
    var cmd = new SqlCommand(); 
    if (CommandCreated != null) 
     CommandCreated(cmd, EventArgs.Empty); 
    cmd.StatementCompleted += cmd_StatementCompleted; 
    return cmd; 
} 

void cmd_StatementCompleted(object sender, StatementCompletedEventArgs e) 
{ 
    if (StatementCompleted != null) 
     StatementCompleted(sender, e); 
} 

我這樣做,這樣我就可以跟蹤每當SqlDataSource創建一個命令,然後當它完成記錄所有SqlCalls其返回的SQLX類型(而不需要Sql Profiler)。這個工作,我實現了這個不過之後我得到以下SqlDataSource

<asp:SqlDataSource ProviderName="MyProvider" ID="SqlDataSource1" 
    runat="server" ConnectionString="<%$ ConnectionStrings:default %>" 
    SelectCommandType="StoredProcedure" 
    SelectCommand="dbo.GetX" 
    OnSelecting="SqlDataSource1_Selecting"> 
    <SelectParameters> 
     <asp:Parameter Name="x_id" Type="Byte"/> 
    </SelectParameters> 
</asp:SqlDataSource> 

,這後面的代碼中的異常。

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    e.Command.Parameters["@x_id"].Value = "something else"; 
} 

拋出的錯誤是,SqlParameter的「@x_id」不存在,即使這個工作與標準SqlClientFactory。使用調試器時,顯示使用默認提供程序時使用MyProvider@x_id時,集合x_id中有1個參數。

是否有某種原因,是有一些方法可以讓我得到@的自動添加,或者我應該只是確保代碼隱藏和SqlDataSource同意是否有@與否。
存儲過程仍然沒有'@'符號,幸運的是我不直接操作Parameters集合,但我想知道爲什麼會發生這種情況。

感謝您的幫助。

回答

1

挖經過我發現SqlDataSourceView

的來源如下
protected virtual string ParameterPrefix 
{ 
    get 
    { 
    if (!string.IsNullOrEmpty(this._owner.ProviderName) && !string.Equals(this._owner.ProviderName, "System.Data.SqlClient", StringComparison.OrdinalIgnoreCase)) 
    { 
     return string.Empty; 
    } 
    return "@"; 
    } 
} 

等使用自己的供應商,當它不符合預期的供應商名稱,所以它只是返回的String.Empty。如果你需要這樣做,那麼你將不得不子類SqlDataSource和SqlDataSourceView

public class MySqlDataSource : SqlDataSource 
{ 
    protected override SqlDataSourceView CreateDataSourceView(string viewName) 
    { 
     return new MySqlDataSourceView(this, viewName, this.Context); 
    } 
} 

public class MySqlDataSourceView : SqlDataSourceView 
{ 
    private MySqlDataSource _owner; 
    public MySqlDataSourceView(IPSqlDataSource owner, string name, System.Web.HttpContext context) 
     : base(owner, name, context) 
    { 
     _owner = owner; 
    } 

    protected override string ParameterPrefix 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(this._owner.ProviderName) && !string.Equals(this._owner.ProviderName, "MyProvider", StringComparison.OrdinalIgnoreCase)) 
      { 
       return base.ParameterPrefix; 
      } 
      return "@"; 
     } 
    } 

} 
相關問題