Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用给定值搜索数据库_.net_Vb.net - Fatal编程技术网

.net 使用给定值搜索数据库

.net 使用给定值搜索数据库,.net,vb.net,.net,Vb.net,好了,伙计们,这对我来说是个棘手的问题。我有一个数据库,在那里我有特定的客户和他们的订单数量。我正在编写一个脚本,同时也在使用DataOleDb,以便访问这个Orders数据库,这只是我创建的一个简单的access数据库。基本上,我希望用户在文本框中插入一个ID,然后按下一个按钮。之后,该按钮将搜索具有所述ID的客户,并向用户显示该客户订单的价值 Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4

好了,伙计们,这对我来说是个棘手的问题。我有一个数据库,在那里我有特定的客户和他们的订单数量。我正在编写一个脚本,同时也在使用DataOleDb,以便访问这个Orders数据库,这只是我创建的一个简单的access数据库。基本上,我希望用户在文本框中插入一个ID,然后按下一个按钮。之后,该按钮将搜索具有所述ID的客户,并向用户显示该客户订单的价值

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的解决方案时,这个答案并不是一个好答案。