2015-07-09 6 views
1

Я новичок в программировании, я попытался создать подраздел, содержащий в себе инструкцию SQL, используя параметризованный запрос. Мой код не работает, может быть что-то не хватает или я делаю это неправильно.Sql Statement Custom Class

Моя строка соединения в app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
     <add name = "DBCS" 
      connectionString ="Data Source=Mic-PC\Developer; Initial Catalog=Customer; User Id = sa; Password=1224334;" 
      providerName ="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 

создать класс под названием SELECTCLASS и вот содержание

Imports System.Configuration 
Imports System 
Imports System.Threading.Tasks 
Imports System.ComponentModel 
Imports System.Data 
Imports System.Drawing 
Imports System.Linq 
Imports System.Text 
Imports System.Windows.Forms 
Imports System.Data.SqlClient 

Public Class SelectClass 

Public Sub searchData(search As String, LastName As String, FirstName As String, MiddleInitial As String, Age As String, Address As String) 

    Dim CS As String = ConfigurationManager.ConnectionStrings("DBCS").ConnectionString 

    Using con As New SqlConnection(CS) 
     Dim cmd As SqlCommand = New SqlCommand("spGetCustomerByName", con) 
     cmd.CommandType = CommandType.Storedprocedure 
     cmd.Parameters.AddWithValue("@FirstName", "%" + search + "%") 
     con.Open() 

     Using rdr = cmd.ExecuteReader() 
      If rdr.HasRows Then 
       While rdr.Read() 
        LastName = rdr.GetString(1).ToString 
        FirstName = rdr.GetString(2).ToString 
        MiddleInitial = rdr.GetString(3).ToString 
        Age = rdr.GetString(4).ToString 
        Address = rdr.GetString(5).ToString 
       End While 
      End If 
     End Using 
    End Using 
End Sub 

End Class 

А вот код для моей формы Windows:

Imports System.Configuration 
Imports System 
Imports System.Threading.Tasks 
Imports System.ComponentModel 
Imports System.Data 
Imports System.Drawing 
Imports System.Linq 
Imports System.Text 
Imports System.Windows.Forms 
Imports System.Data.SqlClient 

Public Class SELECTVB 

Dim SelectData As New SelectClass 

Private Sub cmdSearch_Click(sender As Object, e As EventArgs) Handles cmdSearch.Click 
    SelectData.searchData(txtsearch.Text, TextBox1.Text.ToString, TextBox2.Text.ToString, TextBox3.Text.ToString, TextBox4.Text.ToString, TextBox5.Text.ToString) 
End Sub 

Любая помощь очень признательна, благодарю вас dvance!

+0

включают также хранимую процедуру. параметр, отправленный для инструкции LIKE shouln't, работает таким образом – HengChin

+0

Что вы подразумеваете под неработающим? Это исключение или просто отсутствие результатов? – dotNET

+0

Он не вернет никакой ценности –

ответ

0

Я думаю, что я вижу две проблемы с вашим кодом, ни один из которых не имеет ничего общего с ADO или SQL. Проблемы связаны с тем, как данные, которые считываются из базы данных, передаются обратно вызывающему методу. Я подозреваю, что метод searchData успешно считывает данные из результатов запроса (хотя вам нужно будет подтвердить это с помощью отладчика, установив точку останова, пройдя через этот метод и проверив значения переменных).

Первая проблема, которую я вижу, заключается в том, что вы передаете результат TextBox.Text.ToString, а не непосредственно свой объект TextBox.Text. Другими словами, вы должны вызвать метод searchData так:

Private Sub cmdSearch_Click(sender As Object, e As EventArgs) Handles cmdSearch.Click 
    SelectData.searchData(txtsearch.Text, TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text) 
End Sub 

Во-вторых, вы пытаетесь передать ссылку из этих Text аргументов внутри метода searchData, но параметры не объявлены ByRef. Если вы хотите сделать это таким образом, вам нужно будет изменить параметры метода ByRef, как это:

Public Sub searchData(search As String, ByRef LastName As String, ByRef FirstName As String, ByRef MiddleInitial As String, ByRef Age As String, ByRef Address As String) 

Однако, все это не было бы проблемой, если вы возвратили результаты через возвращение функция в вместо изменения значений параметров. Большинство разработчиков, включая меня, не рекомендуют использовать параметры ByRef таким образом, что это неожиданное поведение. Обычно параметры должны быть зарезервированы для входов, а не для выходов. Например, если вы создали класс вроде этого:

Public Class Customer 
    Public Property LastName As String 
    Public Property FirstName As String 
    Public Property MiddleInitial As String 
    Public Property Age As String 
    Public Property Address As String 
End Class 

Тогда вы могли бы изменить свой метод поиска, чтобы вернуть Customer объект, например:

Public Function SearchData(search As String) As Customer 
    Dim result As Customer = Nothing 
    Dim CS As String = ConfigurationManager.ConnectionStrings("DBCS").ConnectionString 
    Using con As New SqlConnection(CS) 
     Using cmd As SqlCommand = New SqlCommand("spGetCustomerByName", con) 
      cmd.CommandType = CommandType.Storedprocedure 
      cmd.Parameters.AddWithValue("@FirstName", "%" & search & "%") 
      con.Open() 
      Using rdr = cmd.ExecuteReader() 
       If rdr.HasRows Then 
        If rdr.Read() Then 
         result = New Customer() 
         result.LastName = rdr.GetString(1) 
         result.FirstName = rdr.GetString(2) 
         result.MiddleInitial = rdr.GetString(3) 
         result.Age = rdr.GetString(4) 
         result.Address = rdr.GetString(5) 
        End If 
       End If 
      End Using 
     End Using 
    End Using 
    Return result 
End Sub 

И тогда вы могли бы назвать это так:

Private Sub cmdSearch_Click(sender As Object, e As EventArgs) Handles cmdSearch.Click 
    Dim c As Customer = SelectData.searchData(txtsearch.Text) 
    If c IsNot Nothing Then 
     TextBox1.Text = c.LastName 
     TextBox2.Text = c.FirstName 
     TextBox3.Text = c.MiddleInitial 
     TextBox4.Text = c.Age 
     TextBox5.Text = c.Address 
    End If 
End Sub 

Однако, учитывая контекст того, что вы делаете, вполне вероятно, что ваш метод должен возвращаться список клиентов, а не только один.

Если эти изменения по-прежнему не устраняют проблему, то при попытке выполнить поиск с помощью отладчика ваш лучший шанс решить проблему. Может быть, хранимая процедура не возвращает совпадений или возвращает другое количество столбцов, чем вы ожидаете, или может возвращать столбец с типом данных, отличным от строки (например, столбец возраста может быть целым числом , например).Невозможно сказать, учитывая только предоставленную вами информацию, какова будет точная проблема с кодом доступа к данным.