问题描述
我创建了小方法。此方法的输入参数-具有帐户类型的列表(选择用户的帐户)。输出参数-是带有其他表中参数的列表。 在这里,我不知道如何动态设置。 我尝试创建一种方法(这里需要从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