I'm using .NET 4.0 with ASP.NET 4.0 and C# (would that be C# 4.0?).
I want to insert some data into my SQL Server database and I have a method like so to handle this:
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")); } There are several non-required fields: tradeGrade, executionGrade, MFEPips, MAEPips. The usp_InsertTrade stored procedure exposes these optional parameters as NULLable. What is the best way to code this in C#? I'm learning to program so it would be great if you could offer guidance on best practise.
Here are the stored procedure parameters for 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 Thanks a lot.
UPDATE
I've changed my function so that the optional parameters are at the bottom. Like so:
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")); } When I call the function using this code:
DBUtil DB = new DBUtil(); int tradeId = DB.InsertTrade ( ddlSymbols.SelectedValue, ddlTradeSetups.SelectedValue, ddlTradeTypes.SelectedValue, decimal.Parse(txtLotsPerUnit.Text), ddlTimeFrames.Text, decimal.Parse(txtAcctRisk.Text)); I get this error:
No overload for method 'InsertTrade' takes 6 arguments
int? tradeGrade = (int?)null.