Параметры SQL и вопросительные знаки - PullRequest
7 голосов
/ 04 февраля 2012

Я делаю переход с классического 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 Ответ

3 голосов
/ 04 февраля 2012

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
                {
                    ///
                }
            }
        }
    }
}
...