.net 使用给定值搜索数据库
好了,伙计们,这对我来说是个棘手的问题。我有一个数据库,在那里我有特定的客户和他们的订单数量。我正在编写一个脚本,同时也在使用DataOleDb,以便访问这个Orders数据库,这只是我创建的一个简单的access数据库。基本上,我希望用户在文本框中插入一个ID,然后按下一个按钮。之后,该按钮将搜索具有所述ID的客户,并向用户显示该客户订单的价值.net 使用给定值搜索数据库,.net,vb.net,.net,Vb.net,好了,伙计们,这对我来说是个棘手的问题。我有一个数据库,在那里我有特定的客户和他们的订单数量。我正在编写一个脚本,同时也在使用DataOleDb,以便访问这个Orders数据库,这只是我创建的一个简单的access数据库。基本上,我希望用户在文本框中插入一个ID,然后按下一个按钮。之后,该按钮将搜索具有所述ID的客户,并向用户显示该客户订单的价值 Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim conn As OleDbConnection = New OleDbConnection
Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Dim dataFile = "C:\users\admin\Desktop\SAD.accdb"
conn.ConnectionString = provider & dataFile
conn.Open()
'Dim q = "SELECT CASE WHEN SUM(CASE WHEN Payment='Y' THEN OrderValue ELSE 0 END) > SUM(CASE WHEN Payment='N' THEN OrderValue ELSE 0 END) THEN 'good' ELSE 'bad' END type_of_client FROM Orders WHERE CustomerID = '+TextBox2.text+'"
Dim q = "SELECT OrderValue FROM Orders WHERE CustomerID=" + TextBox2.Text
Dim cmd As OleDbCommand = New OleDbCommand(q, conn)
Dim da As New OleDbDataAdapter(q, conn)
Dim dr As OleDbDataReader = cmd.ExecuteReader
dr.Close()
cmd.Dispose()
End Sub
问题是,在.NET中使用参数化命令时,我还是一个初学者。我在C语言中使用过它们,但在C语言中它们是完全不同的。因此,我的SELECT查询已经工作了,但是我如何使用它从数据库中提取的结果将其显示在某个地方呢。我的意思是OrderValue毕竟是他最初搜索的信息
请原谅评论的脚本行,这实际上是我的全部任务,检查客户是否支付了费用,这样我就可以看出他是一个好客户还是坏客户,但这是一个很小的步骤。循环dr.read以循环DataReader,并使用dr.item0,因为您的查询中只有一个值来从读取器中调用该值
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim conn As OleDbConnection = New OleDbConnection
Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Dim dataFile = "C:\users\admin\Desktop\SAD.accdb"
conn.ConnectionString = provider & dataFile
conn.Open()
Dim q = "SELECT CASE WHEN SUM(CASE WHEN Payment='Y' THEN OrderValue ELSE 0 END) > SUM(CASE WHEN Payment='N' THEN OrderValue ELSE 0 END) THEN 'good' ELSE 'bad' END type_of_client FROM Orders WHERE CustomerID = '+TextBox2.text+'"
Dim q = "SELECT OrderValue FROM Orders WHERE CustomerID=" + TextBox2.Text
Dim cmd As OleDbCommand = New OleDbCommand(q, conn)
Dim da As New OleDbDataAdapter(q, conn)
Dim dr As OleDbDataReader = cmd.ExecuteReader
While (dr.read)
Console.writeline(dr.item(0))
loop
dr.Close()
cmd.Dispose()
End Sub
下面的示例使用console.writeline从读取器中调出值
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim conn As OleDbConnection = New OleDbConnection
Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Dim dataFile = "C:\users\admin\Desktop\SAD.accdb"
conn.ConnectionString = provider & dataFile
conn.Open()
Dim q = "SELECT CASE WHEN SUM(CASE WHEN Payment='Y' THEN OrderValue ELSE 0 END) > SUM(CASE WHEN Payment='N' THEN OrderValue ELSE 0 END) THEN 'good' ELSE 'bad' END type_of_client FROM Orders WHERE CustomerID = '+TextBox2.text+'"
Dim q = "SELECT OrderValue FROM Orders WHERE CustomerID=" + TextBox2.Text
Dim cmd As OleDbCommand = New OleDbCommand(q, conn)
Dim da As New OleDbDataAdapter(q, conn)
Dim dr As OleDbDataReader = cmd.ExecuteReader
While (dr.read)
Console.writeline(dr.item(0))
loop
dr.Close()
cmd.Dispose()
End Sub
尽管我认为问题所有者只希望知道如何从DataReader中获取价值
因为许多专家确实提到了避免SQL注入的问题。
让我们用SQL参数编写一段代码,该参数是无SQL注入的
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim conn As OleDbConnection = New OleDbConnection
Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Dim dataFile = "C:\users\admin\Desktop\SAD.accdb"
conn.ConnectionString = provider & dataFile
conn.Open()
'Dim q = "SELECT CASE WHEN SUM(CASE WHEN Payment='Y' THEN OrderValue ELSE 0 END) > SUM(CASE WHEN Payment='N' THEN OrderValue ELSE 0 END) THEN 'good' ELSE 'bad' END type_of_client FROM Orders WHERE CustomerID = @customerid"
Dim q = "SELECT OrderValue FROM Orders WHERE CustomerID= @customerid"
Dim cmd As OleDbCommand = New OleDbCommand(q, conn)
cmd.Parameters.Add("@customerid", SqlDbType.VarChar, 50).Value = TextBox2.Text
Dim dr As OleDbDataReader = cmd.ExecuteReader
While (dr.read)
Console.writeline(dr.item(0))
loop
dr.Close()
cmd.Dispose()
End Sub
搜索一些如何使用OleDbDataReader或OleDbDataAdapter的示例。你不需要两者都用。我在C中使用过它们,但它们有很大的不同——VB.NET和C之间的参数化命令绝对100%相同;如果你在C中使用过它们:你基本上应该做你在那里做的事情;您当前的代码正在重新注入SQL。提示:考虑使用DAPPER或类似的方法,这将使您的数据访问代码更加简单和安全。ExecuteScalar要简单得多:它读取第一个网格第一行的第一列-可能正是您想要的。@MarcGravel在C中我习惯于在语句中编写诸如WHERE CustomerID=@givenValue之类的内容。然后我会像q.Parameters.AddWithValuegivenValue,TextBox1.Text一样。我猜这个逻辑可能是一样的,但是对于像我这样的新手来说,看到他们并排在一起让我很吃惊。我猜这个逻辑可能是一样的。这并不是说逻辑是一样的。这是因为代码是一样的。你几乎可以从C代码中删除分号,这样你就有了VB代码,留下了可怕的SQL注入hole@MarcGravell我知道SQL注入是一件非常危险的事情。幸运的是,现在我只是想了解基本知识,所以我不介意。我知道最好是从一开始就学习最好的方法,而不是以后混日子,但现在就必须这样。谢谢你的建议!这个答案中有很多问题没有解决。Sql注入是主要的方法,尽管MS Access不倾向于简单的方法,因为它不支持批处理语句,但我们也有未处理的一次性对象,连接字符串是硬编码的。无效的OLEDB数据适配器。当一个简单的ExecuteScalar足够时构建一个读卡器。因此,在我看来,给出关于OleDbDataReader的解决方案时,这个答案并不是一个好答案。