C# 对方法重载感到困惑
我将.NET4.0与ASP.NET4.0和C一起使用,这是C4.0吗 我想在我的SQL Server数据库中插入一些数据,我有一个这样的方法来处理这个问题:C# 对方法重载感到困惑,c#,optional-parameters,C#,Optional Parameters,我将.NET4.0与ASP.NET4.0和C一起使用,这是C4.0吗 我想在我的SQL Server数据库中插入一些数据,我有一个这样的方法来处理这个问题: public int InsertTrade( string symbol, string tradeSetupId, int tradeTypeId, decimal lotsPerUnit, string chartTimeFrame, int tradeGrade, int ex
public int InsertTrade(
string symbol,
string tradeSetupId,
int tradeTypeId,
decimal lotsPerUnit,
string chartTimeFrame,
int tradeGrade,
int executionGrade,
int MFEPips,
int MAEPips,
decimal pctAccountRisked
)
{
SqlCommand cmd = new SqlCommand("usp_InsertTrade");
cmd.Parameters.AddWithValue("@symbol", symbol);
cmd.Parameters.AddWithValue("@pctAccountRisked", pctAccountRisked);
cmd.Parameters.AddWithValue("@tradeSetupId", tradeSetupId);
cmd.Parameters.AddWithValue("@lotsPerUnit", lotsPerUnit);
cmd.Parameters.AddWithValue("@tfCode", chartTimeFrame);
cmd.Parameters.AddWithValue("@MAEPips", MAEPips);
cmd.Parameters.AddWithValue("@MFEPips", MFEPips);
cmd.Parameters.AddWithValue("@tradeGrade", tradeGrade);
cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
return (InsertData(cmd, "trade"));
}
有几个非必填字段:tradeGrade、executionGrade、mfepis、MAEPips。usp_InsertTrade存储过程将这些可选参数公开为可空。用C编写此代码的最佳方法是什么?我正在学习编程,所以如果您能提供最佳实践方面的指导,那就太好了
以下是usp_InsertTrade的存储过程参数:
CREATE procedure [dbo].[usp_InsertTrade]
@symbol char(6),
@tradeSetupId varchar(10),
@tradeTypeId int,
@lotsPerUnit decimal(18,1),
@chartTimeFrame varchar(5),
@tradeGrade smallint = NULL,
@executionGrade smallint = NULL,
@MFEPips int = NULL,
@MAEPips int = NULL,
@pctAccountRisked decimal(3,2)
AS
非常感谢
更新
我更改了函数,使可选参数位于底部。像这样:
public int InsertTrade(
string symbol,
string tradeSetupId,
int tradeTypeId,
decimal lotsPerUnit,
string chartTimeFrame,
decimal pctAccountRisked,
int? tradeGrade,
int? executionGrade,
int? MFEPips,
int? MAEPips
)
{
SqlCommand cmd = new SqlCommand("usp_InsertTrade");
// required parameters
cmd.Parameters.AddWithValue("@symbol", symbol);
cmd.Parameters.AddWithValue("@tradeSetupId", tradeSetupId);
cmd.Parameters.AddWithValue("@tradeTypeId", tradeTypeId);
cmd.Parameters.AddWithValue("@lotsPerUnit", lotsPerUnit);
cmd.Parameters.AddWithValue("@tfCode", chartTimeFrame);
cmd.Parameters.AddWithValue("@pctAccountRisked", pctAccountRisked);
// optional parameters
if (MAEPips.HasValue)
cmd.Parameters.AddWithValue("@MAEPips", MAEPips);
if (MFEPips.HasValue)
cmd.Parameters.AddWithValue("@MFEPips", MFEPips);
if (tradeGrade.HasValue)
cmd.Parameters.AddWithValue("@tradeGrade", tradeGrade);
if (executionGrade.HasValue)
cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
return (InsertData(cmd, "trade"));
}
当我使用以下代码调用函数时:
DBUtil DB = new DBUtil();
int tradeId = DB.InsertTrade (
ddlSymbols.SelectedValue,
ddlTradeSetups.SelectedValue,
ddlTradeTypes.SelectedValue,
decimal.Parse(txtLotsPerUnit.Text),
ddlTimeFrames.Text,
decimal.Parse(txtAcctRisk.Text));
我得到这个错误:
No overload for method 'InsertTrade' takes 6 arguments
您可以在参数中使用可为null的值,并在添加参数之前检查值,这样,如果未提供值,它将使用存储过程的默认值:
public int InsertTrade(
...
int? executionGrade,
...
)
{
SqlCommand cmd = new SqlCommand("usp_InsertTrade");
...
if(executionGrade.HasValue)
cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
return (InsertData(cmd, "trade"));
}
您可以在参数中使用可为null的值,并在添加参数之前检查值,这样,如果未提供值,它将使用存储过程的默认值:
public int InsertTrade(
...
int? executionGrade,
...
)
{
SqlCommand cmd = new SqlCommand("usp_InsertTrade");
...
if(executionGrade.HasValue)
cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
return (InsertData(cmd, "trade"));
}
请参阅有关可空类型的链接: 简而言之,将函数声明为:
public int InsertTrade(
string symbol,
string tradeSetupId,
int tradeTypeId,
decimal lotsPerUnit,
string chartTimeFrame,
int? tradeGrade,
int? executionGrade,
int? MFEPips,
int? MAEPips,
decimal pctAccountRisked
)
请参阅有关可空类型的链接: 简而言之,将函数声明为:
public int InsertTrade(
string symbol,
string tradeSetupId,
int tradeTypeId,
decimal lotsPerUnit,
string chartTimeFrame,
int? tradeGrade,
int? executionGrade,
int? MFEPips,
int? MAEPips,
decimal pctAccountRisked
)
另一种方法可以使用另一种方法可以将与C 4.0结合使用,您可以结合使用:
使用这些参数,您可能需要考虑重构——这将使您的代码在将来更易于阅读和修改。
用C 4,您可以结合使用:
使用这些参数,您可能需要考虑重构——这将使您的代码在将来更易于阅读和修改。
< P>我将创建一个结构来封装参数。 以下是我可能想到的可行方法: 可选参数。您可以使用C 4.0语法定义带有一些可选参数的方法。此功能在VB中已经存在,但最近添加到C中。缺点:您受限于如何使用可选参数。只有最后一个参数可以设置为可选。我的意思是,如果你有名字,地址,电话作为参数,按照这个顺序,你不能跳过地址和设置名字 结构如前所述,这是我最喜欢的方式。您可以设置任何空值,但必须为每个方法创建一个结构 定义重载:最糟糕的技术是为每个参数组合定义重载,这在大型参数集合中是不可行的 对象数组:仅当所有参数的类型不同时才可行。可以根据对象数组中每个条目的类型确定参数 字典:另一个有趣的方法。每个条目都映射一个键 希望能有所帮助我会创建一个结构来封装参数 以下是我可能想到的可行方法: 可选参数。您可以使用C 4.0语法定义带有一些可选参数的方法。此功能在VB中已经存在,但最近添加到C中。缺点:您受限于如何使用可选参数。只有最后一个参数可以设置为可选。我的意思是,如果你有名字,地址,电话作为参数,按照这个顺序,你不能跳过地址和设置名字 结构如前所述,这是我最喜欢的方式。您可以设置任何空值,但必须为每个方法创建一个结构 定义重载:最糟糕的技术是为每个参数组合定义重载,这在大型参数集合中是不可行的 对象数组:仅当所有参数的类型不同时才可行。可以根据对象数组中每个条目的类型确定参数 字典:另一个有趣的方法。每个条目都映射一个键希望对您有所帮助听起来像您在使用Visual Studio 2010,C4.0,所以他们现在引入了可选参数:听起来像您在使用Visual Studio 2010,C4.0,所以他们现在引入了可选参数:我将创建一个扩展方法来消除对可空变量的重复检查。扩展方法类似于:
public static class SqlCommandExtensions
{
public static void AddNullableInParameter<T>(this SqlCommand command, string columnName, Nullable<T> value) where T : struct
{
if (value.HasValue)
{
command.Parameters.AddWithValue(columnName, value.Value);
}
}
}
现在您可以编写命令了。AddNullableInParameter@yourParameter,您的NullableType;我将创建一个扩展方法来消除对可空变量的重复检查。扩展方法类似于:
public static class SqlCommandExtensions
{
public static void AddNullableInParameter<T>(this SqlCommand command, string columnName, Nullable<T> value) where T : struct
{
if (value.HasValue)
{
command.Parameters.AddWithValue(columnName, value.Value);
}
}
}
现在您可以编写命令了。AddNullableInParameter@yourParameter,您的NullableType;而不是所有那些if语句。他肯定不需要检查它是否有值,因为它将直接传递到存储过程,是null还是其他?@Moo Juice SQL null与C null是不同的。要在C中提到SQL NULL,您需要说DBNull.Value。在这里,由于存储过程定义中的默认值是空的,所以最简单的方法就是什么都不说。@Moo Juice-d
估计是,即使不添加参数,它也会使用存储过程开发人员选择的任何默认值—不一定为null。当然,他不需要检查它是否有值,因为它将直接传递到存储过程,是null还是其他?@Moo Juice SQL null与C null是不同的。要在C中提到SQL NULL,您需要说DBNull.Value。在这里,由于存储过程定义中的默认值如我们所愿为空,最简单的方法就是什么都不说。@Moo Juice-目的是,即使不添加参数,它也会使用存储过程开发人员选择的任何默认值-这不一定为空。哇,谢谢,我不知道有这么多方法可以剥猫皮!哇,谢谢,我不知道有这么多方法可以剥猫皮!谢谢,你能看一下我问题的更新部分吗?我得到一个错误,我不知道为什么。@Mark Allison-您已将参数设置为仅可为null int?MFEPips,。我已经让他们可选的以及int?mfepis=null,。看到extra=null了吗?谢谢,现在效果很好。我得去研究一下你提到的参数对象。谢谢,你能看看我问题的更新部分吗?我得到一个错误,我不知道为什么。@Mark Allison-您已将参数设置为仅可为null int?MFEPips,。我已经让他们可选的以及int?mfepis=null,。看到extra=null了吗?谢谢,现在效果很好。我必须去研究一下你所说的参数对象。你在参数声明中缺少了=null,这导致了你的错误。@Paddy-谢谢,需要咖啡……另外,我认为你可能需要将null转换为可为null的类型。例如智力?tradeGrade=int?null。您在参数声明中缺少了=null,这导致了您的错误。@Paddy-谢谢,需要咖啡……另外,我认为您可能需要将null转换为可为null的类型。例如智力?tradeGrade=int?空。