在使用ADO.NET POCO T4 模板为存储过程生成方法时,发现无法为没有返回值的存储过程添加方法。例如:spDeleteCustomer.sql
有以下两种解决方法:
1. 修改T4 模板:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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