在使用ADO.NET POCO T4 模板为存储过程生成方法时,发现无法为没有返回值的存储过程添加方法。例如:spDeleteCustomer.sql
有以下两种解决方法:
1. 修改T4 模板:
View Code
region.Begin("Function Imports");
foreach (EdmFunction edmFunction in container.FunctionImports)
{
object returnParameter = edmFunction.ReturnParameter; // MG added 02-29-2012 - fix to handle no return type
var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef);
string paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray());
// MG modified 02-29-2012 - fix to handle no return type
//if (edmFunction.ReturnParameter == null)
//{
// continue;
//}
//string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
// MG added 02-29-2012 - fix to handle no return type
string returnTypeElement = returnParameter == null ? string.Empty : code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
string returnTypeString;
string returnString;
if(!string.IsNullOrEmpty(returnTypeElement)) {
returnTypeString = string.Concat("ObjectResult<", returnTypeElement, ">");
returnString = string.Concat("base.ExecuteFunction<", returnTypeElement, @">(""", edmFunction.Name, @"""", code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())), ");");
} else {
returnTypeString = "int";
returnString = string.Concat(@"base.ExecuteFunction(""", edmFunction.Name, @"""", code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())), ");");
}
// MG modified 02-29-2012 - fix to handle no return type. Updated return type in line below:
#>
<#=Accessibility.ForMethod(edmFunction)#> <#=returnTypeString#> <#=code.Escape(edmFunction)#>(<#=paramList#>)
{
<#
foreach (var parameter in parameters)
{
if (!parameter.NeedsLocalVariable)
{
continue;
}
#>
ObjectParameter <#=parameter.LocalVariableName#>;
if (<#=parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"#>)
{
<#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", <#=parameter.FunctionParameterName#>);
}
else
{
<#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", typeof(<#=parameter.RawClrTypeName#>));
}
<#
}
#>
return <#=returnString#>
}
<#
}
region.End();
foreach (EdmFunction edmFunction in container.FunctionImports)
{
object returnParameter = edmFunction.ReturnParameter; // MG added 02-29-2012 - fix to handle no return type
var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef);
string paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray());
// MG modified 02-29-2012 - fix to handle no return type
//if (edmFunction.ReturnParameter == null)
//{
// continue;
//}
//string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
// MG added 02-29-2012 - fix to handle no return type
string returnTypeElement = returnParameter == null ? string.Empty : code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
string returnTypeString;
string returnString;
if(!string.IsNullOrEmpty(returnTypeElement)) {
returnTypeString = string.Concat("ObjectResult<", returnTypeElement, ">");
returnString = string.Concat("base.ExecuteFunction<", returnTypeElement, @">(""", edmFunction.Name, @"""", code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())), ");");
} else {
returnTypeString = "int";
returnString = string.Concat(@"base.ExecuteFunction(""", edmFunction.Name, @"""", code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())), ");");
}
// MG modified 02-29-2012 - fix to handle no return type. Updated return type in line below:
#>
<#=Accessibility.ForMethod(edmFunction)#> <#=returnTypeString#> <#=code.Escape(edmFunction)#>(<#=paramList#>)
{
<#
foreach (var parameter in parameters)
{
if (!parameter.NeedsLocalVariable)
{
continue;
}
#>
ObjectParameter <#=parameter.LocalVariableName#>;
if (<#=parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"#>)
{
<#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", <#=parameter.FunctionParameterName#>);
}
else
{
<#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", typeof(<#=parameter.RawClrTypeName#>));
}
<#
}
#>
return <#=returnString#>
}
<#
}
region.End();
2. 为存储过程添加返回值:
BEGIN
...
SELECT @@ROWCOUNT
END
...
SELECT @@ROWCOUNT
END