Чтение и обновление данных с помощью вопроса SqlDataAdapter

Я ищу несколько примеров того, как лучше всего использовать SqlDataAdapter для доступа и обновления данных в моем приложении. Прямо сейчас у меня есть что-то вроде этого:

SqlDataAdapter adapter;
DataSet myData = MyDataAccessClass.GetData("Select * from Students", ref adapter);
// change some data here and save changes
adapter.Update();

Все это происходит в коде позади, и мне это совсем не нравится. Итак, я пытаюсь найти способ сделать что-то вроде этого:

DataSet myData = MyDataAccessClass.GetStudents();
// change some data and save changes
MyDataAccessClass.SaveStudents(myData);

Где метод SaveStudents по-прежнему использует SqlDataAdapter для обновления db.

Любые идеи о том, как заставить это работать, или некоторые указатели на лучшие практики выполнения чего-то подобного высоко ценятся. Спасибо.


person chiefanov    schedule 27.05.2011    source источник


Ответы (2)


Мне это кажется довольно простой реализацией уровня доступа к данным. Как правило, я делаю это примерно так:

public class MyDataAccessClass
{
    private string ConnString;

    public MyDataAccessClass()
    { //Get connection string from configuration file }

    public MyDataAccessClass(string connString)
    { ConnString = connString; }

    public DataSet GetAllStudents()
    {
       //your SQL Adapter code here...
    }
}

Одно замечание, которое я хотел бы сделать, заключается в том, что с таким количеством доступных решений ORM (включая только Entity Framework и Linq2Sql) вы можете рассмотреть возможность использования коллекций объектов вместо наборов данных для своих представлений данных. Тогда у вас может быть такой метод, как:

public void CreateUpdateStudent(Student student)
{
    //update database
}

Я признаю, что это довольно субъективно, но я считаю, что это предпочтительнее, чем использование простых наборов данных.

person AllenG    schedule 27.05.2011
comment
Ваш пример похож на мой, за исключением того, что метод GetAllStudents возвращает ссылку на sqldataadapter, используемую для получения данных, а затем он используется в моем коде пользовательского интерфейса для внесения обновлений. Я пытаюсь изменить его, чтобы у меня не было sqldataadapters в моем отделенном коде, потому что я не думаю, что это подходящее место для них. И в то же время мне все еще приходится использовать sqldataadapter для обновления моего DAL. - person chiefanov; 27.05.2011
comment
Кроме того, я полностью за Entity Framework и объекты вместо наборов данных, но, к сожалению, в этом конкретном проекте у меня нет выбора, что использовать для моего DAL. - person chiefanov; 27.05.2011
comment
В какой-то момент вам все равно понадобится класс, который запрашивает базу данных. Независимо от того, находится ли это непосредственно в вашем коде или в какой-либо другой сборке, на которую ссылаются, это не изменит того факта, что НЕКОТОРЫЙ фрагмент кода собирается это сделать. Обычно у меня есть отдельный проект под названием SolutionName.DAL (или .DATA), на который затем ссылается мой бизнес-уровень. Обычно я могу настроить его так, чтобы уровень представления даже не знал о базе данных. - person AllenG; 27.05.2011
comment
Верно, и мой codebhind имеет ссылку на другой класс, который выполняет все взаимодействия с базой данных, за исключением обновлений, которые выполняются через sqldataadapter в codebehind. Возможно, я пытаюсь сделать слишком много, но мне просто кажется, что код программной части пользовательского интерфейса — неподходящее место для sqldataadapter, и вместо этого он должен войти в мой класс доступа к базе данных. - person chiefanov; 27.05.2011
comment
Вы нашли лучший ответ? - person zawmn83; 01.08.2013

Если вы хотите получить данные обновления с помощью адаптера sql-data, вы можете использовать эти

Использование System.Data.SqlClient;

        SqlConnection con = new SqlConnection("Data Source=abcd-pc;Initial Catalog=user_info;Integrated Security=True");
        SqlDataAdapter da = new SqlDataAdapter();
        try
        {

            da.UpdateCommand = new SqlCommand("Update logindemo set password=@pswd where username=@uname",con);
            da.UpdateCommand.Parameters.Add("@pswd", SqlDbType.VarChar).Value = txtpass.Text;
            da.UpdateCommand.Parameters.Add("@uname", SqlDbType.VarChar).Value = txtusername.Text;
            con.Open();
            da.UpdateCommand.ExecuteNonQuery();
            Label1.Text = "Data Updated";
            con.Close();

        }
        catch
        {
            Label1.Text = "Unable To Connect";
        }

Надеюсь, вы понимаете, как легко обновлять данные. Это как пример. Вы можете использовать этот тип примера в разделе «Вставка в данные» и «Удаление данных» с использованием конкретной команды и SQL-запроса по мере необходимости.

person Mitul Patel    schedule 02.02.2012