1

グループ、非常に簡単な説明と答えかもしれないことを許してください。しかし、私は自分自身にVisual Basicを教えており、これはまったく新しいものです。つまり、私はVisual Studio2010Expressを使用しています。

顧客レコードテーブルを含むデータベースを作成しました。私が取り組んでいる注文入力モジュールを介して、ユーザーが顧客のアカウント番号を入力できるようにしたいです。ただし、残りのプログラムルーチンに進む前に、このエントリを検証する必要があります。データベースへの接続方法は知っていると思いますが、顧客番号を検証するために、テーブルと比較してユーザーに番号を入力させる方法がわかりません。これが私が書いたものです:

            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を取得するために必要なコマンドコードは何ですか?このデータは2つの文字列になり(データを受信するにはこれらを「暗くする」必要がありますか?)、フォームのチェックボックスとテキストボックスに入れることができると想定しています。

よくわからなくてごめんなさい。これで頭の中の電球がついに点灯することを願っています!!

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 WHEREcostumerNo = txbCosumerNo.Text次に、DataSetを使用してデータベースから取得したデータを保存できます...(コードに従って)

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

...データからDataTableを取得できます。(DataSetはDataTableのコレクションです)、操作が簡単な場合があります。

于 2013-03-15T19:50:54.807 に答える