我很好奇是否可以在运行时创建 SQLParameter 并将其添加到 SQLCommand 。
我要做的是:
public void addParameters(string paramName, paramType, SqlParameter paramCommand)
{
SqlParameter myParameter = new SqlParameter("@" + paramName, paramType);
paramCommand.Parameters.Add(myParameter);
}
问题是传递paramType,它是 SqlDbType ,我不知道:
1.如何在这里实施/使用
2.何时调用此功能。
注意:我只想在 SQLCommand 对象中添加参数。它是这样的:
SqlParameter myParameter = new SqlParameter("@user", SqlDbType.Char);
答案 0 :(得分:4)
这样的事情:
public static class CommandExtensions
{
public static void AddParameter(this IDbCommand command, string name, object value)
{
if (command == null) throw new ArgumentNullException("command");
if (name == null) throw new ArgumentNullException("name");
var p = command.CreateParameter();
p.ParameterName = name;
p.Value = value ?? DBNull.Value;
command.Parameters.Add(p);
}
}
允许您:
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM Users WHERE FirstName LIKE @name";
command.AddParameter("name", "J%");
// [...]
}
该代码也独立于ADO.NET驱动程序,因此可以在大多数使用ADO.NET的项目中重用。如果您想了解有关编写可重用ADO.NET代码的更多信息,请阅读我的文章:http://blog.gauffin.org/2013/01/ado-net-the-right-way/
问题是传递paramType,它是SqlDbType而我不知道
通常,您不必指定数据库类型。
答案 1 :(得分:2)
您的方法是正确的:
cmd.Parameters.Add(new SqlParameter("@Name", "Frank Rizzo"));
有一点需要注意的是,SqlParameter构造函数提供了许多重载,这使得创建一个单独的函数来返回新的SqlParameter基本上是不必要的。
答案 2 :(得分:1)
除了jgauffin的回答:
构造SqlParameter时,如果您不确定参数的SqlDbType,可以使用SqlParameter构造函数,它只接受参数名和值作为参数。即; SqlParameter Constructor (String, Object)
为了MSDN文档,
在value参数中指定Object时,SqlDbType为 从Microsoft .NET Framework类型的Object推断。
答案 3 :(得分:1)
在ADO.NET中添加SQL参数的方法有很多种。通常,没有必要提供SQL数据库类型,因为数据作为字符串发送并由SQL服务器隐式转换。
MSDN引用以下示例 -
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID;
// Use AddWithValue to assign Demographics.
// SQL Server will implicitly convert strings into XML.
command.Parameters.AddWithValue("@demographics", demoXml);
第一个例子也可以写成 -
command.Parameters.Add("@ID", SqlDbType.Int).Value = customerID;
有关详情,请参阅http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters(v=vs.100).aspx。
显然,提供与SQL数据类型不匹配的数据会导致SQL异常,您应该设置长度限制并验证输入,使用" as"在本地将其转换为兼容类型。语法可以像正则表达式一样有用。
jgauffin的答案很容易适应使用包含数据库类型的语法,但我不确定它的优点是什么(除了作为提醒你),因为你没有得到任何类型的警告在尝试执行命令之前分配的值,甚至是异常。