私は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);
}
に、次のロジックを追加した以外、私はこれをしなかった私はそれがすべてSqlCallsをログに記録する終了時SqlDataSource
は、コマンドを作成し、いつでも私は(追跡可能性SQLXタイプを返されたカスタムDbProviderFactory
を実装SQLプロファイラをアップする必要はありません)。これは私が私が背後にあるコードでは、次の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はこれが標準SqlClientFactoryで働いていても、存在しない「@x_id」ということでした。デバッガを使用すると、MyProvider
を使用している場合はx_id
のコレクションに1つのパラメータがあり、デフォルトのプロバイダを使用している場合は@x_id
であることがわかりました。
これには何らかの理由がありますか、@を自動的に追加する方法がありますか、またはコードビハインドと@があるかどうかについてSqlDataSource
が一致していることを確認してください。
ストアドプロシージャはまだ '@'記号なしで動作します。幸いなことに、このコレクションを直接操作することはありませんが、なぜこれが最初に起こるのか知りたいのですが。
ありがとうございました。