Динамическая установка параметров в SQL-запросе

#c# #asp.net #.net #model-view-controller #ado

#c# #asp.net #.net #модель-представление-контроллер #ado

Вопрос:

Я создал небольшой метод. Входные параметры этого метода — список с типом учетной записи (учетные записи, которые выбирает пользователь). Выходные параметры — это список с параметрами из другой таблицы. Здесь я не знаю, как я мог бы установить его динамически. Я попытался создать метод (здесь мне нужно установить AccountType …динамически из элемента Ilist):

         public async Task<IList<AccountInfo>> GetAccountByAccountType(IList<AccountType> item)
        {
            //item
            var parameters = new { (',', item.ToArray()) };

            string query = $"SELECT accountID, accountName, AccountNo, accountType from account_ref "  
                            "where accountType not in (4, 9) and accountType IN(1, 2, 3)";

            var accType = await Connection.QueryAsync<AccountInfo>(query);

            return accType.ToList();
        }
  

Мои модели:
1-й

 [Table("accountType_ref", Schema = "dbo")]
    public class AccountType
    {
        [Column("accountTypeID"), Key()]
        public int AccountTypeId
        {
            get;
            set;
        }

        [Column("accountTypeName")]
        public string AccountTypeName
        {
            get;
            set;
        }
    }
  

2-й

  [Table("account_ref", Schema = "dbo")]
    public class AccountInfo
    {
        [Column("accountID"), Key()]
        public int Id
        {
            get;
            set;
        }

        [Column("accountName")]
        public string Name
        {
            get;
            set;
        }

        [Column("AccountNo")]
        public string AccountNumber
        {
            get;
            set;
        }

        [Column("accountType")]
        public int AccountType
        {
            get;
            set;
        }
    }
  

Цель: пользователь включит несколько или один тип учетной записи (уже сделано этим методом). После этого пользователь получит новую таблицу на основе своего выбора (это мой метод).

Ответ №1:

Просто создайте строку sql. И потому, что это веб? Затем просто динамическое создание @Params в тексте команды sql.

Итак, это показывает, как вы можете это сделать:

 {
DataTable rst = new DataTable();

string strSQL = "SELECT ID,FirstName, LastName, HotelName FROM tblHotels "   "WHERE ID IN ";
string strParms = "";

SqlCommand cmdSQL = new SqlCommand("", new SqlConnection(My.Settings.Test3));

string[] mypvalues = Split(this.TextBox1.Text, ",");
for (var i = 0; i <= mypvalues.Length - 1; i  )
{
    if (strParms != "")
        strParms  = ",";
    strParms  = "@p"   i;
    cmdSQL.Parameters.Add("@p"   i, SqlDbType.Int).Value = mypvalues[i];
}
strSQL  = "("   strParms   ")";
cmdSQL.CommandText = strSQL;
SqlDataAdapter da = new SqlDataAdapter(cmdSQL);
da.Fill(rst);
}
  

Итак, у нас есть строка, подобная этой

 accountType IN ()
our value list is this 1, 2, 3
  

Итак, выше становится следующим:

 accountType IN (p0, p1, p2)
  

И мы устанавливаем параметры в цикле, например:

 cmdSQL.Parameters.Add("@p"   i, SqlDbType.Int).Value = mypvalues[i];
  

Итак, мы по-прежнему получаем parm safe sql, а также получаем строгие определения типа (целое число) для параметров

Чаще всего не понимают, что вы можете выполнить цикл установить параметры для объекта команды sql, прежде чем мы введем в него sql. Я имею в виду, у нас могло бы быть два цикла for / next, но вышесказанное делает это за один раз, и для небольшого списка (скажем, 4-10) использование приведенного выше «в некотором списке (@p0, p1) довольно хорошо для короткого списка и «нескольких» значений, как выспросите.

Мой c # не так уж хорош, но вышесказанное в vb.net выглядит примерно так:

    Dim rst As New DataTable

    Dim strSQL As String = "SELECT ID,FirstName, LastName, HotelName FROM tblHotels " amp;
                           "WHERE ID IN "
    Dim strParms As String = ""

    Dim cmdSQL As New SqlCommand("", New SqlConnection(My.Settings.Test3))

    Dim mypvalues() As String = Split(Me.TextBox1.Text, ",")
    For i = 0 To mypvalues.Length - 1
        If strParms <> "" Then strParms  = ","
        strParms  = "@p" amp; i
        cmdSQL.Parameters.Add("@p" amp; i, SqlDbType.Int).Value = mypvalues(i)
    Next
    strSQL  = "(" amp; strParms amp; ")"
    cmdSQL.CommandText = strSQL
    Dim da As New SqlDataAdapter(cmdSQL)
    da.Fill(rst)
  

На этом этапе мы можем поместить результирующую таблицу данных (rst) в listview или datagrid следующим образом:

    MyListView1.DataSource = rst
   MyListView1.databind