我实现了自定义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集合,但我想知道为什么会发生这种情况。
感谢您的帮助。