0

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

4 回答 4

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,我不知道

通常,您不必指定 db 类型。

于 2013-01-14T07:38:19.450 回答
2

你的方法是正确的:

cmd.Parameters.Add(new SqlParameter("@Name", "Frank Rizzo"));

需要注意的一点是 SqlParameter 构造函数提供了许多重载,使得创建一个单独的函数来返回新的 SqlParameter 在很大程度上是不必要的。

于 2013-01-14T07:39:29.897 回答
1

除了jgauffin的回答:

在构造SqlParameter时,如果不确定参数的SqlDbType,可以使用SqlParameter构造函数,它只接受参数名和值作为参数。即;SqlParameter 构造函数(字符串,对象)

为了 MSDN 文档,

在 value 参数中指定 Object 时,SqlDbType 是从 Object 的 Microsoft .NET Framework 类型推断出来的。

于 2013-01-14T07:42:29.303 回答
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 的答案可以很容易地适应使用包含 DB 类型的语法,但我不确定有什么优势(除了提醒您),因为无论分配的值如何,您都不会收到类型警告,甚至在尝试执行命令。

于 2013-01-14T09:46:01.733 回答