我实现了一个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
为了在创建命令时进行跟踪,然后在完成记录所有 SqlCall 时进行跟踪(无需启动 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。使用调试器时,它显示x_id
使用时集合中有 1 个参数MyProvider
,@x_id
使用默认提供程序时。
这有什么原因吗?是否有某种方法可以自动添加@,或者我应该确保代码隐藏并SqlDataSource
就是否存在@达成一致。
存储过程在没有“@”符号的情况下仍然可以工作,幸运的是我没有对参数集合进行这种直接操作,但我想知道为什么会首先发生这种情况。
谢谢您的帮助。