|
|
|
| создал хранимую процедуру для выборки Фамилии покупателя в зависимости от CustomerID
в базе Northwind
ALTER PROCEDURE sp_ContactName
@CustomerID nchar
AS
SELECT Customers.ContactName, Customers.CompanyName, Orders.CustomerID
FROM Customers INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID
WHERE (Orders.CustomerID = @CustomerID)
/* SET NOCOUNT ON */
RETURN
написал на форме код
комбобокса:
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Data.SqlClient.SqlConnectionStringBuilder
Public Class Form3
'загружаю данные в Combobox1
Public Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim strConn3 As New SqlConnectionStringBuilder()
Dim strSQL3 As String
'strConn3 = "Data Source=.\SQLExpress;Initial Catalog=Northwind;Integrated Security=True;"
strConn3.DataSource = ".\SQLExpress"
strConn3.InitialCatalog = "Northwind"
strConn3.IntegratedSecurity = True
Using cn3 As New SqlConnection(strConn3.ConnectionString)
cn3.Open()
strSQL3 = "SELECT DISTINCT CustomerID FROM Orders"
Dim da3 As New SqlDataAdapter(strSQL3, cn3)
Dim ds3 As New DataSet()
da3.Fill(ds3, "Orders")
With ds3
Me.ComboBox1.DataSource = .Tables("Orders")
Me.ComboBox1.DisplayMember = "CustomerID"
End With
End Using
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
' пытаюсь изменить значения в DATAGRIDVIEW1
Dim strConn4 As New SqlConnectionStringBuilder()
strConn4.DataSource = ".\SQLExpress"
strConn4.InitialCatalog = "Northwind"
strConn4.IntegratedSecurity = True
Using cn4 As New SqlConnection(strConn4.ConnectionString)
cn4.Open()
Dim cmd As New SqlCommand("sp_ContactName", cn4)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue(@CustomerID,SqlDbType.NChar)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
da.Fill(ds, "Customers")
DataGridView1.DataBindings.Add("", (ds), "Customers")
DataGridView1.DataMember = "Customers"
DataGridView1.DataSource = ds
cn4.Close()
End Using
End Sub
End Class
подскажите что упустил, где ошибка?
понимаю, что надо привязать данные к Datagridview, но как это правильно сделать не знаю | |
|
| |
|
|
|
|
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Data.SqlClient.SqlConnectionStringBuilder
Public Class Form3
'загружаю данные в Combobox1
Public Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim strConn3 As New SqlConnectionStringBuilder()
Dim strSQL3 As String
'strConn3 = "Data Source=.\SQLExpress;Initial Catalog=Northwind;Integrated Security=True;"
strConn3.DataSource = ".\SQLExpress"
strConn3.InitialCatalog = "Northwind"
strConn3.IntegratedSecurity = True
Using cn3 As New SqlConnection(strConn3.ConnectionString)
cn3.Open()
strSQL3 = "SELECT DISTINCT CustomerID FROM Orders"
Dim da3 As New SqlDataAdapter(strSQL3, cn3)
Dim ds3 As New DataSet()
da3.Fill(ds3, "Orders")
With ds3
Me.ComboBox1.DataSource = .Tables("Orders")
Me.ComboBox1.DisplayMember = "CustomerID"
Me.ComboBox1.ValueMember ="CustomerID"
End With
End Using
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
' пытаюсь изменить значения в DATAGRIDVIEW1
Dim strConn4 As New SqlConnectionStringBuilder()
strConn4.DataSource = ".\SQLExpress"
strConn4.InitialCatalog = "Northwind"
strConn4.IntegratedSecurity = True
Using cn4 As New SqlConnection(strConn4.ConnectionString)
cn4.Open()
Dim cmd As New SqlCommand("sp_ContactName", cn4)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue(@CustomerID,Me.Combobox1.SelectedValue)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
da.Fill(ds, "Customers")
DataGridView1.DataBindings.Add("", (ds), "Customers")
DataGridView1.DataMember = "Customers"
DataGridView1.DataSource = ds
cn4.Close()
End Using
End Sub
End Class
|
Заодно проверьте вернет ли вам хранимка запрашиваемый набор данных. Я уже говорил вам, а может и не вам (склероз уже), что если сравниваете с текстовыми значениями, то в запросах лучше использовать конструкцию LIKE. Это если так хочется сравнивать два текстовых значения.
А почему не хотите использовать для выбора из таблиц целочисленные значения идентификаторов? | |
|
| |
|
|
|
| Да, LIKE работает вполне корректно, но ошибка где -то внутри кода
может так?
Dim CustomerID As SqlParameter
CustomerID = New SqlClient.SqlParameter("@CustomerID", SqlDbType.NChar)
CustomerID.Value = ComboBox1.SelectedItem | |
|
| |
|
|
|
| Попробуйте так:
Using cn4 As New SqlConnection(strConn4.ConnectionString)
cn4.Open()
Dim cmd As New SqlCommand("sp_ContactName", cn4)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue(@CustomerID,Me.Combobox1.SelectedItem)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
da.Fill(ds, "Customers")
DataGridView1.DataBindings.Add("", (ds), "Customers")
DataGridView1.DataMember = "Customers"
DataGridView1.DataSource = ds
cn4.Close()
End Using
А вообще-то что за ошибка? Не передается параметр или компилятор выдает ошибку?
Возможно в VB есть какие-то особенности синтаксиса. Я сам уже плохо его помню.
В общем, давайте ошибку в студию - будем разбираться.
Хотя тот код, который я привел ,по идее , должен работать. | |
|
| |
|
|
|
| cmd.Parameters.AddWithValue(@CustomerID,Me.Combobox1.SelectedItem) пишет, что требуется выражение для @CustomerID
я ещё так делал:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim strConn4 As New SqlConnectionStringBuilder()
strConn4.DataSource = ".\SQLExpress"
strConn4.InitialCatalog = "Northwind"
strConn4.IntegratedSecurity = True
Using cn4 As New SqlConnection(strConn4.ConnectionString)
cn4.Open()
Dim CustomerID As SqlParameter
CustomerID = New SqlClient.SqlParameter("@CustomerID", SqlDbType.NChar)
CustomerID.Value = ComboBox1.SelectedValue
Dim cmd As New SqlCommand("sp_ContactName", cn4)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@CustomerID", SqlDbType.NChar)
cmd.Parameters("@CustomerID") = CustomerID
cmd.Parameters.AddWithValue("@CustomerID", Me.ComboBox1.SelectedValue)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
da.Fill(ds, "Customers")
DataGridView1.DataBindings.Add("", (ds), "CustomerID")
DataGridView1.DataMember = "Customers"
DataGridView1.DataSource = ds
cn4.Close()
End Using
End Sub
ошибка появляется около da.Fill(ds, "Customers") | |
|
| |
|
|
|
| Попробуйте так:
Dim SQLParam As SqlClient.SqlParameter
Dim dtMyTable As New DataTable("MyTable")
Using cn1 As New SqlConnection(strConn4.ConnectionString)
cn1.Open()
Dim da As New SqlDataAdapter("sp_ContactName", cn1)
da.SelectCommand.CommandType = CommandType.StoredProcedure
SQLParam = da.SelectCommand.Parameters.AddWithValue("@CustomerID", Me.ComboBox1.SelectedValue)
da.Fill(dtMyTable )
cn1.Close()
End Using
Dim vueMyView As DataView
vueMyView = New DataView
vueMyView .Table = dtMyTable
Me.DataGridView1.DataSource = vueMyView
|
| |
|
| |
|
|
|
| нет, не фурычит. Связи с этим вопрос: где-нибудь можно посмотреть рабочий пример. Дайте ссылку, если не жалко. В книгах сложно разобраться, отдельные отрывки кодов без реальных примеров не очень помогают. | |
|
| |
|
|
|
| Забыл дописать
Me.DataGridView1.DataBind()
У меня все фурычит. Причем и с объектом Command и с объектом DataTable и с объектом DataView
В связи с этим вопрос - какую именно ошибку выдает и где именно.
Перерд этим допишите к гриду DataBind() - этой командой вы привязываете грид к данным - читай заполняете грид.
Мои коды на VB, которые я писал ранее работают с моими базами SQL Server, поэтому прислать их не могу - коммерческо-конфиденциальная информация.
А то, что не является коммерческой информацией написано на C#, так, что толку от этих примеров будет мало.
Я в свое время изучал по книге Дэвида Сеппы "Программирование на ADO.NET 2.0" Там все подробно и досупно описано. | |
|
| |