Параметры 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;
есть ли способ передать параметры без необходимости устанавливать имена параметров и просто использовать вопросительные знаки, и порядок, в котором они появляются, чтобы указать, какой параметр идет куда?
1 ответов
edit: как указала Дана документы MSDN для параметров показывает, что вам нужно использовать именованные параметры для 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
{
///
}
}
}
}
}