为什么我的DBProviderFactory的表现与SQLClientFactory的性能不同?
-
11-10-2019 - |
题
我实施了一个自定义 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 Up)时。这起作用了,但是在实施此功能之后,我有一个例外 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一起使用。使用调试器时,表明该集合中有1个参数 x_id
使用时 MyProvider
, , 和 @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 "@";
}
}
因此,当使用您自己的提供商时,它与预期的提供商名称不匹配,因此它只是返回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 "@";
}
}
}
不隶属于 StackOverflow