更新我必須在我的問題中澄清一些事情嗎?我很驚訝地看到我在兩週內沒有得到任何評價,評論或答案。什麼時候SqlCommand.StatementCompleted應該觸發?
我想寫一個簡單的winforms應用程序,執行SQL SELECT語句異步。當sql服務器開始返回結果時,我想執行一個事件處理程序,它已連接到SqlCommand的StatementCompleted事件。
該表單包含兩個按鈕,一個文本框和一個標籤。當單擊button1時,我創建SqlCommand並連接事件處理程序,然後打開SqlConnection並調用BeginExecuteReader以啓動異步操作。我設置我的標籤以顯示命令正在執行。
在事件處理程序中,我只需設置標籤以顯示命令完成。
單擊按鈕2時,我更改標籤以顯示我們正在處理結果。然後我調用EndExecuteReader並將其返回值分配給一個新的SqlDataReader,然後再處理。
我看到的是,當命令準備就緒時,事件處理程序不會被調用。相反,當我的代碼完成處理由EndExecuteReader返回的閱讀器時,它會被調用。
我失去了一些東西在這裏?我是否誤解了事件的預期用途?我試圖找到一個StatementCompleted的例子,但我只能找到它的一般描述,沒有工作代碼。 SqlCommand.BeginExecuteReader page at MSDN上的示例使用循環並等待IAsyncResult.IsCompleted屬性爲true。我期望在該屬性成立的同時,StatementCompleted事件觸發。
public Form1() {
InitializeComponent();
}
private IAsyncResult iAsyncResult;
private SqlCommand sqlCommand;
private void statementCompleted(object sender,
StatementCompletedEventArgs e) {
label1.Text = "Statement completed";
}
private void button1_Click(object sender, EventArgs e) {
var northWindConnection =
new SqlConnection(
"Data Source=.\\SqlExpress;Initial Catalog=Northwind;" +
"Integrated Security=True;" +
"asynchronous processing=true");
sqlCommand = new SqlCommand("WAITFOR DELAY '00:00:05';" +
" SELECT * FROM [Order Details]",
northWindConnection);
sqlCommand.StatementCompleted += statementCompleted;
northWindConnection.Open();
iAsyncResult = sqlCommand.BeginExecuteReader();
label1.Text = "Executing";
}
private void button2_Click(object sender, EventArgs e) {
label1.Text = "Not waiting anymore, reading";
var results = new StringBuilder();
var reader = sqlCommand.EndExecuteReader(iAsyncResult);
while (reader.Read()) {
for (int i = 0; i < reader.FieldCount; i++) {
results.Append(reader[i].ToString() + "\t");
}
results.Append(Environment.NewLine);
}
reader.Close();
sqlCommand.Connection.Close();
textBox1.Text = results.ToString();
}
謝謝你第一個發表一個答案!調用EndExecuteReader時觸發StatementCompleted事件的事實是我在我的問題中已經提到的。你的答案似乎只是重複我發現的。是的,它確實觸發了,但只在EndExecuteReader上。是的,這意味着它沒有用。但是它在何處記載了直到EndExecuteReader纔會觸發StatementCompleted事件?該文檔僅聲明它在「執行Transact-SQL語句完成時」觸發。 – comecme 2011-04-26 20:51:10