MVC 4 Флеш / пустой / очистить данные

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