我目前要实现一个API控制器,它将更新表中的字段,但前提是输入参数不为空。我知道这个话题有很多,我基本上已经尝试过每一种解决方案。
基本上,我想要实现的是,只有当参数不为null时,查询才会更新字段。
我的查询如下:
string query = "UPDATE leads SET " +
"orgNo = IF(?orgNo IS NULL, orgNo, ?orgNo), " +
"companyName = IF(?companyName IS NULL, companyName, ?companyName), " +
"name = IF(?name IS NULL, name, ?name), " +
"telephone = IF(?telephone IS NULL, telephone, ?telephone), " +
"telephone1 = IF(?telephone1 IS NULL, telephone1, ?telephone1), " +
"address = IF(?address IS NULL, address, ?address), " +
"postalCode = IF(?postalCode IS NULL, postalCode, ?postalCode), " +
"city = IF(?city IS NULL, city, ?city), " +
"email = IF(?email IS NULL, email, ?email), " +
"website = IF(?website IS NULL, website, ?website), " +
"callbackDate = IF(?callbackDate IS NULL, callbackDate, ?callbackDate), " +
"status = IF(?status IS NULL, status, ?status), " +
"stage = IF(?stage IS NULL, stage, ?stage), " +
"callDate = IF(?callDate IS NULL, callDate, ?callDate), " +
"salesNote = IF(?salesNote IS NULL, salesNote, ?salesNote), " +
"totalTries = totalTries + 1, " +
"currentTries = currentTries + 1 WHERE leadId = ?leadId;";
参数看起来像这个
cmd.Parameters.Add(new MySqlParameter("?leadId", lead.lead_id));
cmd.Parameters.Add(new MySqlParameter("?orgNo", null));
cmd.Parameters.Add(new MySqlParameter("?companyName", null));
cmd.Parameters.Add(new MySqlParameter("?name", lead.name));
cmd.Parameters.Add(new MySqlParameter("?telephone", lead.telephone));
cmd.Parameters.Add(new MySqlParameter("?telephone1", lead.telephone1));
cmd.Parameters.Add(new MySqlParameter("?address", lead.address));
cmd.Parameters.Add(new MySqlParameter("?salesNote", DateTime.Now + "|" + agent + "|" + lead.stage + "|" + lead.status + "|" + lead.sales_note.Replace("|", "") + "rn"));
cmd.Parameters.Add(new MySqlParameter("?postalCode", lead.postal_code));
cmd.Parameters.Add(new MySqlParameter("?city", lead.city));
cmd.Parameters.Add(new MySqlParameter("?email", lead.email));
cmd.Parameters.Add(new MySqlParameter("?website", lead.website));
cmd.Parameters.Add(new MySqlParameter("?callbackDate", lead.callback_date));
cmd.Parameters.Add(new MySqlParameter("?status", lead.status));
cmd.Parameters.Add(new MySqlParameter("?stage", lead.stage));
cmd.Parameters.Add(new MySqlParameter("?callDate", DateTime.Now));
我得到的错误是这个Column 'companyName' cannot be null
请注意,orgNo和companyName是完全相同的列类型,并且都为null。希望有人能在这里帮我。谢谢
在为存储过程传递参数时,请考虑使用DBNull而不是null。
根据MSDN:向服务器发送null
参数值时,必须指定DBNull,而不是null。
原因是一些SQL服务器以及C#与它们通信的方式可能不理解null
表示缺少数据,而是运行时假设您尝试使用不存在或未初始化的对象。
使用DBNull
相当简单,DBNull
是一个单例对象,这意味着当您启动程序时,它们中只有一个。
您不必初始化DBNull
,因为它是在运行时创建的。要访问它,请使用DBNull.Value
而不是null
。
这里有一个简短的例子:
var sqlParam = new MySqlParameter("?paramName", System.DBNull.Value);
cmd.Parameters.Add(sqlParam);
我刚刚记住,在Sql Server中存在函数COALESCE,它似乎非常适合这里,幸运的是,MySql中也有它。
string query = "UPDATE leads SET " +
"orgNo = COALESCE(?orgNo, orgNo), " +
....
"WHERE leadId = ?leadId;";
MySQL COALESCE((函数用于返回第一个非null表达式列表中的值。如果列表中的所有值都求值如果设置为NULL,则COALESCE((函数返回NULL。
关于COALESCE 的更多信息