#c# #asp.net-mvc-4 #datatable
#c# #asp.net-mvc-4 #данные
Вопрос:
Может кто-нибудь, пожалуйста, объяснить, почему Clear()
или Dispose()
не удается очистить набор записей с данными?
Я использую DataTable в проекте MVC 4, подобном so var tbl = new DataTable()
, который отлично работает для извлечения данных, но по какой-то причине, когда я использую tbl.Clear()
and tbl.Dispose()
, а затем пытаюсь повторно tbl
использовать, он все еще содержит набор записей из предыдущего запроса, почему?
Может кто-нибудь, пожалуйста, дайте мне знать, как очистить / очистить / очистить предыдущий набор записей с данными?
Любая помощь будет высоко оценена 🙂
Пожалуйста, смотрите Пример кода ниже:
string name = "";
string password = "";
var stringWriter = new StringWriter();
var writer = new XmlTextWriter(stringWriter) { Formatting = Formatting.Indented };
var tbl = new DataTable();
string strConn = WebConfigurationManager.ConnectionStrings["TestConnection"].ToString();
var conn = new SqlConnection(strConn);
using (conn)
{
conn.Open();
var cmd = new SqlCommand("GetUserLoginID", conn) {CommandType = CommandType.StoredProcedure};
cmd.Parameters.AddWithValue("@UID", uid);
cmd.Parameters.AddWithValue("@BID", bId);
var userRecord = new SqlDataAdapter(cmd);
userRecord.Fill(tbl);
conn.Close();
if (tbl.Rows.Count > 0)
{
var row = tbl.Rows[0];
name = row["Name"].ToString();
password = row["Password"].ToString();
code = row["Code"].ToString();
}
tbl.Clear();
tbl.Dispose();
cmd = new SqlCommand("GetUserDetails", conn) { CommandType = CommandType.StoredProcedure };
cmd.Parameters.AddWithValue("@Code", code);
cmd.Parameters.AddWithValue("@BID", bId);
userRecord.Fill(tbl);
if (tbl.Rows.Count > 0)
{
var row = tbl.Rows[0];
writer.WriteStartDocument();
writer.WriteStartElement("Root");
writer.WriteElementString("BID", row["BID"].ToString());
writer.WriteElementString("Name", name);
}
else
{
writer.WriteStartDocument();
writer.WriteStartElement("Root");
writer.WriteElementString("BID", "Error");
}
writer.WriteEndElement();
writer.Flush();
writer.Close();
}
Комментарии:
1. Разве вы не получаете исключение при вызове метода Clear? Не могли бы вы показать нам больше кода.
2. Пожалуйста, посмотрите мой исправленный пост.
Ответ №1:
Кажется, вы всегда используете одно и то же SqlDataAdapter
. Вы создали новую команду :
cmd = new SqlCommand("GetUserDetails", conn) { CommandType = CommandType.StoredProcedure };
но вы должны установить userRecord с помощью этой новой команды:
userRecord = new SqlDataAdapter(cmd);
Комментарии:
1. Да, я использую повторно
SqlDataAdapter
, но использую другую хранимую процедуру, так что это не перезаписывает предыдущее соединение. Я пробовал добавлятьconn.Close()
иconn.Open()
перед вызовомcmd = new SqlCommand("GetUserDetails", conn)
, но все равно без радости.
Ответ №2:
Ниже приведен мой исправленный код, который решает мою проблему. Казалось бы, я не вызывал вторую хранимую процедуру, поэтому таблица tbl
данных не заполнялась вторым набором данных.
string name = "";
string password = "";
var stringWriter = new StringWriter();
var writer = new XmlTextWriter(stringWriter) { Formatting = Formatting.Indented };
var tbl = new DataTable();
string strConn = WebConfigurationManager.ConnectionStrings["TestConnection"].ToString();
var conn = new SqlConnection(strConn);
using (conn)
{
conn.Open();
var cmd = new SqlCommand("GetUserLoginID", conn) {CommandType = CommandType.StoredProcedure};
cmd.Parameters.AddWithValue("@UID", uid);
cmd.Parameters.AddWithValue("@BID", bId);
var userRecord = new SqlDataAdapter(cmd);
userRecord.Fill(tbl);
if (tbl.Rows.Count > 0)
{
var row = tbl.Rows[0];
name = row["Name"].ToString();
password = row["Password"].ToString();
code = row["Code"].ToString();
}
tbl.Clear();
cmd = new SqlCommand("GetUserDetails", conn) { CommandType = CommandType.StoredProcedure };
cmd.Parameters.AddWithValue("@Code", code);
cmd.Parameters.AddWithValue("@BID", bId);
userRecord = new SqlDataAdapter(cmd);
userRecord.Fill(tbl);
if (tbl.Rows.Count > 0)
{
var row = tbl.Rows[0];
writer.WriteStartDocument();
writer.WriteStartElement("Root");
writer.WriteElementString("BID", row["BID"].ToString());
writer.WriteElementString("Name", name);
}
else
{
writer.WriteStartDocument();
writer.WriteStartElement("Root");
writer.WriteElementString("BID", "Error");
}
writer.WriteEndElement();
writer.Flush();
writer.Close();
conn.Close();
}
tbl.Dispose();