Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL参数和问号_C#_Asp.net_Sql_Asp Classic_Parameters - Fatal编程技术网

C# SQL参数和问号

C# SQL参数和问号,c#,asp.net,sql,asp-classic,parameters,C#,Asp.net,Sql,Asp Classic,Parameters,我正在从传统ASP转换到ASP.NET。我在做一些基本的事情时遇到了一些困难,我以前用旧方法很容易做到。下面是一个方便的ASP函数,我使用它执行标量查询,只需几行代码 FUNCTION ExecuteScalarParams(SQLQuery, Parameter_Array) Set cmd1 = Server.CreateObject("ADODB.Command") cmd1.ActiveConnection = con cmd1.CommandText = SQLQuery cmd

我正在从传统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=?);
SqlParameter param = new SqlParameter();
param.ParameterName = "@AdminLevel";
param.Value = 1;
然后,我将设置一个参数数组并将其传递给函数:

MyArray = ARRAY("1-JAN-2012",1)
数组中的参数将按照它们出现的顺序替换查询字符串中的问号

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

SELECT TOP 1 UserName FROM Members WHERE (Created>?) AND (AdminLevel=?);
SqlParameter param = new SqlParameter();
param.ParameterName = "@AdminLevel";
param.Value = 1;

有没有一种方法可以传递参数而不必设置参数名,只需使用问号和它们出现的顺序来指定哪个参数去哪里?

编辑:正如Dana所指出的,您需要为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
                {
                    ///
                }
            }
        }
    }
}

我相信ADO.Net只支持命名参数。抱歉:)+1表示下一个参数计数-我以为我是唯一一个这样做的疯子;o) 好的,谢谢!我所做的是添加随机(但唯一)参数名,而不是问号,然后生成一个函数来解析参数名的SQL查询(以“@”开头),并将它们保存在一个数组中,然后与AddWithValue命令的另一个数组(参数数组)中的值一起使用。我想分享解析函数的代码,但它不适合此注释。如果愿意,您可以编辑原始问题并在其中添加代码。就个人而言,我会考虑调整您的代码,以便您仍然可以正确使用命名参数;让您的函数接受SQL参数作为实例的KeyValuePair,然后在其上循环,将其映射到您的command.parameters集合。