C#:在运行时创建SQLParameter

时间:2013-01-14 07:32:17

标签: c# sql-server

我很好奇是否可以在运行时创建 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);

4 个答案:

答案 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的答案很容易适应使用包含数据库类型的语法,但我不确定它的优点是什么(除了作为提醒你),因为你没有得到任何类型的警告在尝试执行命令之前分配的值,甚至是异常。