- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我实现了一个自定义的 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 "@";
}
}
}
关于c# - 为什么我的 DbProviderFactory 的执行方式与 SqlClientFactory 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4474774/
我实现了一个自定义的 DbProviderFactory,它返回了 SqlX 类型,除了我将以下逻辑添加到 CreateCommand public override DbCommand Create
我有一个带有 Controller 的 .Net Core WebApi 项目,该 Controller 调用服务、类库以获取数据。该服务使用 Entity Framework ,而不是 EFCore
尝试在使用 Entity Framework 6 的项目中运行集成测试导致错误: SetUp : System.NotSupportedException : Unable to determine
我有一个使用 Entity Framework 和 SQLServer 的网站。当我尝试在 Azure 上运行我的应用程序时,出现以下错误: Unable to determine the provi
我使用带有Asp.net核心的EF6,通过dbcontext调用db时出现错误: System.NotSupportedException: Unable to determine the provi
我是一名优秀的程序员,十分优秀!