我實現了自定義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集合,但我想知道爲什麼會發生這種情況。
感謝您的幫助。