C# 必须使用sql字符串声明标量变量

C# 必须使用sql字符串声明标量变量,c#,sql-server,ado.net,C#,Sql Server,Ado.net,这是我第一次尝试参数化查询。我发现了错误 必须声明标量变量@Email 感谢您的帮助 string sql = "INSERT INTO Upload VALUES (@Email, @TimeStamp, @EmployeeId, @Name, @Title, @Department, @Race, @Gender, @AnnualizedBase, @AnnualizedTCC);"; using (SqlConnection con = new SqlConnection(Configu

这是我第一次尝试参数化查询。我发现了错误

必须声明标量变量@Email

感谢您的帮助

string sql = "INSERT INTO Upload VALUES (@Email, @TimeStamp, @EmployeeId, @Name, @Title, @Department, @Race, @Gender, @AnnualizedBase, @AnnualizedTCC);";

using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
using (SqlCommand command = new SqlCommand(sql, con))
{
   decimal num;
   var emailparam = new SqlParameter("@Email", SqlDbType.Text);
   emailparam.Value = System.Web.HttpContext.Current.User.Identity.GetUserId();

   // some more parameters following same format
   var baseparam = new SqlParameter("@AnnualizedBase", SqlDbType.Money);

   if (decimal.TryParse(result.Tables[0].Rows[i][6].ToString(), out num)) 
   {
       baseparam.Value = num;
   }
   else  
   {
       ViewBag.Error = "not money format";
   }

   var tccparam = new SqlParameter("@AnnualizedTCC", SqlDbType.Money);

   if (decimal.TryParse(result.Tables[0].Rows[i][7].ToString(), out num)) 
   {
       tccparam.Value = num;
   }
   else
   {
       ViewBag.Error = "not money format";
   }   

   con.Open();
   command.ExecuteNonQuery();
   con.Close();
}

如果你不明白的话,你应该试试这个,进一步问我

string mail="abc@hotmail.com"; 
string name="Abdul Aleem";
//This is In Lin Query
string sql = "INSERT INTO Upload VALUES (@Email, @Name)" //and so on
SqlConnection con = newSqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)

SqlCommand cmd = new SqlCommand(sql, con);
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.AddWithValue("@Email", mail);
cmd.Parameters.AddWithValue("@Name", name);
//And same as add other paramters according to your in line query
cmd.ExecuteNonQuery();

您正在定义您的参数-到目前为止,一切顺利

但是现在,在执行查询之前,必须将这些参数添加到
SqlCommand
对象中

// Add parameters to SqlCommand
command.Parameters.Add(emailparam);
command.Parameters.Add(baseparam);
command.Parameters.Add(tccparam);

// *NOW* you can open connection, execute query, close connection
con.Open();
command.ExecuteNonQuery();
con.Close();

您需要将参数放入命令中。您也没有做任何事情来确保这些值映射到正确的列可能重复的提示:像“Dapper”(在NuGet上)这样的工具使这种事情变得轻而易举:
con.Execute(sql,new{AnnualizedBase=annBase,annualizedcc=annTcc})-完成!另外:我担心任何以相同方法与DB和UI对话的代码;可能最好将它们分开,这样您就可以做一个或另一个-即创建一个以DB为中心的方法,只接受解析的输入(
annBase
annTcc
等),甚至不知道UI(
ViewBag
HttpContext
等),您应该签出并停止使用
.AddWithValue()
-这可能会导致意外的结果…这取决于您的要求,我认为这是一个很好的做法,这就是为什么我在本文中与您分享您确定哪个参数接受什么值