2010-03-10 16 views
1

下面是我在ms访问中使用的代码,根据在combobox中选择的内容以及文本框中的输入内容列出数据。尝试使用vb.net在ms sql中列出数据

我的问题是有在MS SQL没有像CommandBuilder的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) 

-there没有这样的事作为将出现的选项中的命令生成器。你知道MS SQL中的任何命令生成器的替代?

+0

如果你对它们进行格式化,特别是对它们进行正确标记,你会对你的问题更加关注。 – 2010-03-10 23:09:55

+0

另请参见:winforms或webforms? – 2010-03-10 23:14:09

+0

这是一个winform – user225269 2010-03-10 23:26:12

回答

2

我不想把你放下这个样子,但错在这里刚好有这么多的事情:

  • 不能混淆了System.Data.SqlClient类和system.data.oledb类!选择一个提供者或其他提供者,而不是两个。
  • SCHOOL='" & TextBox1.Text & "')"从不直接替换用户输入到这样的查询!这是一个重大的安全漏洞。如果我在您的TextBox1中输入';DROP TABLE Student;--会怎样?
  • 您无法正确检查您的连接是否会关闭。如果抛出异常或其他未预料的事情发生,它将保持打开状态,最终导致数据库窒息。
  • 不要将您的数据源绑定到您的网格,直到您为网格设置样式。否则,你最终可能会画两次网格。
  • 请勿在本地变量中对连接字符串进行硬编码。在至少将它分解到某个公共数据层。

你想要更多的东西是这样的:

''#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) 
+0

拜托,我问在sql中oledbcommandbuilder相当于什么? – user225269 2010-03-11 00:08:59

+0

我不是在开玩笑安全漏洞。这是你的代码中的一个主要问题,而不是你可以忽略的东西。直到我看到您首先要解决的证据时,没有任何commandbuilder帮助我。 – 2010-03-11 02:11:03

相关问题