SQL参数和问号
我正在从传统的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;
有没有办法传递参数而无需设置参数名称,只需使用问号和它们出现的顺序来指定哪个参数在哪里?
编辑:正如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
{
///
}
}
}
}
}
链接地址: http://www.djcxy.com/p/10425.html
上一篇: SQL Parameters and Question Marks
下一篇: ZeroMQ usage in web application: how frontend interacts with backend