1

组,请原谅我可能是一个非常简单的解释和答案。但是,我正在自学 Visual Basic,并且对此完全陌生。所以你知道,我使用的是 Visual Studio 2010 Express。

我创建了一个包含客户记录表的数据库。通过我正在处理的订单输入模块,我想允许用户输入客户帐号。但是,在继续执行其余程序例程之前,我需要验证此条目。我想我知道如何连接到数据库,但我不确定如何让用户输入的数字与表格进行比较以验证客户编号。这是我写的:

            Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection
            Dim dbSource As String = "Data Source = DataDesign.mdf"
            Dim dbProvider As String = "PROVIDER=SQL Server 10.0.5500;"
            Dim ds As New DataSet
            Dim sql As String = "SELECT * FROM AR_CUSTOMERS"
            Dim da As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(sql, conn)
            conn.ConnectionString = dbProvider & dbSource 
            Dim search1 As Integer = Integer.Parse(txbCustomerNo.Text)
            Dim cmd1 As SqlCommand = New SqlCommand
            conn.Open()

我现在卡住了。我已经定义了我的“搜索”(search1),但是我现在如何告诉程序查看表格以查看是否有匹配的客户编号?

我不想请你帮我写代码。但是我在这里一无所知,我无法找到一个很好的例子来帮助我理解这个过程并自己编写代码。

如果您发现任何语法错误,请不要犹豫,大声说出来!!


根据您的一些答案和进一步的研究,我修改了我的代码。现在是这样写的:

  Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection
  Dim dbSource As String = "Data Source=.;AttachDbFilename=C:\Users\Don\Documents\DataDesign.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
  Dim dbProvider As String = "PROVIDER=System.Data.SqlClient;"
  Dim ds As New DataSet
  Dim sql As String = "SELECT FROM AR_CUSTOMER"
  Dim da As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(sql, conn)
  conn.ConnectionString = dbProvider & dbSource
  Dim search1 As String = "%" & txbCustName & "%"
  Dim sqlQ1 As String = sql & " WHERE ARC-CUSTOMER-NAME LIKE search1"
  Dim cmd1 As New SqlCommand(sqlQ1, conn)
  conn.Open()

希望这种语法(搜索)看起来更好、更准确。如果不是,请帮我改正。

假设这是正确的,我需要什么命令代码来获取完整的 ARC-CUSTOMER-NAME(并且可能有多个发现)以及相应的 ARC-CUSTOMER-NUMBER(s)?我假设这些数据将进入两个字符串(我需要“暗淡”这些以接收数据吗?),以便可以将其放入表单上的复选框和文本框。

对不起,我没有更好地理解这一点。我希望通过这个,我脑子里的灯泡终于亮了!!

4

2 回答 2

4

如果您只是想知道客户是否存在于数据库中,您可以编写这样的代码

Using conn = new SqlConnection(connectionString)
    conn.Open()
    Dim cmd1 = new SqlCommand("SELECT COUNT(*) FROM AR_CUSTOMERS WHERE customerNo = @custNo")
    cmd1.Parameters.AddWithValue("@custNo", Convert.ToInt32(txbCustomerNo.Text))
    Dim result = cmd1.ExecuteScalar()
    if Convert.ToInt32(result) > 0 then
        MessageBox.Show("Customer Found")
    End If
End Using

SqlCommand 对象的ExecuteScalar方法可以用于如果您有兴趣只查找具有单个结果的单行并且在这种情况下通常非常快。

除此之外,我对您的连接字符串感到非常困惑。它似乎不是一个有效的。
在这里您可以找到大量适用于 Sql Server 的连接字符串示例:http: //www.connectionstrings.com/sql-server-2012

编辑 根据您的评论,现在很清楚简单的 ExecuteScalar 是不够的。我们应该使用 SqlDataReader 并使用 ExecuteReader。当然查询完全不同

Using conn = new SqlConnection(connectionString)
    conn.Open()
    Dim cmd1 = new SqlCommand("SELECT CustomerNo, CustomerName FROM AR_CUSTOMERS " + 
                              "WHERE customerName LIKE= @custName")
    cmd1.Parameters.AddWithValue("@custName", "%" + txtSearchText.Text.Trim() + "%")

    Dim reader As SqlDataReader = cmd1.ExecuteReader()
    If Not reader.HasRows Then
        txbCustName.Text = "No customer found!"
    Else
        While reader.Read()
           txbCustName.Text = reader(0).ToString
           cbxCustNo.Text = reader(1).ToString
        Loop
    End If
End Using

然而,这种方法有其问题。如果使用 LIKE 的搜索返回多行怎么办?在这种情况下,您的文本框将填充最新找到的客户的值。
也许使用 DataTable 会更好,如果有多个客户,请让用户从可用的数据表中进行选择

Using conn = new SqlConnection(connectionString)
    conn.Open()
    Dim cmd1 = new SqlCommand("SELECT CustomerNo, CustomerName FROM AR_CUSTOMERS " + 
                              "WHERE customerName LIKE= @custName")
    cmd1.Parameters.AddWithValue("@custName", "%" + txtSearchText.Text.Trim() + "%")

    Dim adapter As SqlDataAdapter = new SqlDataAdapter(cmd1)
    Dim table As DataTable = new DataTable()
    adapter.Fill(table)
    If table.Rows.Count = 0 Then
        txbCustName.Text = "No customer found!"
    Else if table.Rows.Count = 1 Then
        Dim row as DataRow = table.Rows(0)
        txbCustName.Text = row("CustomerName").ToString
        cbxCustNo.Text = row("CustomerNo").ToString
    Else
        MessageBox.Show("More  than one customer found!")
        ..... code to show the table in a datagridview .... 
    End If
End Using
于 2013-03-15T20:40:51.313 回答
0

最简单的方法应该是编写已经按客户编号过滤的 sql 查询... SELECT * FROM AR_CUSTOMERS WHERE costerNo = txbCosumerNo.Text,然后您可以使用 DataSet 存储从数据库检索到的数据...(按照您的代码..)

DataSet data = new DataSet();
da.fill(data);

...您可以从数据中获取DataTable ..(DataSet 是DataTables 的集合),可以很容易使用。

于 2013-03-15T19:50:54.807 回答