有没有办法在我的SqlCommand中添加一个参数,如果在我的查询中没有使用它,引擎就不会抱怨?
我的查询中包含大约50个参数,但需要包含哪些参数在很大程度上取决于具体情况。我可以轻松地删除200行代码,如果我可以将它们全部置于顶部并在添加我的参数后构建我的查询。
一个非常简单/愚蠢/错误的例子(是的,这里的解决方案是在else子句中添加id)
cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
cmd.Parameters.Add("@name", SqlDbType.nVarChar, 250).Value = name;
if(id == null) cmd.CommandText = "INSERT INTO tab (name) VALUES (@name)";
else cmd.CommandText = "UPDATE tab SET name = @name WHERE id = @id";
这将返回错误:
System.Data.SqlClient.SqlException:参数化查询'(@ id,@ name)'需要参数'@id',这是未提供的
如果不可能,简单的“否”就足以被接受为答案..
答案 0 :(得分:6)
有没有办法在我的SqlCommand中添加一个参数,如果我的查询中没有使用它,引擎就不会抱怨?
如果添加参数并且不使用它,ADO.NET不会抱怨。您报告的错误消息是因为您尝试使用没有添加的参数 - 相反的情况。最有可能的是,id
是null
。值不为null
的参数未添加 - 您需要使用DBNull.Value
:
cmd.Parameters.Add("@id", SqlDbType.Int).Value = ((object)id) ?? DBNull.Value;
cmd.Parameters.Add("@name", SqlDbType.nVarChar, 250)
.Value = ((object)name) ?? DBNull.Value;
或者,像" dapper"等工具。会让这很容易:
conn.Execute(sql, new { id, name }); // job done