#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