加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么我的DbProviderFactory的表现与SqlClientFactory不

发布时间:2020-12-15 21:13:26 所属栏目:百科 来源:网络整理
导读:我实现了一个自定义的DbProviderFactory,它返回了SqlX类型,除了我向CreateCommand添加了以下逻辑 public override DbCommand CreateCommand(){ var cmd = new SqlCommand(); if (CommandCreated != null) CommandCreated(cmd,EventArgs.Empty); cmd.Statemen
我实现了一个自定义的DbProviderFactory,它返回了SqlX类型,除了我向CreateCommand添加了以下逻辑

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(不需要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中有1个参数,使用默认提供程序时表示@x_id.

有什么理由这样做,并且有一些方法我可以自动添加@或者我应该确保代码隐藏和SqlDataSource同意是否存在@.
存储过程仍然可以在没有’@’符号的情况下工作,幸运的是我不会对参数集合进行直接操作,但我想知道为什么会发生这种情况.

谢谢您的帮助.

解决方法

挖掘更多后,我在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 "@";
  }
}

因此,当使用您自己的Provider时,它与预期的Provider名称不匹配,因此它只返回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 "@";
        }
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读