2013-03-15 21 views
1

群,请原谅我可能是一个非常简单的解释和答案。然而,我自学自学Visual Basic,而且完全是新的。所以你知道,我正在使用Visual Studio 2010 Express。vb.net搜索sql数据库来验证客户帐号

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

  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)?我假设这些数据会分成两个字符串(我是否需要将这些数据“调暗”以接收数据?),以便它可以放在窗体上的复选框()和文本框(es)中。

对不起,我不明白这一点。我希望通过这个灯泡在我脑海中终于会来!

+0

'SELECT * FROM AR_CUSTOMERS WHERE客户id =“12345''。如果你需要做的只是检查'CustomerID'是否有效,'SELECT *'是浪费的(并且是惹恼你的DBA的好方法),你可以在SQL和ADO.Net – codingbiz 2013-03-15 20:42:35

+0

@codingbiz上阅读更多。 'SELECT COUNT(1)FROM AR_CUSTOMERS WHERE CustomerID ='12345''会更好。 – alroc 2013-03-15 20:48:05

+0

好点。但是这可能会让OP感到困惑。只是建立在问题中的现有查询。 – codingbiz 2013-03-15 20:58:13

回答

0

最简单的方法应该是编写sql查询已经按照客户编号进行筛选... SELECT * FROM AR_CUSTOMERS WHERE costumerNo = txbCosumerNo.Text,然后可以使用DataSet存储从DataBase检索的数据...(以下代码..)

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

...你可以从数据的DataTable。(DataSet是数据表的集合),可以很容易的工作。

4

如果你只是有兴趣了解,如果客户存在或不是在数据库中,你可以写代码,如SqlCommand对象的这个

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 

ExecuteScalar方法,如果您有兴趣了解可以使用只有一行结果单一,在这种情况下通常非常快。

除此之外,我很困惑你的连接字符串。它似乎不是一个有效的。
在这里你可以找到的ConnectionStrings有效的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进行搜索会返回多个行,会怎么样?在这种情况下,您的文本框将填充最新发现的客户的值。
也许是更好地使用数据表中,如果有一个以上的客户要求用户从可用的选择

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 
+0

让我试着更好地解释我在做什么这样:FORM文本框包含客户名称的一部分(它可能是一个姓氏)。因此%通配符。假设用户在“威廉姆斯”中键入该文本框。我现在希望代码去搜索AR_Customer表并查看Customer Name列并找到“Williams”。当它发现它时,我需要将完整的客户名称与需要移入复选框(称为“cbxCustNo”)的客户帐号一起移入文本框(称为“txbCustName”)。我希望这有帮助。 – 2013-03-16 03:44:17

+0

我会通读您的链接。希望我会在那里找到一些有用的东西。我不确定'ExecuteScalar'的含义或做法。使用数据库对我来说比Visual Basic更为陌生。我也是一个新手。 – 2013-03-16 03:45:50

+0

这个变化很大,我对你原来的问题的假设。我会尽力在稍后更新我的答案。 (你需要一个SqlDataReader或一个SqlDataAdapter与您的SqlCommand字符串的修改版本) – Steve 2013-03-16 07:57:54