使用存储过程(具有连接)通过WCF服务c#

时间:2016-10-18 13:04:45

标签: c# wcf stored-procedures data-binding datagridview

我正在调用WCF服务,该服务为我提供了BAL中具有指定字段值的客户列表。

当我初始化它以在DataGridView中显示数据时,Customer表格中显示的所有具有相应数据类型值的内容(例如FirstNameLastName和{ {1}})。

但是,我想在存储过程中使用Phone1Country表中检索的值不希望在inner join表中显示相应的值。

错误是CustomerCountryId表中是DBNull,如何针对此特定示例解决此问题。

这是我的绑定数据代码(适用于某些字段):

Customer

这是我在BAL中的方法:

IHotRes res = new MHotServiceProvider().Service;
List<CustomerListItem> customerlist = res.GetCustomerListItem();
_ListData = ToDataTable(customerlist);

这是我的存储过程:

public List<CustomerListItem> GetCustomerListItem()
{
    List<CustomerListItem> customerlist = null;
    CustomerListItem item = null;
    using (CustomerTableAdapter adp = new CustomerTableAdapter())
    {
        using (DAL.dstCustomer.CustomerDataTable tbl = adp.GetCustomerDataList())
        {
            customerlist = new List<CustomerListItem>();
            foreach (var row in tbl)
            {
                item = new CustomerListItem();
                item.FirstName = row.FirstName;
                item.LastName = row.LastName;
                item.Phone1 = row.Phone1;
                string mystring = row.CountryId.ToString(); //i tried to convert it to string but it still gives me the error that 'The value for column 'CountryId' in table 'Customer' is DBNull.'
                item.CountryId = mystring;
                //item.NationalityId = row.NationalityId;
                customerlist.Add(item);
            }
        }
    }
    return customerlist;
}

Executing stored procedure dstCustomer

如果需要更多代码示例,请告知我们。

2 个答案:

答案 0 :(得分:2)

将CountryId添加到存储过程:

CREATE PROCEDURE [dbo].[sp_CustomerDataList] 
AS
BEGIN
    SET NOCOUNT ON;
SELECT cu.FirstName, cu.LastName, cu.Phone1, co.CountryId, co.CountryName, n.Nationality 
FROM Customer cu
Left Join Country co
ON cu.CountryId = co.CountryId
Left Join Nationality n
ON cu.NationalityId = n.NationalityId
WHERE cu.IsDeleted = 0
END

然后将CountryName添加到模型中:

public class CustomerListItem
{
    string CountryName = string.Empty;
...
}

答案 1 :(得分:1)

这太难看了,无法发表评论。这是:

因此,您将国家/地区名称添加到dataModel中:

public class CustomerListItem
{
    string CountryName = string.Empty;
...
}

这很好,但我们还没有完成。我们现在必须实际填充新属性,并附加一行代码(注释中添加了重点)。

public List<CustomerListItem> GetCustomerListItem()
{
    List<CustomerListItem> customerlist = null;
    CustomerListItem item = null;
    using (CustomerTableAdapter adp = new CustomerTableAdapter())
    {
        using (DAL.dstCustomer.CustomerDataTable tbl = adp.GetCustomerDataList())
        {
            customerlist = new List<CustomerListItem>();
            foreach (var row in tbl)
            {
                item = new CustomerListItem();
                item.FirstName = row.FirstName;
                item.LastName = row.LastName;
                item.Phone1 = row.Phone1;
                string mystring = row.CountryId.ToString(); //i tried to convert it to string but it still gives me the error that 'The value for column 'CountryId' in table 'Customer' is DBNull.'
                item.CountryId = mystring;
                //item.NationalityId = row.NationalityId;

                //Here's the new line, where we actually populate our new model property
                item.CountryName  = row.CountryName;
                customerlist.Add(item);
            }
        }
    }
    return customerlist;
}

您现在必须更新TableAdapter以包含从sproc返回的新值。

最简单的方法是进入Designer(从中获取屏幕截图),右键单击网格的顶部,然后单击“配置”。您应该能够从那里走向向导,让设计人员更新DataTable并包含新字段。如果成功,您应该在网格的顶部看到新字段(您可能必须手动编辑向导中的select语句以包含它,它只取决于它最初的设置方式)。

同样,根据初始设置,您可能还必须右键单击设计器底部的GetCustomerDataList(),然后单击configure以浏览该附加向导以获取该方法以包含新字段来自sproc。即使没有必要,这一步也没有坏处,所以我建议你这样做。

以下是使用TableAdapter和DataSet的一些MSDN参考点。

https://msdn.microsoft.com/library/04y282hb(v=VS.140).aspx https://msdn.microsoft.com/en-us/library/ms171902(v=vs.140).aspx

如果您仍然遇到问题,请告诉我。