Попытка перечислить данные в MS SQL с помощью vb.net - PullRequest
1 голос
/ 11 марта 2010

Ниже приведен код, который я использую в мс доступа для вывода списка данных в соответствии с тем, что выбрано в поле со списком и что вводится в текстовом поле.

Моя проблема заключается в том, что в MS SQL нет командного построителя, как в MS Access, потому что он терпит неудачу, когда я пытаюсь:

dim mscombuilder as new sqlcommandbuilder

Вот код:

''#list school
If ComboBox1.SelectedItem = "School" Then
    Dim connectionString As String = "Data Source=SENBONZAKURA\SQLEXPRESS;Initial Catalog=testing;User ID=SenbonZakura\Rew; Trusted_Connection=True;"

    Dim selectCommand As String
    Dim sqlcon As New SqlConnection(connectionString)

    selectCommand = "select * from student WHERE (SCHOOL='" & TextBox1.Text & "')"

    Me.dataAdapter = New OleDbDataAdapter(selectCommand, connection)
    Dim commandBuilder As New OleDbCommandBuilder(Me.dataAdapter)

    Dim table As New DataTable()   
    table.Locale = System.Globalization.CultureInfo.InvariantCulture

    Me.dataAdapter.Fill(table)  
    Me.BindingSource1.DataSource = table

    Dim data As New DataSet()  
    data.Locale = System.Globalization.CultureInfo.InvariantCulture

    DataGridView1.DataSource = Me.BindingSource1   
    Me.DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.White

    Me.DataGridView1.AutoResizeColumns( _
           DataGridViewAutoSizeColumnsMode.AllCells)

- В опциях, которые появятся, нет такой вещи, как командный строитель. Знаете ли вы какие-либо альтернативы командного построителя в MS SQL?

1 Ответ

2 голосов
/ 11 марта 2010

Я не хочу вас так унизить, но здесь так много всего плохого:

  • Вы не можете смешивать классы system.data.sqlclient и классы system.data.oledb! Выберите одного поставщика или другого, а не обоих.
  • SCHOOL='" & TextBox1.Text & "')" НИКОГДА подставить пользовательский ввод прямо в запрос! Это большая дыра в безопасности. Что если я введу ';DROP TABLE Student;-- в ваш TextBox1?
  • Вы не правильно проверяете, что ваше соединение будет закрыто. Если возникнет исключение или произойдет что-то еще непредвиденное, оно останется открытым, что в конечном итоге приведет к засорению базы данных.
  • Не устанавливайте привязку своего источника данных к сетке, пока после не установите стили для сетки. В противном случае вы можете закончить рисовать свою сетку дважды.
  • Не кодируйте строку подключения в локальной переменной. На минимум разложить его в общий слой данных где-то.

Вы хотите что-то похожее на это:

''#list schools
If ComboBox1.SelectedItem = "School" Then

    Me.DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.White
    Me.DataGridView1.AutoResizeColumns( _
         DataGridViewAutoSizeColumnsMode.AllCells)

    Using cn As New SqlConnection(LoadConnectionStringFromConfigFile()), _
          cmd As New SqlCommand("SELECT * FROM Student WHERE School= @School")

        cn.Open()
        cmd.Parameters.AddWithValue("@School", TextBox1.Text)

        DataGridView1.DataSource = cmd.ExecuteReader()

        DataGridView1.DataBind() ''#ASP.Net only - don't do this line in winforms
    End Using

И если вы действительно хотите сделать это правильно, вы выделите весь код, который обращается к базе данных, в совершенно отдельный класс, и тогда ваш код привязки данных станет еще проще:

''#list schools
If ComboBox1.SelectedItem = "School" Then

    Me.DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.White
    Me.DataGridView1.AutoResizeColumns( _
         DataGridViewAutoSizeColumnsMode.AllCells)

    DataGridView1.DataSource = MyDataClassVar.GetStudentsInSchool(TextBox1.Text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...