I get this FieldCount error when I attempt to bind a datagrid with a
dataset, not a datareader object.
The code snippet is as belows:
'PopulateForm called in Page Load event
Private Sub PopulateForm(By Val MyOrderDetails As MyChannel.Order Details)
Me.lblOrderID.T ext = CStr(MyOrderDet ails.OrderID)
Dim customer As MyChannel.Custo mersDB = New MyChannel.Custo mersDB()
Dim DR As SqlClient.SqlDa taReader =
customer.GetCus tomerList(CInt( Me.Page.User.Id entity.Name))
Me.DDLCustomer. DataSource = DR
Me.DDLCustomer. DataValueField = "CustomerID "
Me.DDLCustomer. DataTextField = "FullName"
Me.DDLCustomer. DataBind()
DR.Close()
Me.DDLCustomer. SelectedIndex = GetDDLItemIndex ByValue(Me.DDLC ustomer,
CStr(MyOrderDet ails.CustomerID ))
Me.lblOrderDate .Text = Format(MyOrderD etails.OrderDat e, "d")
Me.tbCustomerPO .Text = MyOrderDetails. CustomerPO
Me.tbDelAddLine 1.Text = MyOrderDetails. DelAddLine1
Me.tbDelAddLine 2.Text = MyOrderDetails. DelAddLine2
Me.tbDelAddLine 3.Text = MyOrderDetails. DelAddLine3
Me.tbDelAddLine 4.Text = MyOrderDetails. DelAddLine4
Me.tbShipDate.T ext = Format(MyOrderD etails.ShipDate , "d")
Me.tbShipVia.Te xt = MyOrderDetails. ShipVia
Me.tbComments.T ext = MyOrderDetails. Comment
Me.tbFreight.Te xt = Format(MyOrderD etails.Freight, "###0.00")
Dim Tax As MyChannel.Tax = New MyChannel.Tax()
DR = Tax.GetTaxType
Me.DDLFreightTa xType.DataSourc e = DR
Me.DDLFreightTa xType.DataValue Field = "taxtype"
Me.DDLFreightTa xType.DataTextF ield = "taxcode"
Me.DDLFreightTa xType.DataBind( )
DR.Close()
Me.DDLFreightTa xType.SelectedI ndex =
GetDDLItemIndex ByValue(Me.DDLF reightTaxType,
CStr(MyOrderDet ails.FreightTax Type))
Me.lblExTaxTota l.Text = Format(MyOrderD etails.OrderTot alExTax, "###0.00")
Me.lblTotal.Tex t = Format(MyOrderD etails.OrderTot al, "###0.00")
Me.lblTax.Text = Format(MyOrderD etails.OrderTot al -
MyOrderDetails. OrderTotalExTax , "###0.00")
Me.dgOrderDetai ls.DataSource = MyOrderDetails. OrderItems.Tabl es(0)
Me.dgOrderDetai ls.DataBind()
End Sub
'MyOrderDetails class is populated as follows:
Public Function GetOrderDetails (ByVal orderID As Integer) As OrderDetails
' Create Instance of Connection and Command Object
Dim myConnection As New
SqlConnection(C onfigurationSet tings.AppSettin gs("ConnectionS tring"))
Dim myCommand As New SqlDataAdapter( "OrdersDeta il", myConnection)
' Mark the Command as a SPROC
myCommand.Selec tCommand.Comman dType = CommandType.Sto redProcedure
' Add Parameters to SPROC
Dim parameterOrderI D As New SqlParameter("@ OrderID", SqlDbType.Int, 4)
parameterOrderI D.Value = orderID
parameterOrderI D.Direction = ParameterDirect ion.InputOutput
myCommand.Selec tCommand.Parame ters.Add(parame terOrderID)
Dim parameterCustom erID As New SqlParameter("@ CustomerID", SqlDbType.Int, 4)
parameterCustom erID.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terCustomerID)
Dim parameterOrderD ate As New SqlParameter("@ OrderDate", SqlDbType.DateT ime,
8)
parameterOrderD ate.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terOrderDate)
Dim parameterShipDa te As New SqlParameter("@ ShipDate", SqlDbType.DateT ime,
8)
parameterShipDa te.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terShipDate)
Dim parameterOrderT otal As New SqlParameter("@ OrderTotal", SqlDbType.Money ,
8)
parameterOrderT otal.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terOrderTotal)
Dim parameterOrderT otalExTax As New SqlParameter("@ OrderTotalExTax ",
SqlDbType.Money , 8)
parameterOrderT otalExTax.Direc tion = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terOrderTotalEx Tax)
Dim parameterDelAdd Line1 As New SqlParameter("@ deladdline1",
SqlDbType.NVarC har, 50)
parameterDelAdd Line1.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terDelAddLine1)
Dim parameterDelAdd Line2 As New SqlParameter("@ deladdline2",
SqlDbType.NVarC har, 50)
parameterDelAdd Line2.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terDelAddLine2)
Dim parameterDelAdd Line3 As New SqlParameter("@ deladdline3",
SqlDbType.NVarC har, 50)
parameterDelAdd Line3.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terDelAddLine3)
Dim parameterDelAdd Line4 As New SqlParameter("@ deladdline4",
SqlDbType.NVarC har, 50)
parameterDelAdd Line4.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terDelAddLine4)
Dim parameterInvoic eNo As New SqlParameter("@ invoiceno", SqlDbType.NVarC har,
8)
parameterInvoic eNo.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terInvoiceNo)
Dim parameterCustom erPO As New SqlParameter("@ customerpo",
SqlDbType.NVarC har, 20)
parameterCustom erPO.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terCustomerPO)
Dim parameterShipVi a As New SqlParameter("@ shipvia", SqlDbType.NVarC har, 20)
parameterShipVi a.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terShipVia)
Dim parameterCommen t As New SqlParameter("@ comment", SqlDbType.NVarC har,
255)
parameterCommen t.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terComment)
Dim parameterFreigh t As New SqlParameter("@ freight", SqlDbType.Money , 8)
parameterFreigh t.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terFreight)
Dim parameterTaxTyp eOnFreight As New SqlParameter("@ taxtypeonfreigh t",
SqlDbType.Int, 4)
parameterTaxTyp eOnFreight.Dire ction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terTaxTypeOnFre ight)
Dim parameterOrderS tatus As New SqlParameter("@ Orderstatus", SqlDbType.Int,
4)
parameterOrderS tatus.Direction = ParameterDirect ion.Output
myCommand.Selec tCommand.Parame ters.Add(parame terOrderStatus)
' Create and Fill the DataSet
Dim myDataSet As New DataSet()
myCommand.Fill( myDataSet, "OrderDetai ls")
' ship date is null if order doesn't exist, or belongs to a different user
If Not parameterShipDa te.Value Is DBNull.Value Then
' Create and Populate OrderDetails Struct using
' Output Params from the SPROC, as well as the
' populated dataset from the SqlDataAdapter
Dim myOrderDetails As New OrderDetails()
myOrderDetails. OrderDate = CType(parameter OrderDate.Value , DateTime)
myOrderDetails. ShipDate = CType(parameter ShipDate.Value, DateTime)
myOrderDetails. OrderTotal = CDec(parameterO rderTotal.Value )
myOrderDetails. OrderItems = myDataSet
myOrderDetails. OrderID = orderID
myOrderDetails. CustomerID = CInt(parameterC ustomerID.Value )
myOrderDetails. DelAddLine1 = CStr(parameterD elAddLine1.Valu e)
myOrderDetails. DelAddLine2 = CStr(parameterD elAddLine2.Valu e)
myOrderDetails. DelAddLine3 = CStr(parameterD elAddLine3.Valu e)
myOrderDetails. DelAddLine4 = CStr(parameterD elAddLine4.Valu e)
myOrderDetails. InvoiceNo = CStr(parameterI nvoiceNo.Value)
myOrderDetails. CustomerPO = CStr(parameterC ustomerPO.Value )
myOrderDetails. ShipVia = CStr(parameterS hipVia.Value)
myOrderDetails. Comment = CStr(parameterC omment.Value)
myOrderDetails. Freight = CDec(parameterF reight.Value)
myOrderDetails. FreightTaxType = CInt(parameterT axTypeOnFreight .Value)
myOrderDetails. OrderStatus = CInt(parameterO rderStatus.Valu e)
myOrderDetails. OrderTotalExTax = CDec(parameterO rderTotalExTax. Value)
' Return the DataSet
Return myOrderDetails
Else
Return Nothing
End If
End Function
'The OrdersDetails class is defined as follows:
Public Class OrderDetails
Public OrderDate As DateTime
Public ShipDate As DateTime
Public OrderTotal As Decimal
Public OrderItems As DataSet
Public OrderID As Integer
Public CustomerID As Integer
Public DelAddLine1 As String
Public DelAddLine2 As String
Public DelAddLine3 As String
Public DelAddLine4 As String
Public InvoiceNo As String
Public CustomerPO As String
Public ShipVia As String
Public Comment As String
Public Freight As Decimal
Public FreightTaxType As Integer
Public OrderStatus As Integer
Public OrderTotalExTax As Decimal
End Class
'the stored proc OrdersDetails is shown below for the sake completeness
CREATE Procedure OrdersDetail
(
@OrderID int output,
@CustomerID int output,
@OrderDate datetime OUTPUT,
@ShipDate datetime OUTPUT,
@OrderTotal money OUTPUT,
@OrderTotalExTa x money output,
@deladdline1 nvarchar(50) output,
@deladdline2 nvarchar(50) output,
@DelAddLine3 nvarchar(50) output,
@DelAddLine4 nvarchar(50) output,
@invoiceno nvarchar(8) output,
@customerpo nvarchar(20) output,
@shipvia nvarchar(20) output,
@comment nvarchar(255) output,
@freight money output,
@taxtypeonfreig ht int output,
@orderstatus int output
)
AS
/* Return the order dates from the Orders
Also verifies the order exists for this customer. */
SELECT
@CustomerID = CustomerID,
@OrderDate = OrderDate,
@ShipDate = ShipDate,
@deladdline1=de laddline1,
@deladdline2=de laddline2,
@deladdline3=de laddline3,
@deladdline4=de laddline4,
@invoiceno=invo iceno,
@customerpo=cus tomerpo,
@shipvia=shipvi a,
@comment=commen t,
@freight=freigh t,
@taxtypeonfreig ht=taxtypeonfre ight,
@orderstatus=or derstatus
FROM
Orders
WHERE
OrderID = @OrderID
IF @@Rowcount = 1
BEGIN
/* First, return the OrderTotal out param */
select
@ordertotal=con vert(money,isnu ll((
select
sum(b.quantity* b.unitcost*(1+c .taxrate))
from
orderdetails b inner join tax c on
b.linetaxtype=c .taxtype
where
b.orderid=a.ord erid
),0)+a.freight* (1+d.taxrate)),
@ordertotalexta x=convert(money ,isnull((
select
sum(b.quantity* b.unitcost)
from
orderdetails b inner join tax c on
b.linetaxtype=c .taxtype
where
b.orderid=a.ord erid
),0)+a.freight)
from
orders a inner join tax d on
a.taxtypeonfrei ght=d.taxtype
where
a.orderid=@orde rid and
a.customerid=@c ustomerid
/* Then, return the recordset of info */
SELECT
OrderDetails.Or derLineID,
Products.Produc tID,
Products.ModelN umber,
OrderDetails.Li neDescription,
OrderDetails.Un itCost,
OrderDetails.Qu antity,
(OrderDetails.Q uantity * OrderDetails.Un itCost) as ExtendedAmount,
LineTaxType
FROM
OrderDetails
INNER JOIN Products ON OrderDetails.Pr oductID = Products.Produc tID
WHERE
OrderID = @OrderID
END
else
-- if @orderid doesn't exist then set @orderid to 0 to signal it
set @orderid=0
GO
As the code above shows, there is no reference to a datareader object at
all. Any idea what is going on?