同一个问题,大家帮帮我
查询:
If sqlcnn.State = ConnectionState.Closed Then sqlcnn.Open()
Dim str1 As String
str1 = "select * from PartMstr where Part_No='" & txt_Part.Text & "'"
' Dim sqlda As New SqlDataAdapter(str1, sqlcnn)
' Dim ds As New DataSet
' sqlda.Fill(ds)
'DataGrid1.DataSource = ds.Tables(0)
Dim sqldr_Part As SqlDataReader
sqlcmd.CommandText = str1
sqldr_Part = sqlcmd.ExecuteReader
While (sqldr_Part.Read)
cb.Text = sqldr_Part("B_Name")//老是在这些地方出错,是已经有打开的myreader
cb1.Text = sqldr_Part("S_Name")
cb2.Text = sqldr_Part("Brand_Name")
cb_status.Text = sqldr_Part("status")
txt_buyer.Text = sqldr_Part("Buyer")
txt_Part.Text = sqldr_Part("Part_No")
txt_Me.Text = sqldr_Part("S_NameE")
txt_buytime.Text = sqldr_Part("Buy_Date")
txt_Desc.Text = sqldr_Part("Part_Desc")
txt_Maintain.Text = sqldr_Part("Maintain_Card_No")
txt_limited.Text = sqldr_Part("maintain_Limited")
txt_Barcode.Text = sqldr_Part("Barcode")
txt_Price.Text = sqldr_Part("Price")
cb_Currency.Text = sqldr_Part("Currency")
rtb_memo.Text = sqldr_Part("Memo")
End While
sqldr_Part.Close()
sqlcnn.Close()
到底是怎么回事呀,竟然调用到了
Private Sub cb_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cb.SelectedIndexChanged
cb1.Text = ""
cb1.Items.Clear()
''sqlcnn.ConnectionString = "server=(local);database=hardware;integrated security=sspi;"
If sqlcnn.State = ConnectionState.Closed Then sqlcnn.Open()
Dim sqlcmdd As New SqlCommand
sqlcmdd.Connection = sqlcnn
sqlcmdd.CommandText = "select * from S_Type where B_Name = '" & cb.SelectedItem.ToString & "'"
Dim myReader As SqlDataReader = sqlcmdd.ExecuteReader(CommandBehavior.CloseConnection)
If myReader.HasRows Then
While myReader.Read()
cb1.Items.Add(myReader.GetString(2))
End While
myReader.Close()
End If
sqlcnn.Close()
End Sub
虽然代码有点乱,但还是希望高手帮我解决一下
为什么老是自动调用呀,我又没调用呀,老是说已有打开的myreader,谁告诉我怎么解决
先谢谢了
问题点数:40、回复次数:11Top
1 楼thinkingforever(努力学习)回复于 2005-06-01 16:36:45 得分 20
cb_SelectedIndexChanged方法执行过吗?是不是你操作是调用它了.
Private Sub cb_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cb.SelectedIndexChanged
cb1.Text = ""
cb1.Items.Clear()
''sqlcnn.ConnectionString = "server=(local);database=hardware;integrated security=sspi;"
If sqlcnn.State = ConnectionState.Closed Then sqlcnn.Open()
Dim sqlcmdd As New SqlCommand
sqlcmdd.Connection = sqlcnn
sqlcmdd.CommandText = "select * from S_Type where B_Name = '" & cb.SelectedItem.ToString & "'"
Dim myReader As SqlDataReader = sqlcmdd.ExecuteReader(CommandBehavior.CloseConnection)
If myReader.HasRows Then
While myReader.Read()
cb1.Items.Add(myReader.GetString(2))
End While
'myReader.Close()
End If
myReader.Close()'移到这里试试.
sqlcnn.Close()
End Sub
Top
2 楼gjmcg(Jimmy)回复于 2005-06-01 16:53:45 得分 0
我试了,还是没用呀
还是说,“已有打开的datareader”
我估计是调用了cb_SelectedIndexChanged,但怎么有可能呢
怎么会调用上去呢,只要注释掉
‘cb1.Text = sqldr_Part("S_Name")
’cb2.Text = sqldr_Part("Brand_Name")
就什么事也没了,郁闷呀Top
3 楼AntingZ(夕惕若)回复于 2005-06-01 17:13:04 得分 20
可能是你的B_Name字段为空(null)造成的
你这样试试看:
cb.Text = Convert.ToString(sqldr_Part("B_Name"))
Top
4 楼gjmcg(Jimmy)回复于 2005-06-01 18:37:00 得分 0
to: AntingZ
不是空的呀,有数据的
我按你的方法还是一样的错误呀
我估计是调用了cb_SelectedIndexChanged。把这段代码注释掉就没事了
但为什么会调用到呢
又应该怎么解决呢
哪位高手讲讲呀
Top
5 楼gjmcg(Jimmy)回复于 2005-06-01 18:37:51 得分 0
还有忘了说,只要不是数据库里的数据查询就没一点事
你说奇怪不奇怪呀Top
6 楼AntingZ(夕惕若)回复于 2005-06-01 20:05:16 得分 0
哈,代码有点多,刚才看花眼了。
你的cb是个ComboBox吧,在给cb.text赋值的时候有可能(如果所赋的值在items中)引发cb的SelectedIndexChanged事件。
但你说错误停在cb.Text = sqldr_Part("B_Name")这行,很可能是你在其他打开的sqlDataReader之类的没有关闭。你在
sqldr_Part = sqlcmd.ExecuteReader
之前增加
sqlcnn.Close()
sqlcnn.Open()
试试看
就是这样:
Dim sqldr_Part As SqlDataReader
sqlcmd.CommandText = str1
sqlcnn.Close() '增加这2行试试看
sqlcnn.Open()
sqldr_Part = sqlcmd.ExecuteReader
While (sqldr_Part.Read)
cb.Text = sqldr_Part("B_Name")//老是在这些地方出错,是已经有打开的myreader
...
Top
7 楼gjmcg(Jimmy)回复于 2005-06-01 21:54:25 得分 0
to:AntingZ
cb是combobox控件
但这样还是出同样的错,我cb,cb1都是combobox控件
按你的方法,
未处理的“System.InvalidOperationException”类型的异常出现在 system.data.dll 中。
其他信息: 阅读器关闭时 read data 的尝试无效。
奇怪呀,头都搞晕了
有没有方法,让这个过程保护起来,不被调用呀Top
8 楼AntingZ(夕惕若)回复于 2005-06-01 22:18:18 得分 0
如果你的代码不回泄露什么机密的话,可以把代码发给我,我看看Top
9 楼gjmcg(Jimmy)回复于 2005-06-02 09:53:21 得分 0
没事的啦
我是学生,还1个多月毕业呢,呵呵
那我要怎么发给你呢
你帮我看看
顺便给我点意见,好吗,谢谢Top
10 楼gjmcg(Jimmy)回复于 2005-06-02 09:58:39 得分 0
这是我那个块的所有代码,窗体自动生成的代码,我就省略了
Imports System.Data.SqlClient
Public Class Part_New
Inherits System.Windows.Forms.Form
Windows 窗体设计器生成代码
Dim sqlcnn As New SqlConnection
Dim sqlcmd As New SqlCommand
Dim myreader As SqlDataReader
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
'showdata()
If Trim(txt_Part.Text) = "" Then
MessageBox.Show("ID不能为空!")
Return
End If
sqlcnn.Open()
sqlcmd.Connection = sqlcnn
Dim strt As String
Dim strg As String
strg = "select * from PartMstr where S_Name='" & cb1.Text & "'"
sqlcmd.CommandText = strg
Dim sqldada As New SqlDataAdapter(strg, sqlcnn)
Dim sqldataset As New DataSet
sqldada.Fill(sqldataset)
Mid(txt_Part.Text, 8, 3) = sqldataset.Tables(0).Rows.Count
Mid(txt_Barcode.Text, 2, 8) = txt_Part.Text
If MessageBox.Show("确定要保存吗?", "零件管理-确定", MessageBoxButtons.OKCancel) = DialogResult.OK Then
If Trim(txt_Part.Text) = "" Then
MessageBox.Show("ID不能为空!")
sqlcnn.Close()
Return
Else
sqlcmd.CommandText = "Select * From PartMstr Where Part_No='" & txt_Part.Text & "'"
Dim sqlr As SqlDataReader = sqlcmd.ExecuteReader()
If sqlr.Read Then
MessageBox.Show("此编号已经存在")
sqlr.Close()
sqlcnn.Close()
Return
Else
sqlr.Close()
End If
End If
Dim str As String
str = "insert into PartMstr(Part_No,Serial_No,B_Name,S_Name,S_NameE,Buy_Date,Buyer,Brand_Name,Part_Desc,Maintain_Card_No,Maintain_Limited,Price,Currency,Barcode,Status,Memo) values("
str = str & "'" & txt_Part.Text & "',"
str = str & "'" & txt_Serial.Text & "',"
str = str & "'" & cb.Text & "',"
str = str & "'" & cb1.Text & "',"
str = str & "'" & txt_Me.Text & "',"
str = str & "'" & txt_buytime.Text & "',"
str = str & "'" & txt_buyer.Text & "',"
str = str & "'" & cb2.Text & "',"
str = str & "'" & txt_Desc.Text & "',"
str = str & "'" & txt_Maintain.Text & "',"
str = str & "'" & txt_limited.Text & "',"
str = str & "'" & txt_Price.Text & "',"
str = str & "'" & cb_Currency.Text & "',"
str = str & "'" & txt_Barcode.Text & "',"
str = str & "'" & cb_status.Text & "',"
str = str & "'" & rtb_memo.Text & "')"
sqlcmd.CommandText = str
sqlcmd.ExecuteNonQuery()
MsgBox("保存成功!")
close_txt()
sqlcnn.Close()
End If
sqlcnn.Close()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
sqlcnn.Open()
If MessageBox.Show("确定要修改吗?", "更改零件 - 确认", MessageBoxButtons.OKCancel) = DialogResult.OK Then
If Trim(txt_Part.Text) = "" Then
MessageBox.Show("零件编号不能为空!")
Return
End If
Dim str As String
str = "update PartMstr set Part_No= " & txt_Part.Text & ",B_Name= '" & cb.Text & "',S_Name= '" & cb1.Text & "',S_NameE= '" & txt_Me.Text & "',Serial_No='" & txt_Serial.Text & "',Buy_Date= '" & txt_buytime.Text & "',Buyer= '" & txt_buyer.Text & "',Brand_Name= '" & cb2.Text & "',Part_Desc= '" & txt_Desc.Text & "',Maintain_Card_No= '" & txt_Maintain.Text & "',Maintain_Limited= '" & txt_limited.Text & "',Price= '" & txt_Price.Text & "',Currency= '" & cb_Currency.Text & "',Barcode= '" & txt_Barcode.Text & "',Status= '" & cb_status.Text & "',Memo='" & rtb_memo.Text & "' where Part_No='" & txt_Part.Text & "'"
sqlcmd.CommandText = str
sqlcmd.ExecuteNonQuery()
MsgBox("更改成功")
sqlcnn.Close()
End If
End Sub
Private Sub close_txt()
cb.Enabled = False
cb1.Enabled = False
cb2.Enabled = False
cb_status.Enabled = False
txt_Part.Enabled = False
txt_Me.Enabled = False
txt_buytime.Enabled = False
txt_Desc.Enabled = False
txt_Maintain.Enabled = False
txt_limited.Enabled = False
txt_Barcode.Enabled = False
txt_Price.Enabled = False
cb_Currency.Enabled = False
txt_buyer.Enabled = False
rtb_memo.Enabled = False
txt_Serial.Enabled = False
End Sub
Private Sub add()
cb.Enabled = True
cb1.Enabled = True
cb2.Enabled = True
cb_status.Enabled = True
txt_Part.Enabled = True
txt_Me.Enabled = True
txt_buytime.Enabled = True
txt_Desc.Enabled = True
txt_Maintain.Enabled = True
txt_limited.Enabled = True
txt_Barcode.Enabled = False
txt_Price.Enabled = True
cb_Currency.Enabled = True
txt_buyer.Enabled = True
rtb_memo.Enabled = True
txt_Serial.Enabled = True
End Sub
Private Sub addclear()
cb.Text = ""
cb1.Text = ""
cb2.Text = ""
cb_status.Text = ""
txt_Part.Text = ""
txt_Me.Text = ""
txt_buytime.Text = ""
txt_Desc.Text = ""
txt_Maintain.Text = ""
txt_limited.Text = ""
txt_Serial.Text = ""
'txt_Barcode.Text = ""
txt_Price.Text = ""
rtb_memo.Text = ""
txt_buyer.Text = ""
End Sub
Private Sub Part_New_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim str As String
sqlcnn.ConnectionString = "server=(local);database=hardware;integrated security=sspi;"
sqlcnn.Open()
sqlcmd.Connection = sqlcnn
str = "select B_Name from B_Type"
sqlcmd.CommandText = str
'Dim myReader As SqlDataReader = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection)
myreader = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection)
If myreader.HasRows Then
While myreader.Read()
cb.Items.Add(myreader.GetSqlString(0))
End While
myreader.Close()
End If
sqlcnn.Close()
close_txt()
End Sub
Private Sub cb1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cb1.SelectedIndexChanged
cb2.Items.Clear()
If sqlcnn.State = ConnectionState.Closed Then sqlcnn.Open()
Dim str As String
str = "select * from brand where S_Name='" & cb1.SelectedItem.ToString & "'"
Dim sqlcmd As New SqlCommand
sqlcmd.Connection = sqlcnn
sqlcmd.CommandText = str
'Dim myReader As SqlDataReader = sqlcmd.ExecuteReader
myreader = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection)
If myreader.HasRows Then
While (myreader.Read)
cb2.Items.Add(myreader.GetString(3))
txt_Part.Text = myreader("S_Id")
End While
myreader.Close()
End If
myreader.Close()
sqlcnn.Close()
End Sub
Top
11 楼gjmcg(Jimmy)回复于 2005-06-02 09:59:21 得分 0
Private Sub cb_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cb.SelectedIndexChanged
cb1.Text = ""
cb1.Items.Clear()
If sqlcnn.State = ConnectionState.Closed Then sqlcnn.Open()
'Try
Dim sqlcmdd As New SqlCommand
Dim str As String
str = "select * from S_Type where B_Name = '" & cb.SelectedItem.ToString & "'"
sqlcmdd.Connection = sqlcnn
sqlcmdd.CommandText = str
' Dim myReader As SqlDataReader = sqlcmdd.ExecuteReader(CommandBehavior.CloseConnection)
myreader = sqlcmdd.ExecuteReader(CommandBehavior.CloseConnection)
If myreader.HasRows Then
While myreader.Read()
cb1.Items.Add(myreader.GetString(2))
txt_Part.Text = myreader("B_Id")
End While
myreader.Close()
End If
' Catch ex As Exception
' Debug.Write(ex)
' End Try
sqlcnn.Close()
End Sub
Private Sub ck_add_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ck_add.CheckedChanged
If ck_add.Checked = True Then
addclear()
add()
End If
If ck_add.Checked = False Then
close_txt()
End If
End Sub
Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
sqlcnn.Open()
' Try
Dim str As String
str = "select * from PartMstr where Part_No='" & txt_Part.Text & "'"
sqlcmd.Connection = sqlcnn
sqlcmd.CommandText = str
' Dim sqldr_Part As SqlDataReader
myreader = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection)
While myreader.Read()
'cb.Text = myreader("B_Name")
'cb.Text = Convert.ToString(myreader("B_Name"))convert.tostring是覆盖空值
'cb1.Text = myreader("S_Name")
cb2.Text = myreader("Brand_Name")
cb_status.Text = myreader("status")
txt_Serial.Text = myreader("Serial_No")
txt_buyer.Text = myreader("Buyer")
txt_Part.Text = myreader("Part_No")
txt_Me.Text = myreader("S_NameE")
txt_buytime.Text = myreader("Buy_Date")
txt_Desc.Text = myreader("Part_Desc")
txt_Maintain.Text = myreader("Maintain_Card_No")
txt_limited.Text = myreader("maintain_Limited")
txt_Barcode.Text = myreader("Barcode")
txt_Price.Text = myreader("Price")
cb_Currency.Text = myreader("Currency")
rtb_memo.Text = myreader("Memo")
End While
'Catch ex As Exception
' 'MessageBox.Show("添加零件处出错")
' Debug.Write(ex)
'End Try
myreader.Close()
sqlcnn.Close()
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Me.Close()
End Sub
Private Sub Part_New_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
sqlcnn.Close()
End Sub
Private Sub showdata()
sqlcnn.Open()
Dim str_Updata As String
str_Updata = "select * from PartMstr" 'where Part_No='" & txt_Part.Text & "'"
Dim sqldada As New SqlDataAdapter(str_Updata, sqlcnn)
Dim sqldataset As New DataSet
sqldada.Fill(sqldataset)
sqlcnn.Close()
End Sub
End Class
Top




