Проверка значений в таблице базы данных, чтобы увидеть, будет ли новая запись конфликтовать с существующей записью
У меня есть Detailsview с несколькими полями, всегда в режиме вставки. Из этих полей я хотел проверить, прежде чем пользователь вставил новую запись, чтобы увидеть, уже введен ли этот пользователь запись на эту дату.
Мне действительно нужно было найти способ проверить несколько требований, например, если запрашиваемая дата является выходным или если уже есть два разных запроса от разных пользователей на одну и ту же дату (потому что не может быть более двух человек, запрашивающих одну и ту же дату.)
Я не смог заставить работать собственный валидатор, потому что единственный раз, когда у меня есть постбэк, это когда вставка нажата.
Мне было интересно, есть ли способ проверить различные проверки при нажатии кнопки вставки, но выполнить вставку можно только в том случае, если все прошло?
Мне нужно проверить более одного столбца в таблице. Идентификатор пользователя и дата.
Я надеюсь, что это имело смысл.
asp: DetailsView ID = "DetailsView1" runat = "server" DataSourceID = "ObjectDataSource1" DataKeyNames = "bwrequestid" Height = "29px" Width = "928px" AutoGenerateRows = "False" CellPadding = "4" ForeColor = "# 333333" Сетки = "Нет" Стиль ="margin-right: 0px; выравнивание текста: слева; margin-top: 0px;" ondatabound = "DetailsView1_DataBound" oniteminserting = "EntValid_ItemInserting"
protected void EntValid_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
for (int i = 0; i < e.Values.Count; i++)
{
if (e.Values[i] != GetData())
{
e.Cancel = true;
return;
}
}
}
------- получить данные выглядит следующим образом
private DataSet GetData () {ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;
var sql = "SELECT LEAVETYPE, LEAVECODE FROM TEST.LVTYPE ORDER BY LEAVECODE";
using (iDB2Connection conn = new iDB2Connection(GetConnectionString()))
{
conn.Open();
using (iDB2Command cmd = new iDB2Command(sql, conn))
{
cmd.DeriveParameters();
using (iDB2DataAdapter da = new iDB2DataAdapter(cmd))
{
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
}
}
protected void EntValid_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
for (int i = 0; i < e.Values.Count; i++)
{
if (e.Values[i] != GetData())
{
e.Cancel = true;
return;
}
}
}
------- получить данные выглядит следующим образом
private DataSet GetData () {ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;
var sql = "SELECT LEAVETYPE, LEAVECODE FROM TEST.LVTYPE ORDER BY LEAVECODE";
using (iDB2Connection conn = new iDB2Connection(GetConnectionString()))
{
conn.Open();
using (iDB2Command cmd = new iDB2Command(sql, conn))
{
cmd.DeriveParameters();
using (iDB2DataAdapter da = new iDB2DataAdapter(cmd))
{
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
}
}
1 ответ
Я предполагаю, что вы используете только проверку на стороне сервера, это правильно? Если это так (что, кстати, я бы предложил как для проверки на стороне сервера, так и на стороне клиента, но это не относится к делу), прежде всего вам нужно обработать событие ItemInserting представления Details.
В этот момент у вас будет полный доступ к записи. Смотрите MSDN для более подробной информации.
Внутри обработчика события ItemInserting проведите валидацию, а в случае неудачи используйте e.Cancel = true;
например:
void CustomerDetail_ItemInserting(object sender,
DetailsViewInsertEventArgs e)
{
for (int i = 0; i < e.Values.Count; i++)
{
if (e.Values[i] != *your validation here*)
{
e.Cancel = true;
//set your validation summary message here
...
return;
}
}
}
Только не забудьте подключить этот обработчик:
<asp:DetailsView ID="CustomerDetail"
DataSourceID="Details" AutoGenerateRows="false"
*other properties*
OnItemInserting="CustomerDetail_ItemInserting" >