SQL参数和问号

本文关键字:参数 SQL | 更新日期: 2023-09-27 18:22:23

我正在从经典的ASP切换到ASP.NET。我在做一些以前用旧方法很容易做的基本事情时遇到了一些困难。下面是一个方便的ASP函数,我用它用几行代码执行标量查询。

FUNCTION ExecuteScalarParams(SQLQuery, Parameter_Array)
Set cmd1 = Server.CreateObject("ADODB.Command") 
cmd1.ActiveConnection = con 
cmd1.CommandText = SQLQuery 
cmd1.CommandType = 1 
FOR ParamCount = 0 TO UBOUND(Parameter_Array)
    cmd1.Parameters(ParamCount) = Parameter_Array(ParamCount)
NEXT 'ParamCount
Set rstScalar = cmd1.Execute()
IF NOT rstScalar.EOF THEN
    arrScalar = rstScalar.GetRows()
    IF UBOUND(arrScalar,2) = 0 THEN
        ExecuteScalarParams = arrScalar(0,0)
    ELSE
        ExecuteScalarParams = NULL
    END IF
ELSE
    ExecuteScalarParams = NULL
END IF
rstScalar.Close
Set rstScalar = Nothing
Set cmd1 = Nothing
END FUNCTION

我曾经传递一个带有问号的SQL查询作为参数的占位符,如下所示:

SELECT TOP 1 UserName FROM Members WHERE (Created>?) AND (AdminLevel=?);

然后我会设置一个参数数组,并将其传递给函数:

MyArray = ARRAY("1-JAN-2012",1)

数组中的参数将按照它们出现的顺序替换查询字符串中的问号。

我试图在C#中模仿这个函数,但我被困在了必须传递参数的部分。到目前为止,我已经到了必须使用命名占位符(如@Created和@AdminLevel)而不是问号的地步,然后我必须设置这样的参数对象:

SqlParameter param = new SqlParameter();
param.ParameterName = "@AdminLevel";
param.Value = 1;

有没有一种方法可以在不必设置参数名称的情况下传递参数,只需使用问号和它们的出现顺序来指定参数的位置?

SQL参数和问号

edit:正如Dana所指出的,MSDN Docs for Parameters显示您需要为SqlClient使用命名参数,但可以为OleDb/ODBC使用位置参数。

您可以使用下面的代码使添加参数变得更加容易;这是我使用的骨架,但我相信有更好的方法。

您仍然需要使用命名参数,但您可以通过将它们命名为@a、@b、@c.来在一定程度上模拟问号。-位置参数很好,直到你得到了几个以上的参数,你必须不断地计算问号的数量,以确定哪个参数值被应用在哪里,这通常会导致错误。

using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    con.Open();
    {
        using (var command = con.CreateCommand())
        {
            command.Connection = conn;
            command.CommandText = "SELECT * FROM [dbo].[Table] WHERE [c1] = @a AND [c2] = @b";
            command.Parameters.AddWithValue("@a", aVal);
            command.Parameters.AddWithValue("@b", bVal);
            command.CommandType = CommandType.Text;
            using (var reader = command.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        ///
                    }
                }
                else
                {
                    ///
                }
            }
        }
    }
}