2014-07-10 51 views
0

我在另一個sqldatareader內部使用sqldatareader聲明MultipleActiveResultSets = True。但它給一個異常「無效的嘗試調用read時讀取器已關閉」表在另一個sqldatareader內部使用sqldatareader生成錯誤

con.ConnectionString = "Data Source=HELLO-PC; Initial Catalog=hrmdb; Integrated Security=True; MultipleActiveResultSets=True" 
    con.Open() 
    Dim cmd2 As New SqlCommand("select count(*) from empsal", con) 
    Dim dr2 As SqlDataReader = cmd2.ExecuteReader() 
    While dr2.Read() 
     Dim count As Integer = dr2(0).ToString 
    End While 
    dr2.Close() 
    Dim cmd3 As New SqlCommand("select emplycode from empsal", con) 
    Dim dr3 As SqlDataReader = cmd3.ExecuteReader() 
    While dr3.Read() 
     code1 = dr3(i2).ToString 
     Dim cmd1 As New SqlCommand("select total from empsal where emplycode='" + code1 + "'", con) 
     Dim dr10 As SqlDataReader = cmd1.ExecuteReader() 
     While dr10.Read() 
      tot = dr10(0).ToString 
     End While 
     dr10.Close() 
     pTax = professionalTax(tot) 
     ESI(tot) 
     PF(code1, tot) 
     adDebits = addDebits() 
     eDebits = extraDebits(code1) 
     iTax = IncomeTax(tot) 
     txfrm = taxForm(code1, tot) 
     abf = absentFine(code1, tot) 
     totsal1 = tot - (Convert.ToDouble(pTax.ToString) + Convert.ToDouble(adDebits.ToString) + Convert.ToDouble(eDebits.ToString) + Convert.ToDouble(iTax.ToString) + Convert.ToDouble(txfrm.ToString) + Convert.ToDouble(abf.ToString) + Convert.ToDouble(esi1.ToString) + Convert.ToDouble(esi2.ToString) + Convert.ToDouble(pf1.ToString) + Convert.ToDouble(pf2.ToString)) 
     com = New SqlCommand("INSERT INTO fnlreport (enumbr,pcd,pnm,dcd,dnm,totsal,pt,it,pf,cpf,esi,cesi,debits,edebits,absent,txfrm,tot,mnth1,year1) VALUES ('" + code1 + "','" + TextBox7.Text + "','" + ComboBox7.Text + "','" + TextBox8.Text + "','" + ComboBox8.Text + "','" + tot.ToString + "','" + pTax.ToString + "','" + iTax.ToString + "','" + pf1.ToString + "','" + pf2.ToString + "','" + esi1.ToString + "','" + esi2.ToString + "','" + adDebits.ToString + "','" + eDebits.ToString + "','" + abf.ToString + "','" + txfrm.ToString + "','" + totsal1.ToString + "','" + TextBox9.Text + "','" + TextBox10.Text + "')", con) 
     com.ExecuteNonQuery() 
     i2 = i2 + 1 
    End While 
    dr3.Close() 
    con.Close() 

第一行被插入和發生異常的「而dr3.Read()」

+0

亂七八糟的代碼弄亂了嗎?我不驚訝。更新您的代碼,但是這次在所有'IDisposable'對象上使用['Using'](http://msdn.microsoft.com/en-us/library/htd05whh.aspx)關鍵字。 –

+0

我沒有看到你聲明「tot」的地方。 – alybaba726

+0

http://stackoverflow.com/questions/2057534/using-multiple-data-readers –

回答

1

我沒有知道你在代碼的下半部分想要做什麼,沒有你的變量被聲明,也沒有評論。但是,前半部分:

第一條SQL語句只是爲了獲取表中的行數,是否正確? 嘗試:

Dim cmd as new SQLCommand("Select count(*) from empsal", con) 
Dim count as integer = cmd.ExecuteScalar() 

這將返回行數爲整數,沒有必要通過一個行迴歸閱讀。

其次,您需要每個員工代碼的總銷售額,對嗎? 嘗試:

Dim cmd2 as new SQLCommand("Select emplycode, sum(*) from empsal group by emplycode", con) 
Dim rdr as new SQLDataReader = cmd2.ExecuteReader() 

在那之後,我不知道......我們需要更多的信息。你的代碼很sl and,大部分是不必要的!

+0

我沒有找到每個員工的總銷售額。 total是表empsal中的字段名稱,我正在檢索它。對於每個員工的總數,我想要計算職業稅,借記,收入等。然後將這些值插入到fnlreport表中。但它僅適用於1名員工,發生異常 – user3774245

+0

非常感謝您從我的第一個建議中得到了一條提示,現在我的代碼正在運行。 – user3774245

+0

很高興幫助!如果你可以首先在你的服務器環境中測試你的SQL語句,它總是會有很大的幫助。幫助您確定是否存在語法錯誤,並幫助您可視化輸出結果的外觀! – alybaba726