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 "@"; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |