Работа с бд в php, asp, asp.net и т.п.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by masbear, 6 Aug 2008.

  1. masbear

    masbear Elder - Старейшина

    Joined:
    4 Aug 2008
    Messages:
    81
    Likes Received:
    7
    Reputations:
    1
    Меня вот очень интересует, можно ли использовать текстовые файлы вместо бд. Вот пример на C#
    ...
    StreamReader sr = new StreamReader("db.txt");
    ...
    Здесь меня больше всего интересует следуещее: что произойдет, когда много людей-посетителей сайта обратятся к текстовому файлу, будут создаваться потоки, и по идее должно произойти что-то страшное. Но нет, у меня на сайте так работает гостевая книга (стырил пример из книги), вроде никаких сбоев не было.
    Ведь по идее бд - те же текстовые файлы, и к ним тоже одновременно обращается много людей.
     
  2. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    При чтении ничего страшного не произойдет...

    незнаю как подробно организованна запись в asp.net ,
    имхо было бы разумно, организовать поочередную запись в файл...
    если вот имхо писать аналогично например на Си & WinAPI , то можно было бы например через api блокировать файл на запись(аля FILE_SHARE_READ) при записи в него и разблокировать сразу после записи , а перед попыткой записать делать проверку не заблокирован ли он на запись др процессом, если занят, то слип милисек(и приэтом надо учеть что содержимое файла изменилось), и снова проверку...
    канешн кривой вариант, тк имхо в .net наверняка уже реализованно нечто подобное...
     
  3. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    вот только БД умная )).

    это сколько?

    А вообще делается это так. Выделяешь объект, который умеет работать с данными. Это DAO - data access object. Там вся информация о местоположении данных, например, настройки БД. Все операции с данными только через него. Больше никакая часть программы не знает как взять данные. К этому DAO обращаются другие твои объекты - из следующего уровня - уровня логики твоего приложения - говорят DAO - дай мне объект - DAO связывается с БД и возвращает объект/производит действие какое-то. Так вот синхронизация данных осуществляется как раз при помощи этого DAO. Если рассматривать на примитивном уровне - то это всякие synchronized методы. шаблон singleton так же в помощь. На более высоком уровне - это уже работа с бд, где она сама синхронизирует данные и разработчику нужно следить только за кол-вом одновременных подключений к базе данных - у бд оно ограничено - надо ограничивать и со стороны приложения, чтобы все не падало(я про пул коннектеров). Ну а если рассматривать на совсем нормальном уровне - то юзаешь фрэймворк, который закрывает от тебя всю работу с бд =)). Например, hibernate.
     
    3 people like this.
  4. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    лучше не просто текстовый а xml.
     
  5. masbear

    masbear Elder - Старейшина

    Joined:
    4 Aug 2008
    Messages:
    81
    Likes Received:
    7
    Reputations:
    1
    вобщем как я понял, можно юзать текстовые файлы. ура!!!
    не знаю как в php, но в asp net очень муторно работать с бд
    вот пример инициализации простейшей бд

    Code:
    private static OleDbConnection con = null;
        private static OleDbCommand selectCommand = null;
        private static OleDbCommand updateCommand = null;
        private static OleDbCommand deleteCommand = null;
        private static OleDbCommand insertCommand = null;
        private static OleDbDataAdapter adapter = null;
        public  static DataSet ds = null;
    
    
        /// <summary>
        /// Загрузка базы данных
        /// </summary>
        public static void LoadData(string path)
        {
            con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + path);
    
            selectCommand = new OleDbCommand("SELECT * FROM MainTable", con);
    
            insertCommand = new OleDbCommand("INSERT INTO `MainTable` (`Number`, `Nick`, `Password`, `Mail`, `WMZ`, `Referer`, `Level`, `Money`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", con);
            insertCommand.Parameters.AddRange(new OleDbParameter[] {
                new OleDbParameter("Number", OleDbType.Integer, 0, "Number"),
                new OleDbParameter("Nick", OleDbType.VarWChar, 0, "Nick"),
                new OleDbParameter("Password", OleDbType.VarWChar, 0, "Password"),
                new OleDbParameter("Mail", OleDbType.VarWChar, 0, "Mail"),
                new OleDbParameter("WMZ", OleDbType.VarWChar, 0, "WMZ"),
                new OleDbParameter("Referer", OleDbType.VarWChar, 0, "Referer"),
                new OleDbParameter("Level", OleDbType.Integer, 0, "Level"),
                new OleDbParameter("Money", OleDbType.Integer, 0, "Money")});
    
            updateCommand = new OleDbCommand("UPDATE `MainTable` SET `Number` = ?, `Nick` = ?, `Password` = ?, `Mail` = ?, `WMZ` = ?, `Referer` = ?, `Level` = ?, `Money` = ? WHERE ((`Number` = ?) AND ((? = 1 AND `Nick` IS NULL) OR (`Nick` = ?)) AND ((? = 1 AND `Password` IS NULL) OR (`Password` = ?)) AND ((? = 1 AND `Mail` IS NULL) OR (`Mail` = ?)) AND ((? = 1 AND `WMZ` IS NULL) OR (`WMZ` = ?)) AND ((? = 1 AND `Referer` IS NULL) OR (`Referer` = ?)) AND ((? = 1 AND `Level` IS NULL) OR (`Level` = ?)) AND ((? = 1 AND `Money` IS NULL) OR (`Money` = ?)))", con);
            updateCommand.Parameters.AddRange(new OleDbParameter[] {
                new OleDbParameter("Number", OleDbType.Integer, 0, "Number"),
                new OleDbParameter("Nick", OleDbType.VarWChar, 0, "Nick"),
                new OleDbParameter("Password", OleDbType.VarWChar, 0, "Password"),
                new OleDbParameter("Mail", OleDbType.VarWChar, 0, "Mail"),
                new OleDbParameter("WMZ", OleDbType.VarWChar, 0, "WMZ"),
                new OleDbParameter("Referer", OleDbType.VarWChar, 0, "Referer"),
                new OleDbParameter("Level", OleDbType.Integer, 0, "Level"),
                new OleDbParameter("Money", OleDbType.Integer, 0, "Money"),
                new OleDbParameter("Original_Number", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Number", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Nick", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Nick", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Nick", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Nick", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Password", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Password", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Password", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Password", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Mail", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Mail", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Mail", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Mail", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_WMZ", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "WMZ", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_WMZ", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "WMZ", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Referer", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Referer", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Referer", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Referer", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Level", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Level", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Level", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Level", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Money", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Money", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Money", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Money", DataRowVersion.Original, null)});
    
    
            deleteCommand = new OleDbCommand("DELETE FROM `MainTable` WHERE ((`Number` = ?) AND ((? = 1 AND `Nick` IS NULL) OR (`Nick` = ?)) AND ((? = 1 AND `Password` IS NULL) OR (`Password` = ?)) AND ((? = 1 AND `Mail` IS NULL) OR (`Mail` = ?)) AND ((? = 1 AND `WMZ` IS NULL) OR (`WMZ` = ?)) AND ((? = 1 AND `Referer` IS NULL) OR (`Referer` = ?)) AND ((? = 1 AND `Level` IS NULL) OR (`Level` = ?)) AND ((? = 1 AND `Money` IS NULL) OR (`Money` = ?)))", con);
            deleteCommand.Parameters.AddRange(new OleDbParameter[] {
                new OleDbParameter("Original_Number", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Number", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Nick", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Nick", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Nick", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Nick", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Password", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Password", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Password", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Password", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Mail", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Mail", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Mail", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Mail", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_WMZ", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "WMZ", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_WMZ", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "WMZ", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Referer", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Referer", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Referer", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Referer", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Level", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Level", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Level", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Level", DataRowVersion.Original, null),
                new OleDbParameter("IsNull_Money", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Money", DataRowVersion.Original, true, null),
                new OleDbParameter("Original_Money", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Money", DataRowVersion.Original, null)});
    
            adapter = new OleDbDataAdapter(selectCommand);
            adapter.DeleteCommand = deleteCommand;
            adapter.InsertCommand = insertCommand;
            adapter.UpdateCommand = updateCommand;
            adapter.TableMappings.AddRange(new DataTableMapping[] {
                new DataTableMapping("Table", "MainTable", new DataColumnMapping[] {
                            new DataColumnMapping("Number", "Number"),
                            new DataColumnMapping("Nick", "Nick"),
                            new DataColumnMapping("Password", "Password"),
                            new DataColumnMapping("Mail", "Mail"),
                            new DataColumnMapping("WMZ", "WMZ"),
                            new DataColumnMapping("Referer", "Referer"),
                            new DataColumnMapping("Level", "Level"),
                            new DataColumnMapping("Money", "Money")})});
    
    
            ds = new DataSet();
            adapter.Fill(ds, "MainTable");
    
    xml тоже хорошая тема, но для больших бд он имхо не подойдет, т.к. только на теги уйдет много килобайт.
     
  6. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    муахахаха!
    А как же оптимизация/синхронизация/серверные фичи?))

    Бред, кури доки по ASP.NET, а пример этот левый )