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);
}
これを行ったのは、コマンドが作成されたときと、すべての SqlCalls のログが終了したときを追跡できるようにするためSqlDataSource
です (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";
}
スローされたエラーは、標準の SqlClientFactory で機能したにもかかわらず、SqlParameter "@x_id" が存在しないというものでした。デバッガーを使用すると、コレクションに 1 つのパラメーターがあり、x_id
デフォルトプロバイダーを使用する場合に表示されました。MyProvider
@x_id
これには何らかの理由があり、@ を自動的に追加する方法がありますか、それともコード ビハインドを確認しSqlDataSource
、@ があるかどうかに同意する必要があります。
ストアド プロシージャは '@' 記号がなくても機能します。幸いなことに、私はこのように Parameters コレクションを直接操作することはあまりありませんが、そもそもなぜこれが起こるのか知りたいです。
助けてくれてありがとう。