在SQL查询中动态设置参数

问题描述

我创建了小方法。此方法的输入参数-具有帐户类型的列表(选择用户的帐户)。输出参数-是带有其他表中参数的列表。 在这里,我不知道如何动态设置。 我尝试创建一种方法(这里需要从Ilist项目中动态设置 accountType IN ... 动态):

        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();
        }

我的模特: 1st

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

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

第二

 [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;
        }
    }

目标:用户将打开多个或一个帐户类型(已完成此方法)。之后,用户将根据自己的选择获得新表(这是我的方法)。

解决方法

只需建立sql字符串即可。并且因为这是网络?然后只需在sql命令文本中动态构建@Params。

因此,这显示了如何执行此操作:

{
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安全的sql,并且还获得了参数的强类型定义(整数)

大多数时候,大多数人没有意识到您可以循环并设置sql命令对象的参数,然后再输入该sql。我的意思是,我们可以有两个for / next循环,但是上面一次完成了,对于一个小列表(比如4-10),那么在上面的@(p0,p1)列表中使用上面的“列出简短清单,并按您的要求提供“少量”值。

我的c#并不是很好,但是vb.net中的上述内容看起来像这样:

   Dim rst As New DataTable

    Dim strSQL As String = "SELECT ID,HotelName FROM tblHotels " &
                           "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" & i
        cmdSQL.Parameters.Add("@p" & i,SqlDbType.Int).Value = mypvalues(i)
    Next
    strSQL += "(" & strParms & ")"
    cmdSQL.CommandText = strSQL
    Dim da As New SqlDataAdapter(cmdSQL)
    da.Fill(rst)

这时,我们可以将结果数据表(rst)推到listview或datagrid中,如下所示:

   MyListView1.DataSource = rst
   MyListView1.databind