2010-12-17 118 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 "@"; 
     } 
    } 

} 
相关问题