четверг, 18 октября 2012 г.

NEW DbfFieldType USING EVAL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WhitePage.Data;
namespace TestDbfRecord
{
  class Program
  {
    static void Main(string[] args)
    {
      //NEW DbfFieldType
      //USING  EVAL
      //create table
      List<DbfFieldInfo> fields = new List<DbfFieldInfo>();

      fields.Add( new DbfFieldInfo("nickname", DbfFieldType.Character ,100 ));
      fields.Add( new DbfFieldInfo("note", DbfFieldType.Memo, 0));
      fields.Add(new DbfFieldInfo("DT", 'D', 8, 0));
      fields.Add(new DbfFieldInfo("NUM", 'N', 6, 2));
      fields.Add(new DbfFieldInfo("LOGI", 'L', 1, 0));

      DbfFieldInfo field = new DbfFieldInfo();
      field = new DbfFieldInfo();
      field.Name = "note";
      field.Type = DbfFieldType.Memo;
      fields.Add(field);

      string file = AppDomain.CurrentDomain.BaseDirectory +"\\demo.dbf";
      using (DbfRecordset rs = DbfRecordset.Create(file, fields))
      {
        eval(rs, "iif(1+1 > 2 , .T. , .F.)");
        eval(rs, ".t. and .t.");
        eval(rs, ".t. .and. .t.");
        eval(rs, ".t. .or. .F.");
        eval(rs, "-1");
        eval(rs, "--1");
        eval(rs, "---1");
        eval(rs, "----1 + -2");
        eval(rs, "! .t. ");
        eval(rs, "not .t. ");
        eval(rs, ".not. .t. ");
        eval(rs, "'abc' == 'abc'");
        eval(rs, "'abc' == 'ab'");
        eval(rs, "'abc' > 'ab'");
        eval(rs, " 200.92 >= 1000.23433");
        eval(rs, " 200.92 != 1000.23433");
        eval(rs, " 'nick' $ 'i'");
        eval(rs, " 'i' $ 'nick'");
        eval(rs, "UPPER('qwerty')");
        eval(rs, "str(100.23) + str(12.34)");
        eval(rs, "'[' + str(12.344, 10) + ']'");
        eval(rs, "'[' + str(12.344, 10,2) + ']'");
        eval(rs, "right('1234567',3)");
        eval(rs, "left('1234567',3)");
        eval(rs, "QUARTER(CTOD('11/12/2012'),1)");
        eval(rs, "day(CTOD('11/12/2012'))");
        eval(rs, "month(CTOD('11/12/2012'))");
        eval(rs, "CTOD('11/12/2012')");
        eval(rs, "STOD('20120131')");
        eval(rs, "empty('20120131')");
        eval(rs, "empty('')");
        eval(rs, "trim(' rwytuwyrt   ')");
        eval(rs, "ltrim(' rwytuwyrt   ')");
        eval(rs, "alltrim(' rwytuwyrt   ')");
        eval(rs, "'[' + padR('123',10) + ']'");
        eval(rs, "'[' + padR('123',10,'W') + ']'");
        eval(rs, "'[' + padL('123',10) + ']'");
        eval(rs, "'[' + padL('123',10,'W') + ']'");
        eval(rs, "soundex('word')");
        eval(rs, "len('word')");
        eval(rs, "val('12.34')");
        eval(rs, "abs(-12.34)");
        Random ran = new Random(1000);
        int recCount = 10;
       
        for (int i = 1; i <= recCount; i++)
        {
          int id = ran.Next(0,1000);
          string nick = "Jon ID :" +  id.ToString();
          System.Diagnostics.Debug.Print(nick);
          rs.AddNew(); // append black
          rs["nickname"] = nick;
          rs.Update(); // commit changes
        }
        rs.ForEach(r =>
          {
            eval(r, "substr(nickname,2,2) + upper(nickname)");
            return false; // only once
          });
        rs.Close();
      }
    }
    static void eval(DbfRecordset rs, string expr)
    {
      object value = rs.Eval(expr);
      System.Diagnostics.Debug.Print( expr + " : " + value.ToString()  );
    }
  }
}

среда, 17 октября 2012 г.

USING MEMO (DBT) and ForEach

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WhitePage.Data;

namespace TestDbfRecord
{
  class Program
  {
    static void Main(string[] args)
    {
      //USING  MEMO (DBT) and ForEach
      //create table
      List<DbFieldInfo> fields = new List<DbFieldInfo>();
      DbFieldInfo field = new DbFieldInfo();
      field.Name = "nickname";
      field.Type = 'C';
      field.Len = 100;
      fields.Add(field);
      field = new DbFieldInfo();
      field.Name = "note";
      field.Type = 'M';
      fields.Add(field);

      string file = AppDomain.CurrentDomain.BaseDirectory +"\\demo.dbf";
      using (DbfRecordset rs = DbfRecordset.Create(file, fields))
      {
        Random ran = new Random(1000);
        int recCount = 10;
       
        for (int i = 1; i <= recCount; i++)
        {
          int id = ran.Next(0,1000);
          string nick = "Jon ID :" +  id.ToString();
          System.Diagnostics.Debug.Print(nick);
          rs.AddNew(); // append black
          rs["nickname"] = nick;
          rs["note"] = @"
fsog[apiofsdug[ opiug oiuergpo
e prioue[u[etguo[ieutg[oitroieutoi ogjdf;lkjg;lkdsf
dsopfgih[posdi h[podigh[psodgih
sdgoih[posdgihpo";
          rs.Update(); // commit changes
        }
        rs.ForEach(r =>
          {
            System.Diagnostics.Debug.Print(rs["nickname"].ToString());
            System.Diagnostics.Debug.Print(rs["note"].ToString());
            return true;
          });
        rs.Close();
      }
    }
  }
}

First Demo Using Of DBF CDX.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WhitePage.Data;
namespace TestDbfRecord
{
  class Program
  {
    static void Main(string[] args)
    {
      //create table
      List<DbFieldInfo> fields = new List<DbFieldInfo>();
      DbFieldInfo field = new DbFieldInfo();
      field.Name = "nickname";
      field.Type = 'C';
      field.Len = 100;
      fields.Add(field);
      field = new DbFieldInfo();
      field.Name = "dt";
      field.Type = 'D';
      fields.Add(field);

      string file = AppDomain.CurrentDomain.BaseDirectory +"\\demo.dbf";
      using (DbfRecordset rs = DbfRecordset.Create(file, fields))
      {
        rs.CreateIndex("inick", "nickname", null);
        rs.CreateIndex("idt", "dt", null);
        Random ran = new Random(1000);
        int recCount = 10;
       
        for (int i = 1; i <= recCount; i++)
        {
          int days = ran.Next(0,1000);
          string nick = "Jon:" +  days.ToString();
          System.Diagnostics.Debug.Print(nick);
          rs.AddNew(); // append black
          rs["nickname"] = nick;
          rs["dt"] = DateTime.Now.AddDays(days);
          rs.Update(); // commit changes
        }
        // aplay index tag inick - sorted by nickname
        rs.Index = "inick";
        System.Diagnostics.Debug.Print("--- sorted by nickname ----");
        rs.MoveFirst();
        while (!rs.Eof)
        {
          System.Diagnostics.Debug.Print(rs["nickname"].ToString());
          rs.MoveNext();
        }
        rs.Index = "idt"; // aplay index tag idt
        System.Diagnostics.Debug.Print("--- sorted by nickname ----");
        rs.MoveFirst();
        while (!rs.Eof)
        {
          System.Diagnostics.Debug.Print(rs["nickname"].ToString() + " " +  rs["dt"].ToString());
          rs.MoveNext();
        }
        rs.Close();
      }
    }
  }
}

вторник, 16 октября 2012 г.

New Life of DBF file format. First article.

Hello to everyone. I developed "dll" to work with dbf file format that allows you to work with dbf files without VFPOLEDB provider and now you dont need to use ODBC driver. This utility is perfectly works at x64 OS. For first 100 customers it will costs just 1$. You can download trial version of the product from site  http://baybaksoft.ucoz.com/index/0-29

вторник, 3 апреля 2012 г.

Migrating from Visual Fox Pro to Sql Server. (Converting dbf to MS Sql Server etc) Second edition. Creating dbf file and editing data.

    Here is the example how we can easy create and edit data in our dbf file.  This dll was the basis for my "Dbf2Any" programm. Wich can convert dbf files to MS Sql Server, PostgreSql. At this moment at the work converting dbf to Oracle and MySql.
Here we will be using datagrid in virtual mode.
I think that this example is clear enough,  but if anyone will have questions please write me.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using  DbfCore;



string[] Fields = new string[] { "Fld1", "Fld2", "Fld3", "Fld4", "Fld5",
                                    "Fld6", "Fld7","Fld8", "Fld9", "Fld10" };


List<DbFieldInfo> fieldsList = new List<DbFieldInfo>();
    DbfRecordset _recSet;

    string fileName = Application.StartupPath + "\\test.dbf";


 private void OpenCreateRecordSet()
    {
      if (System.IO.File.Exists(fileName))
      {
        _recSet = new DbfRecordset(fileName);
        for (int i = 0; i < _recSet.FieldCount; i++)
        {
          this.dataGridView1.Columns.Add(_recSet.Fields[i].Name, _recSet.Fields[i].Name + " Type(" + _recSet.Fields[i].Type + ")");
        }
      }
      else
      {
        for (int i = 0; i < 10; i++)
        {
          DbFieldInfo dbFldInfo = new DbFieldInfo(Fields[i], 'C', 20);
          fieldsList.Add(dbFldInfo);
        }
        _recSet = DbfRecordset.Create(fileName, fieldsList);
      }
    }


private void SetupGrid()
    {
      if (_recSet == null)
      {
        return;
      }

      this.dataGridView1.RowCount = _recSet.RecordCount;
      this.dataGridView1.CellValueNeeded += new DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);    
      this.dataGridView1.CellValuePushed += new DataGridViewCellValueEventHandler(dataGridView1_CellValuePushed);
      this.dataGridView1.NewRowNeeded += new DataGridViewRowEventHandler(dataGridView1_NewRowNeeded);
    }


 void dataGridView1_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
    {
      _recSet.Move(e.RowIndex + 1);
      _recSet.Edit();
      _recSet[e.ColumnIndex + 1] = e.Value;
      _recSet.Update();
    }

    void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
    {
      _recSet.Move(e.RowIndex + 1);
      if (_recSet.Fields[e.ColumnIndex].Type == 'C')
      {
        e.Value = _recSet[e.ColumnIndex + 1].ToString().Trim();
      }
      else
      {
        e.Value = _recSet[e.ColumnIndex  + 1];
      }
    }


 private void btnAddRecord_Click(object sender, EventArgs e)
    {
      _recSet.AddNew();
      _recSet.Update();
      this.dataGridView1.RowCount = _recSet.RecordCount;
    }





среда, 28 марта 2012 г.

Migrating from Visual Fox Pro to Sql Server. (Converting dbf to MS Sql Server etc))


Hello to everyone again. Today I will start new posts, with beautifull name "Migrating from VFP to MS SQL Server etc".
 Many years ago I was need to migrate from dbf format to MS Sql Server and PostgreSQL. I'm made some researches. After that I  wrote utility that uses VFPOLEDB Provider and everything worked fine, to the moment when 64 bit system began to appear. So I was need to find new solution. Because this proveder works very bad under the 64 bit systems. So I created my own dll, that allows you to View, Manage, work with Indexes (full work with dbf). At the next posts I will show to you how it works.

вторник, 20 марта 2012 г.

Transfering schema and data (SQL Server ), without SMO. Using only System.Data.SqlClient. Second part (Transfering data)



Hello to everyone. Here is the second part of our transfer methods without using SMO dlls.
I have new speed results. Something around 15 seconds. It's faster than previous method (using SMO which was 31 second). If you will have any questions please add comments or send me email. At next post I will write about migration data and structures from DBF  to the SQL Server. (x64 full support) Thanks.


 private void TestFunction2(string dbNameFrom, string dbNameTo)
    {
      string cnnString = "server=" + Server + ";user id=" + UserId
            + ";password=" + Password + ";Initial Catalog = " + dbNameFrom
            + ";Connect Timeout=30;Integrated Security=False;";

      DataTable tbData = null;
      using (System.Data.SqlClient.SqlConnection cnn = new System.Data.SqlClient.SqlConnection(cnnString))
      {
        cnn.Open();
        for (int i = 0; i < dataTables.Length; i++)
        {
          string tbName = dataTables[i];
          string cmdText = " select * from " + tbName;
          tbData = new DataTable(tbName);
          using (System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmdText, cnn))
          {
            adapter.Fill(tbData);
          }       
          Insertrecord(tbData, dbNameTo);
          tbData = null;
        }
      }
    }



private void Insertrecord(DataTable tb, string dbNameTo)
    {
      string cnnStringTo = "server=" + Server + ";user id=" + UserId
            + ";password=" + Password + ";Initial Catalog = " + dbNameTo
            + ";Connect Timeout=30;Integrated Security=False;";

          using (System.Data.SqlClient.SqlConnection cnnTo = new System.Data.SqlClient.SqlConnection(cnnStringTo))
          {
            cnnTo.Open();

            string ccm = "delete from "+ tb.TableName;
            using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(ccm, cnnTo))
            {
              int result = cmd.ExecuteNonQuery();
              string rr = "";
              GenerateInsertStatement(ref rr, tb);
              cmd.CommandText = rr;
              for (int j = 0; j < tb.Rows.Count; j++)
              {
                for (int i = 0; i < tb.Columns.Count; i++)
                {
                  object val = tb.Rows[j][i];
                  cmd.Parameters.AddWithValue("@" + tb.Columns[i].ColumnName, val);
                }
                int res = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
              }
             
            }
          }    
    }

четверг, 15 марта 2012 г.

Transfering schema and data (SQL Server ), without SMO. Using only System.Data.SqlClient. First part (Transfering schemas)

   Hello to everybody, again. Today I will post the example of how we can transfering schema without using SMO(SqlServer).

   You can ask "man why this post in English? Your english is awful". And I can answer to you people : "I want to practice in it". So, let's begin.



 private void TestFunction(string dbNameFrom, string dbNameTo)
    {
      string cnnString = "server=" + Server + ";user id=" + UserId
            + ";password=" + Password + ";Initial Catalog = " + dbNameFrom
            + ";Connect Timeout=30;Integrated Security=False;";  // for exaple

      using (System.Data.SqlClient.SqlConnection cnn = new      System.Data.SqlClient.SqlConnection(cnnString))
      {
        cnn.Open();

        for (int i = 0; i < schemaTables.Length; i++)
        {
          string tbName = schemaTables[i];
          string[] schemaCondition = { null, null, tbName };
          DataTable tbFrom = cnn.GetSchema("Columns", schemaCondition);
          DataTable tbTo = null;

          string cnnStringTo = "server=" + Server + ";user id=" + UserId
            + ";password=" + Password + ";Initial Catalog = " + dbNameTo
            + ";Connect Timeout=30;Integrated Security=False;";

          using (System.Data.SqlClient.SqlConnection cnnTo = new System.Data.SqlClient.SqlConnection(cnnStringTo))
          {
            cnnTo.Open();
            string[] schemaConditionTo = { null, null, tbName };
            tbTo = cnnTo.GetSchema("Columns", schemaConditionTo);
          }

          AlterTable(tbFrom, tbTo, tbName, dbNameTo); // at this function we will be altering our table
        }     

        // insert data function will be here
        //for (int i = 0; i < dataTables.Length; i++)
        //{
             // TODO at next post
        //}
      }
    }



private void AlterTable(DataTable tbFrom, DataTable tbTo, string tbName, string dbNameTo)
    {
      string sqlStatement = "";
      string colName = "";
      string colDataType = "";
      string val = "";

      for (int i = 0; i <  tbFrom.Rows.Count; i++)
      {
        DataRow r =  tbFrom Rows[i];
        colName = r["Column_Name"].ToString();
        if(ColumnExists(colName, tbTo))
        {
          continue;
        }
        sqlStatement = "ALTER TABLE [dbo].[" + tbName + "] ADD ";
        colDataType = r["Data_Type"].ToString();
        GetLength(colDataType, ref val, r);
        sqlStatement += colName + " " + colDataType + val;
       

      // You can use connection from the previos method. Decided to make a new connection.
     // Only God will judge me.)


        string cnnStringTo = "server=" + Server + ";user id=" + UserId
            + ";password=" + Password + ";Initial Catalog = " + dbNameTo
            + ";Connect Timeout=30;Integrated Security=False;";

        using (System.Data.SqlClient.SqlConnection cnnTo = new System.Data.SqlClient.SqlConnection(cnnStringTo))
        {
          cnnTo.Open();
          System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sqlStatement, cnnTo);
          cmd.ExecuteNonQuery();
          sqlStatement = "";

        }
      }    
    }


private void GetLength(string type, ref string val, DataRow r)
    {
      val = "";
      switch (type)
      {
        case "varchar":
          val = "(" + r["Character_Maximum_Length"].ToString() + ")"; // for example
          break;
        case "float":
          break;  // and so on
        case "int":
          break;
        case "datetime":        
          break;   // and so on
        case "bit":
          break; // and so on
      }
     // Here perhaps, you will be adding "allow nulls" property or not. I don't need it.
    }





For this moment I dont know exactly how fast is this function work's. Perhaps tomorrow, I will post the speed, of altering at the "Transfer Data" post.
Thank's to all, who is reading my post's. And for the other people, you dont miss nothing.


среда, 14 марта 2012 г.

Не о программировании, но про некие глюки с телефонами.

Ну так как блог предназначен для своих мыслей и всего остального что так сказать на ум пришло хочу поделиться своим опытом в решении одной проблемы с телефонами. Ну не все ж ведь о программировании говорить. Есть у меня телефончик Samsun Galaxy S i9003. Просто замечательный для меня да еще и приложения могу разрабатывать для Android ( дальше в тексту андруша). И вот в один довольно мрачный зимний вечер набираю я товарища (барабанная дробь), а вызов не идет. Сразу хочу сказать, что в настройках ничего не менял. Первое, что приходит обычно в голову человеку ну все таки я что то напортачил и надо бы сбросить все настройки до заводских. Но так как уже имел опыт сброса, после которого оказалось что коли ты сбросил настройки то и запись под аккаунт удалилась и все что ты скачивал под своего андрушу тоже исчезло. Скажу честно разбираться в причинах почему так все лихо гухнулось не стал. Ну зайду еще раз да скачаю. Ну да ладно, не о мне лентяя речь.
   Долго рылся в настройках и обнаружилась одна вещь. По пути в телефоне
Настройки -> Вызовы -> Все вызовы - > Показывать мой номер установлено значение "Скрыть".

 Поменяв его на "По умолчанию" мой андруша снова ожил и стал дозваниваться до нужных мне людей. Возможно вам это поможет в решении подобной проблемы. Если что был рад помочь.

P.S Кстати до не нужных людей тоже стал дозваниваться. (Черный список не признаю)

Starting developing on Macintosh, using XCode. First edition.

Немного про себя. Четыре года программирую приложения под Windows  и тут вдруг, словно гром среди ясного неба, попалась мне книженция по Objective C. Да и чего греха таить нарвался я на товарищей из стран заморских и диковенных (местами даже диких). И вот написал мне, на папирусе тонком да на жидкокристаллическом пергаменте просматриваемом, их PM, что готов он мне тестовое задание дать, дабы удостовериться так сказать в моих возможностях.  Ну посмотрим прямо, ничего сверхсложного в этом objective C нет. Тем так сказать кто пописывал на С или С++ въехать не составит большого труда.

   В следующем цикле статей собираюсь приводить некоторые примеры на Objective C в контексте написания полноценного приложения.

   Очень важный аспект разработки под Макоси - это освоить XCode. Хотя на первых парах я постараюсь описывать действия необходимые для работы в этом чудесном IDE. (заметьте "чудесном" без кавычек).

Interesting thing about "for" cicle in C#. (Perhaps you dont know)


We have class Shape, that has only two properties (int CoordC, int CoordY).
And we have List<Shape>.

Next step
Two test functions like:

public void TestFunc1()
{
   int count = shapes.Count;
  string result = "";
      for (int i = 0; i < count; i++)
      {
        result += "Shape " + i + shapes[i].CoordX.ToString() + "\r\n";
      }
}

public void TestFunc2()
{

      string result = "";
      for (int i = 0; i < shapes.Count; i++)
      {
        result += "Shape " + i + shapes[i].CoordX.ToString() + "\r\n";
      }

}


Lets play the game? Why TestFunc2 will be faster? Count, of List items, doesnt matter.


вторник, 13 марта 2012 г.

Transfer data an schema using SMO, but without "Transfer" class. More faster method I hope. Using Scripter Using Scripter instead.

Ну вот и получилось решение вопроса Transfer - а. При котором вам не потребуется наличие Integration Services установленного на вашем ПК. Что хотелось бы особо отметить в сравнении с предыдущим примером (Использование Transfer класса) данный способ работает в два раза быстрее. Хотя данные показатели могут разниться и утверждать, что "Wow" это просто чумовой прирост скорости трансфера данных, но таких громких заявлений делать не буду. Хотелось бы конечно по поводу скорости получить ваши комментарии. Так вот сам способ (количество таблиц оставляем тоже и задача ставится такая же).

private void TransferSchemaAndData()
{

         DataTable dataTable = db.EnumObjects(DatabaseObjectTypes.Table);
        List<Microsoft.SqlServer.Management.Sdk.Sfc.Urn> listSchema = new List<Microsoft.SqlServer.Management.Sdk.Sfc.Urn>();
        List<Microsoft.SqlServer.Management.Sdk.Sfc.Urn> listData = new List<Microsoft.SqlServer.Management.Sdk.Sfc.Urn>();

         FillLists (listSchema, listData, dataTable);      

        string PathToFile = Path.GetTempPath() + "\\SomeTransferPackageName.sql";
        Scripter scripter = new Scripter();
        SettingUpScripter(ref scripter, srv, PathToFile);
     
        Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] urr = listSchema.ToArray();
        scripter.Script(urr);

        StreamReader rd = new StreamReader(PathToFile);
        string script = rd.ReadToEnd();

        Database toDb = srv.Databases[toDbName];
        DropTransferedTables(toDb);

        toDb.ExecuteNonQuery(script);
        rd.Close();
        listSchema.Clear();

        scripter.Options.ScriptSchema = false;
        scripter.Options.ScriptData = true;              
     
        urr = listData.ToArray();
        scripter.EnumScript(urr);      

         rd = new StreamReader(PathToFile);
         script = rd.ReadToEnd();

         ClearData(toDb);

         toDb.ExecuteNonQuery(script);
         rd.Close();
         listData.Clear();

         if (File.Exists(PathToFile))
         {
           File.Delete(PathToFile);
         }      
}

private void  FillLists(List<Microsoft.SqlServer.Management.Sdk.Sfc.Urn> listSchema, List<Microsoft.SqlServer.Management.Sdk.Sfc.Urn> listData, DataTable dataTable)
{
   foreach (System.Data.DataRow row in dataTable.Rows)
      {
        string tbName = row["Name"].ToString();
        if (IsDataTableThatWeNeed(tbName))
        {
          listData.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(row["Urn"].ToString()));
        }
        else if (IsSchemaTableThatWeNeed(tbName))
        {
          listSchema.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(row["Urn"].ToString()));
        }
      }
}



private void SettingUpScripter(ref Scripter scripter, Server srv, string PathToFile)
    {
      scripter.Server = srv;
      scripter.Options.IncludeHeaders = true;
      scripter.Options.SchemaQualify = true;
      scripter.Options.SchemaQualifyForeignKeysReferences = true;
      scripter.Options.NoCollation = true;
      scripter.Options.DriAllConstraints = true;
      scripter.Options.DriAll = true;
      scripter.Options.DriAllKeys = true;
      scripter.Options.DriIndexes = true;
      scripter.Options.ClusteredIndexes = true;
      scripter.Options.NonClusteredIndexes = true;
      scripter.Options.ToFileOnly = true;
      scripter.Options.ScriptData = false;
      scripter.Options.ScriptSchema = true;
      scripter.Options.FileName = PathToFile;
    }


Пока код не оптимизировался , так сказать первый набросок. В следующем посте расскажу по поводу некоторых функций который здесь использовались а так же опишу возникающие затруднения. В частности почему именно Microsoft.SqlServer.Management.Sdk.Sfc.Urn. А не просто Urn.

понедельник, 12 марта 2012 г.

SMO (SQL Server) for everyone

Ну дак вот со времени моего последнего поста прошло около 5 часов и кажется целые сутки серфинга в интернете. В результате чего все таки пришел к выводу, который звучит приблизительно так " Почему бы не написать свою dll - шку для общечеловеческого пользования ей.". Завтра планирую выложить  ее исходники. Все таки ставить Integration Services совсем не хочется ибо как то это громоздко для такой задачки.  Кстати у кого по этому поводу есть соображения или же предложения прошу поделиться. Возможно кто то нашел решение как использовать SMO без инсталляции Services.

some stuff with SMO and Integration Services.

И вот наступил следующий этап моих странствований по чудному и полному тайн миру SMO библиотек. Поставил я себе задачу, которая заключается в удаленном управлении сервером(управление  базами данных, создании таблиц и так далее), но как всегда есть одно маленькое НО. На машине на которой устанавливается приложение не установлен SQL Server.
Сразу небольшая оговорка ВСЕ ниже перечисленные dll все таки придется где то взять на сколько мне известно все эти dll - ки можно использовать для коммерческого использования.
Поясню. В referances прицеплены все необходимые dll и они же и используются(сразу дабы отсечь умников, которые бы сказали ну так ты их прицепил а вот используешь совсем не те).
Вот список этих dll
Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoExtended

Так что тут все в норме. Так запустив приложение натыкаемся на такую вот ошибку
The Integration Services component is not installed  or you do not have permission to use it.
Ошибка понятна и прозрачна. Возникает из за того что при вызове метода TransferData() идет загрузка такой вот штуки Microsoft.SqlServer.DtsTransferProvider, Microsoft.SQLServer.DTSRuntimeWrap.dll,
Microsoft.SQLServer.ManagedDTS.dll  и еще несколько других dll которые регестрятся в GAC при установке Integration Services.
 И вот вы потратив пару десятков минут и прицепив все необходимые dll получаете, что то вроде
этого:


 "An Integration Services class cannot be found. Make sure that Integration Services is
  correctly installed on the computer that is running the application. Also, make sure that the 64-bit version
  of Integration Services is installed if you are running a 64-bit application. "



Integration Services НАДО СТАВИТЬ. Что с моей точки зрения немного не удобно для разработчиков. Проблему можно попробовать решить при помощи выполнения удаленных Package - ей, что не совсем то, что хотелось. В следующем посте расскажу каким образом будем выкручиваться из сложившихся, сжимающих нас рамок.  

SMO (SQL Server) how to use "Transfer" class to transfer datas and schemas. I hope it would be helpfull.

Доброго времени суток. Вот Сейчас представлю реальный пример работы с классом C# Transfer.
Смысл заключается в трансфере сначала одного набора объектов (только структуры таблиц ), после чего трансферится и структуры и данные. Довольно удобная штука если вам необходимо используя SMO выполнить трансфер с одного сервера на другой или же выполнить трансфер в рамках одного сервера. И так код:


 public void CopyDbStruct(string fromDbName, string toDbName)
    {
      string[] dataTables = new string[] { "Table1", " Table2 ", " Table3 ", " Table4 ",  " Table5 ", " Table6 ", " Table7 ", " Table8 " };
      string[] schemaTables = new string[] {
                                            "TableSch1", " TableSch2", " TableSch3", " TableSch4"," TableSch5 ",
                                            "TableSch6", " TableSch7", " TableSch8", " TableSch9",
                                            " TableSch10", " TableSch11", " TableSch12", " TableSch13",
                                            " TableSch14", " TableSch15", " TableSch16", " TableSch17",
                                            " TableSch18", " TableSch19", " TableSch20", " TableSch21",
                                            " TableSch22", " TableSch23", " TableSch24"
                                            };        
   
   
      Server srv = new Server("Earth\\SQLSERVER");    
      srv.ConnectionContext.LoginSecure = false;
      srv.ConnectionContext.Login = UserName;
      srv.ConnectionContext.Password = Password;


      Database db = srv.Databases[fromDbName];
      if (db != null)
      {
        Transfer tr = new Transfer(db);
        tr.CopyAllObjects = false;
        tr.CopyAllTables = false;
        tr.DestinationServer = srv.Name;
        tr.DestinationDatabase = toDbName;
        tr.Options.IncludeIfNotExists = true;
        tr.CopySchema = true;
        tr.CopyData = false;
        tr.DestinationLoginSecure = false;
        tr.DestinationLogin = UserName;
        tr.DestinationPassword = Password;
        tr.DropDestinationObjectsFirst = true;
       // заполняем ObjectList таблицами из которых мы хотим переместить только схему
        for (int i = 0; i < schemaTables.Length; i++)
        {        
          tr.ObjectList.Add(db.Tables[schemaTables[i]]);
        }

        tr.TransferData(); // выполняем трансфер
        tr.ObjectList.Clear(); // после чего очищаем список ObjectList для последующего добавление в него других данных.
   
        tr.CopyData = true; // оба эти флага говорят что переносить будем и схему и структуру
        tr.CopySchema = true;
       // заполняем ObjectList таблицами из которых мы хотим переместить и схему и данные
        for (int i = 0; i < dataTables.Length; i++)
        {
          tr.ObjectList.Add(db.Tables[dataTables[i]]);
        }
        tr.TransferData(); // и теперь уже заливаем в нужную на базу таблицы с данными.
      }
}

Способ проверен в реальной ситуации, на реальных таблицах. Сразу приготовьтесь к тому что этот процесс займет некоторое время.

суббота, 10 марта 2012 г.

My first steps in blogging. Second edition.

Всем доброго времени суток. Как то по работе попалась задача осуществить Transfer данных из одного набора таблиц в другую базу. Что хотелось бы сказать относитесь к мелочам со всей тщательностью как говорит мой учитель и главный наставник моей жизни. Потому как обычно все проблемы кроются в вашей не внимательности. 

My first steps in blogging. First edition.

Всем доброго времени суток. Ни для кого не секрет что первый способ решения проблем програмирования это прильнуть к кружечке холодного пива. ) А дальше я готов поделиться всем что знаю а так же спросить у вас  то что не знаю. Вперед мои кибернетические товарищи.