我有一个名为'prcGetCOBAdress'的简单SP,使用参数记录返回和地址搜索。
ALTER PROCEDURE [dbo].[prcGetCOBAddress]
@NumberOfRecord int,
@FullAddress nvarchar(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @fullAdd nvarchar(255)
DECLARE @numRec int
SET @fullAdd = @fullAddress
SET @numRec = @numberOfRecord
SELECT TOP (@numRec)
,[UID_NUM]
,[ADD_FULL]
,[FLOOR]
,[POSTALCITY]
,[STATE]
,[ZIP5]
,[IN_OUT], and more...
FROM [ISD].[dbo].[view_COBADDRESS]
WHERE [ACTIVE] = 1 AND [ADD_FULL] LIKE '%'+@fullAdd+'%'
END
然后我创建了一个名为'AddressALL'的类,如下所示
namespace GISWebApplication
{
public class AddressALL
{
public double UID_NUM { get; set; }
public string ADD_FULL { get; set; }
public string POSTALCITY { get; set; }
and more....
}
}
最后,我创建了一个类似于下面的Web服务来从EF调用此存储过程,如下所示
public AddressALL[] getAddesses(int NumberOfRecords, string AddressInput)
{
AddressALL result = new AddressALL();
try
{
using (GISAddressEntities database = new GISAddressEntities())
{
result = database.prcGetCOBAddress(NumberOfRecords, AddressInput).ToArray();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return result;
}
但是我有错误说不能在结果行隐式地将AddressALL转换为Address []。
答案 0 :(得分:0)
您正在将result
变量初始化为单个对象,而不是数组:
AddressALL result = new AddressALL();
当您尝试将AddressALL
个对象的数组分配给result
变量时,会出现错误。使用
AddressALL[] result = null;
// or
AddressALL[] result = new AddressALL[0];
或者只是不使用局部变量来存储结果。如果异常,我也不会返回空数组。因此,您不会知道是否存在错误或仅找不到地址。最好不要捕获错误或将其包装在更高级别的异常中:
public AddressALL[] getAddesses(int NumberOfRecords, string AddressInput)
{
try
{
using (GISAddressEntities database = new GISAddressEntities())
return database.prcGetCOBAddress(NumberOfRecords, AddressInput).ToArray();
}
catch (Exception ex)
{
throw new DataAccessException("Failed to load addresses", ex);
}
}
还有一点需要注意 - 如果您正在创建Web应用程序,那么将错误写入控制台并不是一个好方法:)使用一些日志记录框架并将错误记录到文件中。
更新:您还有另一个问题 - 存储过程返回Address
个对象而不是AddressALL
个对象。而AddressALL
并非来自Address
。如果字段集相同,您只需告诉EF按照here所述返回AddressALL
实体。